Guest User

Untitled

a guest
Oct 23rd, 2017
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.73 KB | None | 0 0
  1. #include "func.h"
  2. #include "timer.h"
  3. #include "ansi.h"
  4. #include "menu.h"
  5. #include "music.h"
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8.  
  9. #define ESC 0x1B
  10.  
  11. struct p{
  12. signed int x;//**
  13. signed int y;//**
  14. };
  15. struct ball{
  16. signed int x,y,vx,vy;
  17. };
  18.  
  19.  
  20. struct p striker;
  21. struct p ballnext;
  22. struct p ballreal;
  23. struct ball ball;
  24.  
  25. char bricks[7][11];
  26.  
  27. long balltim,strktim,timtim;
  28. char lives,arcade,currentlvl;
  29. int points=0,highscore=0;
  30. char curser,bricksLeft=0;
  31.  
  32. void init() //bliver kaldet i starten for at initialisere timer og tegne banen.
  33. {
  34. timerconf();
  35. resetbgcolor();
  36. clrsc();
  37. drawwindow();
  38. timtim=0;
  39.  
  40. }
  41.  
  42. #pragma interrupt // Timer der bruges til at opdatere tiden. Tæller hvert 0.01 sekund.
  43. void timer0int() // timeout 0.01, time
  44. {
  45. timtim++;
  46.  
  47. }
  48. #pragma interrupt // Bruges til strikeren.
  49. void timer1int() // timout 0.07, striker
  50. {
  51. strktim=1;
  52. }
  53. #pragma interrupt // Bruges til bolden. Denne er forskudt med 1 count i reload-værdien i forhold til timer0, da der ellers vil være problemer med at de kom samtidig.
  54. void timer2int() // timeout 0.01, ball
  55. {
  56. balltim++;
  57. }
  58.  
  59. void timer(){// udregnet sekunder og opdaterer kun, hvis der er en ændring.
  60. int sek;
  61. static int sekcount=-1;
  62. sek=(timtim/100)%60;
  63.  
  64. if (sek!=sekcount) {
  65. sekcount=sek;
  66. gotoxy(64,20);
  67. printf("Time: ");
  68. printtime();
  69. points--;
  70. }
  71. }
  72.  
  73.  
  74. void printtime(){ // printer tiden i sekudner, minutter og timer.
  75. int sek=(timtim/100)%60;
  76. int min=(timtim/6000)%60;
  77. int tim=(timtim/360000)%24;
  78. printf("%2d:%2d:%2d",tim,min,sek);
  79. }
  80.  
  81. void drawwindow() //Tegner et vindue til selve spillet og et til Score-menuen til højre. Skriver det "permanente" skrift.
  82. {
  83. struct p a, b;
  84. clrsc();
  85. a.x=1,a.y=1;
  86. b.x=62,b.y=21;
  87. window(a,b,"Arkanoid ReflexBall 1.0",0);
  88. a.x=63,a.y=1;
  89. b.x=80,b.y=21;
  90. window(a,b,"Score",1);
  91. gotoxy(64,3);
  92. printf("Point: ");
  93. gotoxy(64,6);
  94. printf("Liv:");
  95. gotoxy(64,9);
  96. printf("Level:");
  97. lives=5;
  98. }
  99.  
  100. void strikerreset() // Genstarter timeren til startpositionen.
  101. {
  102. striker.x=28;
  103. striker.y=20;
  104. gotoxy(striker.x,striker.y);
  105. drawstriker();
  106. }
  107.  
  108. void brickreset() // Tegner brikkerne i spillefeltet. Bruges hovedsagligt i starten af en bane.
  109. // der skelnes mellem brikker der i arrayet hedder '1' og '2', hvor '2' er bonusbrikker (med ekstra point).
  110. {
  111. int i,j,k;
  112. for (i=0; i<11; i++)
  113. {
  114. for (j=0; j<7; j++)
  115. {
  116. if (bricks[j][i]==1)
  117. {
  118. k=rand()%8;
  119. bgcolor(k);
  120. fgcolor(k+8);
  121. gotoxy(i*5+5,j+3);
  122. printf("%c%c%c%c",220,223,220,223);
  123. resetbgcolor();
  124. printf(" ");
  125. } else if (bricks[j][i]==2)
  126. {
  127. bgcolor(7);
  128. fgcolor(15);
  129. gotoxy(i*5+5,j+3);
  130. printf("%c%c%c%c",36,36,36,36);
  131. resetbgcolor();
  132. printf(" ");
  133. }
  134. }
  135. }
  136. }
  137.  
  138.  
  139.  
  140. void ballreset() //Genstarter bolden til startposition lige over strikeren.
  141. {
  142. ball.x=31<<8;
  143. ball.y=19<<8;
  144. ball.vx=0x0000;
  145. ball.vy=0x0080;
  146. drawball();
  147. }
  148.  
  149. void drawstriker() //Tegner strikeren
  150. {
  151. int i;
  152. for (i=0; i<7; i++)
  153. {
  154. printf("%c",223);
  155. }
  156. }
  157.  
  158. void drawball() //Tegner bolden
  159. {
  160. gotoxy(ball.x>>8,ball.y>>8);
  161. printf("%c",111);
  162. }
  163.  
  164. void updatestriker()// Denne metode går ind og læser tastetryk ved hjælp af 'loadKey()'.
  165. // der registreres, om højre- eller venstre knap er trykket ned, og flytter strikeren herefter.
  166. {
  167. if (strktim==1)
  168. {
  169. char Right=1,Left=1,newkey;
  170. newkey = loadKey();
  171. Left = (newkey&0x02)>>1;
  172. Right = (newkey&0x04)>>2;
  173.  
  174. if(Right==0 && striker.x<55)
  175. {
  176. striker.x++;
  177. gotoxy(striker.x-1,striker.y);
  178. printf(" ");
  179. drawstriker();
  180. }
  181.  
  182. if(Left==0 && striker.x>2)
  183. {
  184. striker.x--;
  185. gotoxy(striker.x,striker.y);
  186. drawstriker();
  187. printf(" ");
  188. }
  189. strktim=0;
  190. }
  191. }
  192.  
  193. void updateball() { //Opdaterer bolden, ændrer retning hvis den rammer forskellige elementer
  194. static int ballupdate;
  195. ballreal.x = ball.x>>8;
  196. ballreal.y = ball.y>>8;
  197. if(balltim%8==1 && ballupdate==1)
  198. {
  199. if (ballreal.y == 19 && ballreal.x >= striker.x && ballreal.x <= (striker.x+6)) // hvis den er i bundet lige over strikeren.
  200. {
  201. ball.vy=-ball.vy;
  202. if (ballreal.x == striker.x) // Strikeren er inddelt i syv zoner, hvert af dem reflekterer bolden forskelligt.
  203. {
  204. ball.vx-=80;
  205. } else if (ballreal.x == striker.x+1)
  206. {
  207. ball.vx-=60;
  208. } else if (ballreal.x == striker.x+2)
  209. {
  210. ball.vx-=40;
  211. } else if (ballreal.x == striker.x+3)
  212. {
  213. ball.vx=0;
  214. } else if (ballreal.x == striker.x+4)
  215. {
  216. ball.vx+=40;
  217. } else if (ballreal.x == striker.x+5)
  218. {
  219. ball.vx+=60;
  220. } else if (ballreal.x == striker.x+6)
  221. {
  222. ball.vx+=80;
  223. }
  224. }
  225. if(ballreal.x>=61 || ballreal.x<=2) // Hvis bolden er ved højre elller venstre kant.
  226. {
  227. ball.vx=-ball.vx;
  228. }
  229. if (ballreal.y<=2) // hvis bolden er i toppen.
  230. {
  231. ball.vy=-ball.vy;
  232. }
  233. ballnext.x = (ball.x+ball.vx)>>8;
  234. ballnext.y = (ball.y+ball.vy)>>8;
  235. if (ballnext.y == striker.y && ballnext.x >= striker.x && ballnext.x <=(striker.x+6) && (ballreal.x > (striker.x+6) || ballreal.x < striker.x)) // Hvis bolden kommer fra siden og rammer strikeren.
  236. {
  237. ball.vx=-ball.vx;
  238. }
  239.  
  240. if (ballreal.y >= 21) // Hvis den er under strikeren.
  241. {
  242. deadball();
  243. }
  244.  
  245. ball.x+=ball.vx; //Positionen opdateres med hastigheden i hver retning.
  246. ball.y+=ball.vy;
  247. gotoxy(ballreal.x,ballreal.y); // Bolden opdateres.
  248. printf(" ");
  249. drawball();
  250. ballupdate=0;
  251. } else if(balltim%10!=1) ballupdate=1;
  252. }
  253.  
  254. void updatebrick() {// Registrerer om bolden er ved at ramme en brick, og hvis den gør bliver bricken slettet, man får point og en ny funktion (hitbrick()) bliver kaldt for at ændre boldens retning.
  255. ballnext.x = (ball.x+ball.vx)>>8;
  256. ballnext.y = (ball.y+ball.vy)>>8;
  257.  
  258. if (bricks[ballnext.y-3][((ballnext.x-5)-(ballnext.x%5))/5]==1 && (ballnext.x-4)%5!=0 && ballnext.x>4 && ballnext.x <59 && ballnext.y<10 && ballnext.y>2) // Hvis der står 1 i arrayet og bolden ikke er i et mellemrum
  259. {
  260. points+=10;
  261. hitbrick();
  262.  
  263.  
  264. } else if (bricks[ballnext.y-3][((ballnext.x-5)-(ballnext.x%5))/5]==2 && (ballnext.x-4)%5!=0 && ballnext.x>4 && ballnext.x<59 && ballnext.y<10 && ballnext.y>2) // Hvis der står 2 i arrayet og --||--
  265. {
  266. points+=50;
  267. hitbrick();
  268. }
  269.  
  270. }
  271.  
  272. void updatescore(int newlives) {//Opdaterer scoren og livet med det input, der gives til funktionen.
  273. int i;
  274. gotoxy(72,3);
  275. printf(" ");
  276. gotoxy(72,3);
  277. printf("%d",points);
  278. for (i=0; i<newlives;i++) //Tæller liv op så det matcher input.
  279. {
  280. lives++;
  281. }
  282. for (i=0; i>newlives; i--)
  283. {
  284. lives--;
  285. }
  286. gotoxy(72,6);
  287. printf(" ");
  288. gotoxy(72,6);
  289. printf("%d",lives);
  290. }
  291.  
  292. /*void updatehighscore(int in)
  293. {
  294. highscore=in;
  295. }*/
  296.  
  297.  
  298. void hitbrick() {//Arrayet med bricks bliver opdateret og bricken slettes.
  299. // Hvis bolden er til venstre eller højre for bricken bliver x-hastigheden det modsatte og ellers bliver y-hastigheden modsat.
  300. bricks[ballnext.y-3][((ballnext.x-5)-(ballnext.x%5))/5]=0;
  301. gotoxy(ballnext.x-(ballnext.x%5),ballnext.y);
  302. printf(" ");
  303. if (ballreal.x < (ballnext.x-(ballnext.x%5)) || ballreal.x > (ballnext.x-(ballnext.x%5)+4))
  304. {
  305. ball.vx=-ball.vx;
  306. } else
  307. {
  308. ball.vy=-ball.vy;
  309. }
  310. updatescore(0);
  311. bricksLeft--;
  312. }
  313.  
  314.  
  315.  
  316. void deadball() {// Hvis bolden dør bliver bolden resat til lige over strikeren, man mister point og scoren bliver opdateret.
  317. gotoxy(ballreal.x,ballreal.y);
  318. printf(" ");
  319. ball.x=(striker.x+3)<<8;
  320. ball.y=(striker.y-2)<<8;
  321. ball.vx=0;
  322. ball.vy=0xFF7F; //0xFF80
  323. points-=200;
  324. updatescore(-1);
  325. }
  326.  
  327.  
  328.  
  329. void initMap() {// Genstarter bold, striker og bricks til det originale
  330. gotoxy(striker.x,striker.y);
  331. printf(" ");
  332. gotoxy(ball.x>>8,ball.y>>8);
  333. printf(" ");
  334. strikerreset();
  335. brickreset();
  336. ballreset();
  337. updatescore(0);
  338. }
  339.  
  340. void updatescreen() {// Denne metode bliver køre i et while-loop i main-filen, og opdaterer hele tiden strikeren og boldens position og om en brick bliver ramt.
  341. // Der holdes styr på hvad man spiller (arcsde/level) og om man er færdig. Hvis man er færdig køres menuen igen.
  342. int i,j;
  343. updatestriker();
  344. updatebrick();
  345. updateball();
  346. timer();
  347. playtune(timtim,0);
  348. if (lives < 1)
  349. {
  350. bricksLeft=0;
  351. lives=5;
  352. arcade=0;
  353. }
  354. while(bricksLeft==0 && arcade==0) //Hvis man er færdig med banen og det ikke er arcade mode.
  355. {
  356. DI();
  357. if(points>highscore)
  358. {
  359. highscore=points;
  360. }
  361. points=0;
  362. menu();
  363. init();
  364. initMap();
  365. }
  366. if(bricksLeft==0 && arcade==1) // --||-- hvis det er arcade mode. Level-variablen bliver forøget med en, og hvis man ikke er færdig med bane 3 startes næste bane.
  367. {
  368. currentlvl++;
  369. if(currentlvl==4)
  370. {
  371. arcade=0;
  372. } else
  373. {
  374. levelsel(currentlvl);
  375. initMap();
  376. for(i=0;i<7;i++)for(j=0;j<11;j++)if(bricks[i][j]>0)bricksLeft++;
  377. }
  378. }
  379. }
Add Comment
Please, Sign In to add comment