Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.51 KB | None | 0 0
  1. /*
  2. * main.c
  3. *
  4. * Created on: 24-11-2015
  5. * Author: Grzegorz_K
  6. */
  7.  
  8.  
  9.  
  10. #include <avr/io.h>
  11. #include "LCD_graf.h"
  12. #include "aplikacje_rysujace.h"
  13. #include <stdio.h>
  14. #include <util/delay.h>
  15. #include <avr/interrupt.h>
  16. #include <stdlib.h>
  17.  
  18. #define key (1<<PB0)
  19.  
  20. #define UP 1
  21. #define RIGHT 2
  22. #define DOWN 3
  23. #define LEFT 4
  24.  
  25. typedef struct{
  26. int8_t x;
  27. int8_t y;
  28.  
  29. }Punkt;
  30.  
  31. typedef struct{
  32.  
  33. volatile Punkt *pos;
  34. Punkt kier;
  35. volatile uint8_t dir;
  36. uint8_t dl;
  37. volatile int8_t dead;
  38.  
  39. }Snake;
  40.  
  41. typedef struct{
  42.  
  43. volatile Punkt pos;
  44. volatile int8_t state;
  45.  
  46. }Food;
  47.  
  48. void CtrlSnake(Snake *snake);
  49. void SnakeMove(Snake *snake,uint8_t dir);
  50. void DrawSnake(Snake *snake);
  51. void SnakeCheck(Snake *snake);
  52. void SnakeGrow(Snake *snake);
  53.  
  54. void FoodDraw(Food *food);
  55. void FoodSet(Food *food,Snake *snake);
  56. void FoodCheck(Food *food,Snake *snake);
  57.  
  58. volatile int8_t kierX=1; // jedynka - prawo zero - lewo
  59. volatile int8_t kierY=-1; // jeydnka -dol zero -gora
  60. volatile uint8_t refresh=1;
  61. volatile Punkt losowe;
  62.  
  63. int main(void)
  64. {
  65.  
  66. TCCR0 |= (1<<CS02)|(1<<CS00) ;
  67. TIMSK |= (1 << TOIE0);
  68.  
  69. //timer1 16bitowy do odmierzania czasu
  70. TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
  71. OCR1A = 7813/8; // Ustawia wartosc pozadana na 1Hz dla preskalera 1024- 1 sekunda i np /200 czyli mamy 200 hz
  72. TCCR1B |= (1 << CS12) | (1<<CS10) ; // Ustawia timer z preskalerem Fcpu/1024
  73. TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
  74. sei();
  75.  
  76.  
  77.  
  78. ///ADC
  79.  
  80. ADCSRA =(1<<ADEN)//włączenie przetwornika
  81. |(1<<ADPS2)|(1<<ADPS1);//preskaler 64
  82.  
  83. ADMUX =(0<<REFS1)|(1<<REFS0) ;//napiecie odniesienia VREF to zasilanie uC 5V
  84.  
  85. ////LCD
  86. lcdInit();
  87. lcdGraphicMode_On();
  88. lcdGCls();
  89.  
  90.  
  91.  
  92. Snake snake,*wsksnake=&snake;
  93. snake.dl=15;
  94.  
  95. snake.pos=calloc(snake.dl,sizeof(Punkt));
  96.  
  97. snake.pos[0].x=0;
  98. snake.pos[0].y=30;
  99. snake.kier.x=1;
  100. snake.kier.y=0;
  101. snake.dir=RIGHT;
  102.  
  103. snake.dead=0;
  104.  
  105. Food food,*wskfood=&food;
  106. //food.pos.x=losowe.x;
  107. //food.pos.y=losowe.y;
  108.  
  109.  
  110. FoodSet(wskfood,wsksnake);
  111. //
  112. while(!snake.dead)
  113. {
  114. CtrlSnake(wsksnake);
  115. FoodDraw(wskfood);
  116.  
  117. if(refresh)
  118. {
  119. refresh=0;
  120. SnakeMove(wsksnake,snake.dir);
  121. SnakeCheck(wsksnake);
  122. FoodCheck(wskfood,wsksnake);
  123.  
  124. if(!food.state)
  125. {
  126. FoodSet(wskfood,wsksnake);
  127. }
  128.  
  129. lcdGCls();
  130. DrawSnake(wsksnake);
  131.  
  132. }
  133.  
  134.  
  135. }
  136.  
  137. free((Punkt*)snake.pos);
  138.  
  139. }
  140.  
  141.  
  142.  
  143. ISR(TIMER0_OVF_vect )//obsluga joystika
  144. {
  145.  
  146.  
  147. uint8_t OsX;
  148. uint8_t OsY;
  149. //////odczytywanie pozycji joysticka
  150. /// os X
  151. ADMUX |= (1<<MUX2);
  152. ADMUX &=~(1<<MUX0);//wybor kanału
  153.  
  154. ADCSRA |= (1<<ADSC);
  155.  
  156. while(ADCSRA & (1<<ADSC));
  157.  
  158. OsX=ADC*5/1024;
  159.  
  160. /// os Y
  161.  
  162. ADMUX |= (1<<MUX2)|(1<<MUX0);//wybor kanału
  163. ADCSRA |= (1<<ADSC);
  164.  
  165. while(ADCSRA & (1<<ADSC));
  166.  
  167. OsY=ADC*5/1024;
  168.  
  169. if(OsX>2 && OsY>0 && OsY<4){ kierX=1;kierY=0; }; //prawo
  170. if(OsX<2 && OsY>0 && OsY<4){ kierX=-1;kierY=0;}; //lewo
  171. if(OsY>2 && OsX>0 && OsX<4){ kierY=-1;kierX=0;}; //gora
  172. if(OsY<2 && OsX>0 && OsX<4){ kierY=1;kierX=0;}; //dol
  173.  
  174.  
  175.  
  176. }
  177.  
  178. ISR(TIMER1_COMPA_vect )//obsluga joystika
  179. {
  180. refresh=1;
  181. losowe.x+=1;
  182. losowe.y+=1;
  183.  
  184.  
  185. }
  186.  
  187. void FoodDraw(Food *food)
  188. {
  189. DrawFSquare(food->pos.x,food->pos.y,1);
  190.  
  191. }
  192.  
  193. void FoodSet(Food *food,Snake *snake)
  194. {
  195. food->pos.x=losowe.x;
  196. food->pos.y=losowe.y;
  197.  
  198.  
  199. if(food->pos.x<0)food->pos.x=128+food->pos.x;
  200. if(food->pos.x>125)food->pos.x=128-food->pos.x;
  201. if(food->pos.y<0)food->pos.y=64+food->pos.y/2;
  202. if(food->pos.y>63)food->pos.y=64-food->pos.y/2;;
  203.  
  204.  
  205. for(int i=0;i<snake->dl;i++)
  206. {
  207. if(food->pos.x==snake->pos[i].x && food->pos.y==snake->pos[i].y )
  208. {
  209. food->pos.x=76;
  210. food->pos.y=33;
  211. }
  212. }
  213.  
  214. //FoodDraw(food);
  215. food->state=1;
  216. }
  217.  
  218. void FoodCheck(Food *food,Snake *snake)
  219. {
  220. if(snake->pos[0].x==food->pos.x && snake->pos[0].y==food->pos.y)
  221. {
  222. //SnakeGrow(snake);
  223. losowe.x+=3;
  224. losowe.y+=7;
  225. food->state=0;
  226. }
  227.  
  228. }
  229.  
  230.  
  231. void CtrlSnake(Snake *snake)
  232. {
  233.  
  234.  
  235.  
  236. if(snake->kier.x==0 && snake->kier.y==-1) // jesli jedzie do gory
  237. {
  238. snake->dir=UP;
  239. //SnakeMove(snake,UP);
  240. //snake->pos.y--; //do gory
  241.  
  242. if(kierX==-1 && kierY==0)//skrecic w lewo
  243. {
  244. snake->kier.x=-1;
  245. snake->kier.y=0;
  246. }
  247.  
  248. if(kierX==1 && kierY==0) // skrecic w prawo
  249. {
  250. snake->kier.x=1;
  251. snake->kier.y=0;
  252. }
  253.  
  254. }
  255.  
  256. else if(snake->kier.x==1 && snake->kier.y==0) //jesli jedzie w prawo
  257. {
  258. snake->dir=RIGHT;
  259. //SnakeMove(snake,RIGHT);
  260. //snake->pos.x++;
  261.  
  262. if(kierX==0 && kierY==-1)//skrecic w gore
  263. {
  264. snake->kier.x=0;
  265. snake->kier.y=-1;
  266. }
  267.  
  268. if(kierX==0 && kierY==1) // skrecic w dol
  269. {
  270. snake->kier.x=0;
  271. snake->kier.y=1;
  272. }
  273.  
  274. }
  275.  
  276. else if(snake->kier.x==0 && snake->kier.y==1) // jesli jedzie w dol
  277. {
  278. snake->dir=DOWN;
  279. //SnakeMove(snake,DOWN);
  280. //snake->pos.y++; //w dol
  281.  
  282. if(kierX==1 && kierY==0) // skrecic w prawo
  283. {
  284. snake->kier.x=1;
  285. snake->kier.y=0;
  286. }
  287.  
  288. if(kierX==-1 && kierY==0)//skrecic w lewo
  289. {
  290. snake->kier.x=-1;
  291. snake->kier.y=0;
  292. }
  293.  
  294. }
  295.  
  296. else //if(snake->kierX==0 && snake->kierY==-1) // jesli jedzie w lewo
  297. {
  298. snake->dir=LEFT;
  299. //SnakeMove(snake,LEFT);
  300. //snake->pos.x--;// w lewo
  301.  
  302. if(kierX==0 && kierY==-1)//skrecic w gore
  303. {
  304. snake->kier.x=0;
  305. snake->kier.y=-1;
  306. }
  307.  
  308. if(kierX==0 && kierY==1) // skrecic w dol
  309. {
  310. snake->kier.x=0;
  311. snake->kier.y=1;
  312. }
  313. }
  314.  
  315. // warunki na brzegach
  316. if(snake->pos[0].x>126)snake->pos[0].x=0;
  317. if(snake->pos[0].x<0)snake->pos[0].x=126;
  318. if(snake->pos[0].y>63)snake->pos[0].y=0;
  319. if(snake->pos[0].y<0)snake->pos[0].y=62;
  320. }
  321.  
  322. void DrawSnake(Snake *snake)
  323. {
  324. for(int i=0;i<snake->dl;i++)
  325. {
  326. DrawFSquare(snake->pos[i].x,snake->pos[i].y,1);
  327. }
  328. }
  329.  
  330. void SnakeMove(Snake *snake,uint8_t dir)
  331. {
  332. Punkt *temp;
  333.  
  334. temp=calloc(snake->dl,sizeof(Punkt));
  335.  
  336. for(int i=0;i<snake->dl;i++)
  337. {
  338. temp[i].x=snake->pos[i].x;
  339. temp[i].y=snake->pos[i].y;
  340. }
  341.  
  342. switch(dir)
  343. {
  344. case 1:snake->pos[0].y--;
  345.  
  346. break;
  347. case 2:snake->pos[0].x++;
  348.  
  349. break;
  350. case 3:snake->pos[0].y++;
  351.  
  352. break;
  353. case 4:snake->pos[0].x--;
  354.  
  355. break;
  356. }
  357.  
  358. for(int i=0;i<snake->dl-1;i++)
  359. {
  360. snake->pos[i+1].x=temp[i].x;
  361. snake->pos[i+1].y=temp[i].y;
  362. }
  363.  
  364. free(temp);
  365.  
  366. }
  367.  
  368. void SnakeCheck(Snake *snake)
  369. {
  370. for(int i=1;i<snake->dl;i++)
  371. {
  372. if(snake->pos[0].x == snake->pos[i].x &&
  373. snake->pos[0].y == snake->pos[i].y) snake->dead=1;
  374. }
  375.  
  376. }
  377.  
  378. void SnakeGrow(Snake *snake)
  379. {
  380. Punkt *tmp;
  381.  
  382. snake->dl++;
  383.  
  384. tmp=realloc((Punkt*)snake->pos,snake->dl*sizeof(Punkt));
  385. if(tmp)
  386. {
  387. snake->pos=tmp;
  388. }
  389. else snake->pos[0].x=33;
  390.  
  391.  
  392.  
  393.  
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement