Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "func.h"
- #include "timer.h"
- #include "ansi.h"
- #include "menu.h"
- #include "music.h"
- #include <stdlib.h>
- #include <stdio.h>
- #define ESC 0x1B
- struct p{
- signed int x;//**
- signed int y;//**
- };
- struct ball{
- signed int x,y,vx,vy;
- };
- struct p striker;
- struct p ballnext;
- struct p ballreal;
- struct ball ball;
- char bricks[7][11];
- long balltim,strktim,timtim;
- char lives,arcade,currentlvl;
- int points=0,highscore=0;
- char curser,bricksLeft=0;
- void init() //bliver kaldet i starten for at initialisere timer og tegne banen.
- {
- timerconf();
- resetbgcolor();
- clrsc();
- drawwindow();
- timtim=0;
- }
- #pragma interrupt // Timer der bruges til at opdatere tiden. Tæller hvert 0.01 sekund.
- void timer0int() // timeout 0.01, time
- {
- timtim++;
- }
- #pragma interrupt // Bruges til strikeren.
- void timer1int() // timout 0.07, striker
- {
- strktim=1;
- }
- #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.
- void timer2int() // timeout 0.01, ball
- {
- balltim++;
- }
- void timer(){// udregnet sekunder og opdaterer kun, hvis der er en ændring.
- int sek;
- static int sekcount=-1;
- sek=(timtim/100)%60;
- if (sek!=sekcount) {
- sekcount=sek;
- gotoxy(64,20);
- printf("Time: ");
- printtime();
- points--;
- }
- }
- void printtime(){ // printer tiden i sekudner, minutter og timer.
- int sek=(timtim/100)%60;
- int min=(timtim/6000)%60;
- int tim=(timtim/360000)%24;
- printf("%2d:%2d:%2d",tim,min,sek);
- }
- void drawwindow() //Tegner et vindue til selve spillet og et til Score-menuen til højre. Skriver det "permanente" skrift.
- {
- struct p a, b;
- clrsc();
- a.x=1,a.y=1;
- b.x=62,b.y=21;
- window(a,b,"Arkanoid ReflexBall 1.0",0);
- a.x=63,a.y=1;
- b.x=80,b.y=21;
- window(a,b,"Score",1);
- gotoxy(64,3);
- printf("Point: ");
- gotoxy(64,6);
- printf("Liv:");
- gotoxy(64,9);
- printf("Level:");
- lives=5;
- }
- void strikerreset() // Genstarter timeren til startpositionen.
- {
- striker.x=28;
- striker.y=20;
- gotoxy(striker.x,striker.y);
- drawstriker();
- }
- void brickreset() // Tegner brikkerne i spillefeltet. Bruges hovedsagligt i starten af en bane.
- // der skelnes mellem brikker der i arrayet hedder '1' og '2', hvor '2' er bonusbrikker (med ekstra point).
- {
- int i,j,k;
- for (i=0; i<11; i++)
- {
- for (j=0; j<7; j++)
- {
- if (bricks[j][i]==1)
- {
- k=rand()%8;
- bgcolor(k);
- fgcolor(k+8);
- gotoxy(i*5+5,j+3);
- printf("%c%c%c%c",220,223,220,223);
- resetbgcolor();
- printf(" ");
- } else if (bricks[j][i]==2)
- {
- bgcolor(7);
- fgcolor(15);
- gotoxy(i*5+5,j+3);
- printf("%c%c%c%c",36,36,36,36);
- resetbgcolor();
- printf(" ");
- }
- }
- }
- }
- void ballreset() //Genstarter bolden til startposition lige over strikeren.
- {
- ball.x=31<<8;
- ball.y=19<<8;
- ball.vx=0x0000;
- ball.vy=0x0080;
- drawball();
- }
- void drawstriker() //Tegner strikeren
- {
- int i;
- for (i=0; i<7; i++)
- {
- printf("%c",223);
- }
- }
- void drawball() //Tegner bolden
- {
- gotoxy(ball.x>>8,ball.y>>8);
- printf("%c",111);
- }
- void updatestriker()// Denne metode går ind og læser tastetryk ved hjælp af 'loadKey()'.
- // der registreres, om højre- eller venstre knap er trykket ned, og flytter strikeren herefter.
- {
- if (strktim==1)
- {
- char Right=1,Left=1,newkey;
- newkey = loadKey();
- Left = (newkey&0x02)>>1;
- Right = (newkey&0x04)>>2;
- if(Right==0 && striker.x<55)
- {
- striker.x++;
- gotoxy(striker.x-1,striker.y);
- printf(" ");
- drawstriker();
- }
- if(Left==0 && striker.x>2)
- {
- striker.x--;
- gotoxy(striker.x,striker.y);
- drawstriker();
- printf(" ");
- }
- strktim=0;
- }
- }
- void updateball() { //Opdaterer bolden, ændrer retning hvis den rammer forskellige elementer
- static int ballupdate;
- ballreal.x = ball.x>>8;
- ballreal.y = ball.y>>8;
- if(balltim%8==1 && ballupdate==1)
- {
- if (ballreal.y == 19 && ballreal.x >= striker.x && ballreal.x <= (striker.x+6)) // hvis den er i bundet lige over strikeren.
- {
- ball.vy=-ball.vy;
- if (ballreal.x == striker.x) // Strikeren er inddelt i syv zoner, hvert af dem reflekterer bolden forskelligt.
- {
- ball.vx-=80;
- } else if (ballreal.x == striker.x+1)
- {
- ball.vx-=60;
- } else if (ballreal.x == striker.x+2)
- {
- ball.vx-=40;
- } else if (ballreal.x == striker.x+3)
- {
- ball.vx=0;
- } else if (ballreal.x == striker.x+4)
- {
- ball.vx+=40;
- } else if (ballreal.x == striker.x+5)
- {
- ball.vx+=60;
- } else if (ballreal.x == striker.x+6)
- {
- ball.vx+=80;
- }
- }
- if(ballreal.x>=61 || ballreal.x<=2) // Hvis bolden er ved højre elller venstre kant.
- {
- ball.vx=-ball.vx;
- }
- if (ballreal.y<=2) // hvis bolden er i toppen.
- {
- ball.vy=-ball.vy;
- }
- ballnext.x = (ball.x+ball.vx)>>8;
- ballnext.y = (ball.y+ball.vy)>>8;
- 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.
- {
- ball.vx=-ball.vx;
- }
- if (ballreal.y >= 21) // Hvis den er under strikeren.
- {
- deadball();
- }
- ball.x+=ball.vx; //Positionen opdateres med hastigheden i hver retning.
- ball.y+=ball.vy;
- gotoxy(ballreal.x,ballreal.y); // Bolden opdateres.
- printf(" ");
- drawball();
- ballupdate=0;
- } else if(balltim%10!=1) ballupdate=1;
- }
- 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.
- ballnext.x = (ball.x+ball.vx)>>8;
- ballnext.y = (ball.y+ball.vy)>>8;
- 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
- {
- points+=10;
- hitbrick();
- } 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 --||--
- {
- points+=50;
- hitbrick();
- }
- }
- void updatescore(int newlives) {//Opdaterer scoren og livet med det input, der gives til funktionen.
- int i;
- gotoxy(72,3);
- printf(" ");
- gotoxy(72,3);
- printf("%d",points);
- for (i=0; i<newlives;i++) //Tæller liv op så det matcher input.
- {
- lives++;
- }
- for (i=0; i>newlives; i--)
- {
- lives--;
- }
- gotoxy(72,6);
- printf(" ");
- gotoxy(72,6);
- printf("%d",lives);
- }
- /*void updatehighscore(int in)
- {
- highscore=in;
- }*/
- void hitbrick() {//Arrayet med bricks bliver opdateret og bricken slettes.
- // Hvis bolden er til venstre eller højre for bricken bliver x-hastigheden det modsatte og ellers bliver y-hastigheden modsat.
- bricks[ballnext.y-3][((ballnext.x-5)-(ballnext.x%5))/5]=0;
- gotoxy(ballnext.x-(ballnext.x%5),ballnext.y);
- printf(" ");
- if (ballreal.x < (ballnext.x-(ballnext.x%5)) || ballreal.x > (ballnext.x-(ballnext.x%5)+4))
- {
- ball.vx=-ball.vx;
- } else
- {
- ball.vy=-ball.vy;
- }
- updatescore(0);
- bricksLeft--;
- }
- void deadball() {// Hvis bolden dør bliver bolden resat til lige over strikeren, man mister point og scoren bliver opdateret.
- gotoxy(ballreal.x,ballreal.y);
- printf(" ");
- ball.x=(striker.x+3)<<8;
- ball.y=(striker.y-2)<<8;
- ball.vx=0;
- ball.vy=0xFF7F; //0xFF80
- points-=200;
- updatescore(-1);
- }
- void initMap() {// Genstarter bold, striker og bricks til det originale
- gotoxy(striker.x,striker.y);
- printf(" ");
- gotoxy(ball.x>>8,ball.y>>8);
- printf(" ");
- strikerreset();
- brickreset();
- ballreset();
- updatescore(0);
- }
- 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.
- // Der holdes styr på hvad man spiller (arcsde/level) og om man er færdig. Hvis man er færdig køres menuen igen.
- int i,j;
- updatestriker();
- updatebrick();
- updateball();
- timer();
- playtune(timtim,0);
- if (lives < 1)
- {
- bricksLeft=0;
- lives=5;
- arcade=0;
- }
- while(bricksLeft==0 && arcade==0) //Hvis man er færdig med banen og det ikke er arcade mode.
- {
- DI();
- if(points>highscore)
- {
- highscore=points;
- }
- points=0;
- menu();
- init();
- initMap();
- }
- 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.
- {
- currentlvl++;
- if(currentlvl==4)
- {
- arcade=0;
- } else
- {
- levelsel(currentlvl);
- initMap();
- for(i=0;i<7;i++)for(j=0;j<11;j++)if(bricks[i][j]>0)bricksLeft++;
- }
- }
- }
Add Comment
Please, Sign In to add comment