/*************************************************************************/ /* */ /* */ /* NEROPATTI (hiiriohjaus) */ /* */ /* Cum Laude harjoitusty” */ /* */ /* */ /* - Sirkku Greijula 25.03.1991 - */ /* */ /* */ /*************************************************************************/ /* liitet„„n tarvittavat aliohjelmakirjastot */ #include #include #include #include #include #include #include "hiiru.h" /* aliohjelmakirjasto hiiru.h sis„lt„„ tarvittavat */ /* hiiriohjausfunktiot */ /* vakioiden m„„rittelyt */ #define RUUTU 50 /* globaalit muuttujam„„rittelyt */ int taulu[7][7]={0}; char tyhja[]=" "; char nerotxt[]= " NEROPATTI"; char tekija[]="(c) Sirkku Greijula 1991"; /* hiirikursorim„„ritykset */ unsigned nuoli[32]={0x3fff,0x1fff,0x0fff,0x07ff,0x03ff,0x01ff,0x00ff,0x007f, 0x003f,0x001f,0x01ff,0x10ff,0x30ff,0xf87f,0xf87f,0xfc3f, 0x0000,0x4000,0x6000,0x7000,0x7800,0x7c00,0x7e00,0x7f00, 0x7f80,0x7fc0,0x7c00,0x4600,0x0600,0x0300,0x0300,0x0000}; unsigned pallo[32]={0xfc3f,0xe007,0xc003,0x8001,0x8001,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x8001,0x8001,0xc003,0xe007,0xfc3f, 0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x7ffe, 0x7ffe,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000}; unsigned risti[32]={0xfc3f,0xfc3f,0xfc3f,0xfc3f,0xfc3f,0xfc3f,0x0000,0x0000, 0x0000,0x0000,0xfc3f,0xfc3f,0xfc3f,0xfc3f,0xfc3f,0xfc3f, 0x0000,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x7ffe, 0x7ffe,0x0180,0x0180,0x0180,0x0180,0x0180,0x0180,0x0000}; int GraphDriver; /* The Graphics device driver */ int GraphMode; /* The Graphics mode value */ double AspectRatio; /* Aspect ratio of a pixel on the screen */ int MaxX,MaxY; /* The maximum resolution of the screen */ int MaxColors; /* The maximum # of colors available */ int ErrorCode; /* Reports any graphics errors */ struct palettetype palette; /* Used to read palette info */ /* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */ /* */ /* INITIALIZE: Initializes the graphics system and reports */ /* any errors which occured. */ /* */ void initialize(void) { int xasp, yasp; /* Used to read the aspect ratio */ GraphDriver = DETECT; /* Request auto-detection */ initgraph( &GraphDriver, &GraphMode, "" ); ErrorCode = graphresult(); /* Read result of initialization */ if( ErrorCode != grOk ) /* Error occured during init */ { printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) ); exit( 1 ); } getpalette( &palette ); /* Read the palette from board */ MaxColors = getmaxcolor() + 1; /* Read maximum number of colors */ MaxX = getmaxx(); MaxY = getmaxy(); /* Read size of screen */ getaspectratio( &xasp, &yasp ); /* read the hardware aspect */ AspectRatio = (double)xasp / (double)yasp; /* Get correction factor */ } /* */ /* Aliohjelma saa aikaan piippauksen, jos pelaaja painaa v„„r„„ n„p- */ /* p„int„. */ void piip() { sound(2000); delay(30); nosound(); } /* */ /* Aliohjelma alustaa matriisin taulu. */ /* */ void alustapisteet() { int i,j; for (i=0;i<=6;i++) for (j=0;j<=6;j++) taulu[i][j]=0; taulu[0][0]=2;taulu[0][1]=2;taulu[1][0]=2;taulu[1][1]=2; taulu[0][5]=2;taulu[0][6]=2;taulu[1][5]=2;taulu[1][6]=2; taulu[5][0]=2;taulu[5][1]=2;taulu[5][5]=2;taulu[5][6]=2; taulu[6][0]=2;taulu[6][1]=2;taulu[6][5]=2;taulu[6][6]=2; taulu[3][3]=1; } /* */ /* Aliohjelma piirt„„ parametrin tila mukaan, joko napin ylh„„ll„ tai */ /* alas pinettuna. */ /* */ void piirranappi(int x,int y,char *mj,int tila,int vari) { katkehiirikursori(); if (tila==0) { setlinestyle(SOLID_LINE,0,THICK_WIDTH); setcolor(DARKGRAY); rectangle(x+4,y+4,x+94,y+28); setfillstyle(SOLID_FILL,DARKGRAY); bar(x+6,y+6,x+92,y+26); setlinestyle(SOLID_LINE,0,THICK_WIDTH); setcolor(LIGHTGRAY); rectangle(x,y,x+90,y+24); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(x+2,y+2,x+88,y+22); setcolor(WHITE); outtextxy(x+5,y+8,mj); } else { setlinestyle(SOLID_LINE,0,THICK_WIDTH); setcolor(vari); rectangle(x,y,x+90,y+24); setfillstyle(SOLID_FILL,vari); bar(x+2,y+2,x+88,y+22); setlinestyle(SOLID_LINE,0,THICK_WIDTH); setcolor(LIGHTGRAY); rectangle(x+4,y+4,x+94,y+28); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(x+6,y+6,x+92,y+26); setcolor(WHITE); outtextxy(x+9,y+12,mj); } naytahiirikursori(); } /* */ /* Aliohjelma piirt„„ pelin„yt”n. */ /* */ void naytto() { int i,j; /* alustetaan taustasuunnikkaan v„ri vaaleanpunaiseksi */ setfillstyle(SOLID_FILL,LIGHTRED); bar(0,0,640,480); /* lopetus,peliohje -ja uusi peli-teksti kuvaruudulle */ piirranappi(10,22," Lopetus",0,LIGHTRED); piirranappi(10,72," Apua",0,LIGHTRED); piirranappi(10,122," Uusi peli",0,LIGHTRED); setfillstyle(SOLID_FILL,YELLOW); bar(320-3*RUUTU,200-3*RUUTU,320+3*RUUTU,200+3*RUUTU); /* piirret„„n n„ytt” */ setcolor(RED); setlinestyle(SOLID_LINE,0,NORM_WIDTH); for (j=0;j<=6*RUUTU;j+=RUUTU) line(320-3*RUUTU,200-3*RUUTU+j,320+3*RUUTU,200-3*RUUTU+j); for (i=0;i<=6*RUUTU;i+=RUUTU) line(320-3*RUUTU+i,200-3*RUUTU,320-3*RUUTU+i,200+3*RUUTU); setfillstyle(SOLID_FILL,LIGHTRED); bar(320-3*RUUTU,200-3*RUUTU,320-RUUTU-1,200-RUUTU-1); bar(320+RUUTU+1,200-3*RUUTU,320+3*RUUTU,200-RUUTU-1); bar(320-3*RUUTU,200+RUUTU+1,320-RUUTU-1,200+3*RUUTU); bar(320+RUUTU+1,200+RUUTU+1,320+3*RUUTU,200+3*RUUTU); setfillstyle(SOLID_FILL,LIGHTGREEN); bar(320-RUUTU/2,200-RUUTU/2,320+RUUTU/2,200+RUUTU/2); setcolor(BLACK); setfillstyle(SOLID_FILL,BLACK); setlinestyle(SOLID_LINE,0,NORM_WIDTH); for (i=0;i<=6;i++) for (j=0;j<=6;j++) if (taulu[i][j]==0) fillellipse(320-(3-j)*RUUTU,200-(3-i)*RUUTU,RUUTU/5,RUUTU/5); setcolor(WHITE); setfillstyle(SOLID_FILL,WHITE); fillellipse(320,200,RUUTU/5,RUUTU/5); /* Piirret„„n pelin„yt”n alaosa */ setfillstyle(SOLID_FILL,RED); bar(0,408,640,480); setcolor(WHITE); rectangle(4,412,635,475); rectangle(2,410,637,477); } /* */ /* Aliohjelma tutkii "Kyll„" ja "Ei" -nappien tilaa. */ /* */ int tutki2(int x,int vari) { int u,v,nappi1,nappi2,monta,alhaalla=0; do { hiirentila(&u,&v,&nappi1,&nappi2); if (u>=x && u<=x+90 && v>99 && v<125) { if(!alhaalla) { switch (x) { case 50: piirranappi(50,100," Kyll„",1,vari);break; case 170: piirranappi(170,100," Ei",1,vari);break; } alhaalla=1; } } else { if(alhaalla) { switch (x) { case 50: piirranappi(50,100," Kyll„",0,vari);break; case 170: piirranappi(170,100," Ei",0,vari);break; } alhaalla=0; } } } while (nappi1); switch (x) { case 50: piirranappi(50,100," Kyll„",0,vari);break; case 170: piirranappi(170,100," Ei",0,vari);break; } hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); if (u>=x && u<=x+90 && v>99 && v<125) return(1); return(0); } /* */ /* Aliohjelma tutkii onko painettu "Kyll„ tai "Ei" -nappia. */ /* */ int valintanappi(int x,int y,int vari) { if (y>99 && y<125) { if (x>49 && x<141) {if (tutki2(50,vari)) return(1);} if (x>169 && x<261){if (tutki2(170,vari)) return(2);} } return(0); } /* */ /* Aliohjelma tarkistaa haluaako k„ytt„j„ lopettaa. */ /* */ int lopetetaanko() { void *p; int nappi1,nappi2,monta,u,v,tila=0; katkehiirikursori(); p=malloc(imagesize(20,30,300,150)); if (p!=NULL) { getimage(20,30,300,150,p); setfillstyle(SOLID_FILL,WHITE); setlinestyle(SOLID_LINE,0,NORM_WIDTH); bar(20,30,300,150); setcolor(RED); rectangle(22,32,298,148); rectangle(24,34,296,146); outtextxy(80,60,"Haluatko lopettaa?"); piirranappi(50,100," Kyll„",0,WHITE); piirranappi(170,100," Ei",0,WHITE); naytahiirikursori(); while (!tila) { do hiirenpainallukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); while (!monta && !kbhit()); if (kbhit()) { if (0x1B==getch()) tila=2; } else tila=valintanappi(u,v,WHITE); } katkehiirikursori(); putimage(20,30,p,0); free(p); naytahiirikursori(); } else exit(1); if (tila==1) return(1); return(0); } /* */ /* Aliohjelma tarkistaa haluaako k„ytt„j„ aloittaa uuden pelin. */ /* */ int uusi_peli() { void *p; int nappi1,nappi2,monta,u,v,tila=0; katkehiirikursori(); p=malloc(imagesize(20,30,300,150)); if (p!=NULL) { getimage(20,30,300,150,p); setfillstyle(SOLID_FILL,LIGHTBLUE); setlinestyle(SOLID_LINE,0,NORM_WIDTH); bar(20,30,300,150); setcolor(WHITE); rectangle(22,32,298,148); rectangle(24,34,296,146); outtextxy(50,60,"Otetaanko uusiksi alusta?"); piirranappi(50,100," Kyll„",0,LIGHTBLUE); piirranappi(170,100," Ei",0,LIGHTBLUE); naytahiirikursori(); while (!tila) { do hiirenpainallukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); while (!monta && !kbhit()); if (kbhit()) { if (0x1B==getch()) tila=2; } else tila=valintanappi(u,v,LIGHTBLUE); } katkehiirikursori(); putimage(20,30,p,0); free(p); naytahiirikursori(); } else exit(1); if (tila==1) return(1); return(0); } /* */ /* Aliohjelma tulostaa peliohjeet. */ /* */ void help() { void *p; int nappi1,nappi2,monta,u,v; katkehiirikursori(); p=malloc(imagesize(20,30,330,160)); if (p!=NULL) { getimage(20,30,330,160,p); setfillstyle(SOLID_FILL,RED); setlinestyle(SOLID_LINE,0,NORM_WIDTH); bar(20,30,330,160); setcolor(WHITE); rectangle(22,32,328,156); rectangle(24,34,326,158); { outtextxy(35,40,"Tavoitteena on saada yksi pelinappu-"); outtextxy(35,50,"loista keskell„ olevalle vihre„lle"); outtextxy(35,60,"neli”lle sek„ poistaa kaikki muut "); outtextxy(35,70,"nappulat kent„lt„. Nappuloita sy”-"); outtextxy(35,80,"d„„n hypp„„m„ll„ toisen yli seuraa-"); outtextxy(35,90,"vana olevaan tyhj„„n ruutuun joko "); outtextxy(35,100,"vaaka -tai pystysuoraan, jolloin"); outtextxy(35,110,"ylihyp„tty nappula poistetaan ken-"); outtextxy(35,120,"t„lt„. Tulos on sit„ parempi mit„"); outtextxy(35,130,"v„hemm„n nappuloita kent„lle lopuk-"); outtextxy(35,140,"si j„„."); } naytahiirikursori(); do { hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); if (kbhit()) if (0x1B==getch()) monta=1; } while (!monta); katkehiirikursori(); putimage(20,30,p,0); free(p); naytahiirikursori(); } else exit(1); } int siirrettavissa(int k1,int k2,int h1,int h2) { if (k1<0 || k1>6 || k2<0 || k2>6) return(0); else if (taulu[k1][k2]!=1 || taulu[h1][h2]!=0) return(0); else return(1); } /* */ /* Aliohjelma muuttaa pikselikoordinaatit taulun koordinaateiksi ja */ /* palauttaa ne. */ /* */ void muutos(int x,int y,int *i,int *j) { *i=(y-50+RUUTU/2)/RUUTU; *j=(x-170+RUUTU/2)/RUUTU; } /* */ /* Aliohjelma palauttaa arvon 1, jos valittu nappula on siirrett„vis- */ /* s„, muuten arvon 0. */ /* */ int nappula(int x,int y) { int i,j; muutos(x,y,&i,&j); if (i<0 || i>6 || j<0 || j>6) return(0); if (taulu[i][j]!=0) return(0); if (siirrettavissa(i-2,j,i-1,j) || siirrettavissa(i,j+2,i,j+1) || siirrettavissa(i+2,j,i+1,j) || siirrettavissa(i,j-2,i,j-1)) return(1); else return(0); } /* */ /* Aliohjelma tutkii "Lopetus","Apua" ja "Uusi peli" -nappien tilaa. */ /* */ int tutki(int y) { int u,v,nappi1,nappi2,monta,alhaalla=0; do { hiirentila(&u,&v,&nappi1,&nappi2); if (u>9 && u<101 && v>=y && v<=y+24) { if(!alhaalla) { switch (y) { case 22: piirranappi(10,22," Lopetus",1,LIGHTRED);break; case 72: piirranappi(10,72," Apua",1,LIGHTRED);break; case 122:piirranappi(10,122," Uusi peli",1,LIGHTRED); } alhaalla=1; } } else { if(alhaalla) { switch (y) { case 22: piirranappi(10,22," Lopetus",0,LIGHTRED);break; case 72: piirranappi(10,72," Apua",0,LIGHTRED);break; case 122:piirranappi(10,122," Uusi peli",0,LIGHTRED); } alhaalla=0; } } } while (nappi1); switch (y) { case 22: piirranappi(10,22," Lopetus",0,LIGHTRED);break; case 72: piirranappi(10,72," Apua",0,LIGHTRED);break; case 122:piirranappi(10,122," Uusi peli",0,LIGHTRED); } hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); if (u>9 && u<101 && v>=y && v<=y+24) return(1); return(0); } /* */ /* Aliohjelma palauttaa arvon 0, jos hiiren vasenta nappia ei ole pai- */ /* nettu ruudun vasemmassa yl„kulmassa olevien nappien kohdalla, arvon */ /* 1, jos oli painettu Lopetus-napin kohdalla, arvon 2, jos oli painet- */ /* tu Help-napin kohdalla ja arvon 3, jos oli painettu Uusi peli-napin */ /* kohdalla. */ /* */ int nappi(int x,int y) { if (x>9 && x<101) { if (y>21 && y<47) {if (tutki(22)) return(1);} if (y>71 && y<97) {if (tutki(72)) return(2);} if (y>121 && y<147){if (tutki(122)) return (3);} } return(0); } /* */ /* Aliohjelma piirtaa varin mukaan haluttuun kohtaan pelinappulan. */ /* */ void piirranappula(int i,int j,int vari) { katkehiirikursori(); if (vari==BLACK) taulu[i][j]=0; else taulu[i][j]=1; setcolor(vari); setlinestyle(SOLID_LINE,0,NORM_WIDTH); setfillstyle(SOLID_FILL,vari); fillellipse(320-(3-j)*RUUTU,200-(3-i)*RUUTU,RUUTU/5,RUUTU/5); naytahiirikursori(); } /* */ /* Aliohjelma tutkii onko k„ytt„j„n haluama siirto sallittu. */ /* */ int tutkisiirto(int i1,int j1,int i2,int j2) { int hi,hj; if (i2<0 || i2>6 || j2<0 || j2>6) return(0); if (i2==i1-2 && j2==j1) { hi=i2+1; hj=j2; } else if (i2==i1 && j2==j1+2) { hi=i2; hj=j2-1; } else if (i2==i1+2 && j2==j1) { hi=i2-1; hj=j2; } else if (i2==i1 && j2==j1-2) { hi=i2; hj=j2+1; } else return(0); if (siirrettavissa(i2,j2,hi,hj)) { piirranappula(i2,j2,BLACK); piirranappula(hi,hj,WHITE); return(1); } return(0); } /* */ /* Aliohjelma suorittaa pelinappulan siirron. */ /* */ void suorita(int u,int v,int *ok) { int i1,j1,i2,j2,nappi1,nappi2,monta; katkehiirikursori(); setfillstyle(SOLID_FILL,RED); bar(10,430,240,438); naytahiirikursori(); muutos(u,v,&i1,&j1); piirranappula(i1,j1,WHITE); grhiirikursori(pallo,8,8); do hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); while (!monta); muutos(u,v,&i2,&j2); *ok=tutkisiirto(i1,j1,i2,j2); if (!*ok) { setcolor(WHITE); katkehiirikursori(); outtextxy(10,430,"Valitse siirrett„v„ nappula"); naytahiirikursori(); piirranappula(i1,j1,BLACK); taulu[i1][j1]=0; grhiirikursori(nuoli,0,0); } } /* */ /* Aliohjelma suorittaa toistuvat pelirutiinit. */ /* */ int teesiirto() { int x,y,u,v,nappi1,nappi2,monta,ok=0,tila; setcolor(WHITE); katkehiirikursori(); outtextxy(10,430,"Valitse siirrett„v„ nappula"); naytahiirikursori(); while (!ok) { while (kbhit()) getch(); hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); hiirenpainallukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); if (monta) { if (nappula(u,v)) suorita(u,v,&ok); else if (tila=nappi(u,v)) { switch (tila) { case 1: if (lopetetaanko()) return(0); break; case 2: help(); break; case 3: if (uusi_peli()) return(2); } hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); hiirenpainallukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); } else piip(); } else { hiirentila(&x,&y,&nappi1,&nappi2); if (!nappi1 && nappula(x,y)) grhiirikursori(risti,8,8); if (!nappi1 && !nappula(x,y)) grhiirikursori(nuoli,0,0); } } hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); hiirenpainallukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); grhiirikursori(nuoli,0,0); return(1); } /* */ /* Aliohjelma tutkii onko pelikent„ss„ viel„ siirrett„vi„ nappuloita */ /* j„ljell„. */ /* */ int siirrettavia() { int i,j; for (i=0;i<=4;i++) for (j=0;j<=4;j++) { if (taulu[i][j]==1 && taulu[i][j+1]==0 && taulu[i][j+2]==0) return(1); if (taulu[i][j]==1 && taulu[i+1][j]==0 && taulu[i+2][j]==0) return(1); if (taulu[i][j]==0 && taulu[i][j+1]==0 && taulu[i][j+2]==1) return(1); if (taulu[i][j]==0 && taulu[i+1][j]==0 && taulu[i+2][j]==1) return(1); } for (;i<=6;i++) { if (taulu[i][2]==1 && taulu[i][3]==0 &&taulu[i][4]==0) return(1); if (taulu[i][2]==0 && taulu[i][3]==0 &&taulu[i][4]==1) return(1); } for (;j<=6;j++) { if (taulu[2][j]==1 && taulu[3][j]==0 && taulu[4][j]==0) return(1); if (taulu[2][j]==0 && taulu[3][j]==0 && taulu[4][j]==1) return(1); } return(0); } /* */ /* Aliohjelma laskee j„ljell„ olevien nappuloiden (mustien) m„„r„„n. */ /* */ int laskemustat() { int i,j,lkm=0; for (i=0;i<=6;i++) for (j=0;j<=6;j++) if (taulu[i][j]==0) lkm+=1; return(lkm); } int lopetus() { int mustat,k,nappi1,nappi2,monta,u,v; while (siirrettavia()) if (!(k=teesiirto()) || k==2) goto loppu; katkehiirikursori(); setfillstyle(SOLID_FILL,RED); bar(10,430,400,460); setfillstyle(SOLID_FILL,LIGHTRED); bar(160,440,460,456); setcolor(WHITE); mustat=laskemustat(); if (mustat>=5) outtextxy(165,444,"Mit„ jos leikkisit viel„ nukeilla!"); else if (mustat==4) outtextxy(165,444,"Kyll„ se viel„ joskus..."); else if (mustat==3) outtextxy(165,444,"Olet keskinkertainen"); else if (mustat==2) outtextxy(165,444,"Hyv„ suoritus !!!!"); else { if (taulu[3][3]!=0) outtextxy(188,444,"Eritt„in nerokas suoritus !!!!!"); else outtextxy(188,444,"Olet suuri NERO !!!!!!!"); } setfillstyle(SOLID_FILL,LIGHTRED); bar(8,20,106,102); naytahiirikursori(); do hiirenpainallukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); while (!monta && !kbhit()); if (kbhit()) getch(); if (uusi_peli()) k=2; hiirenvapautukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); hiirenpainallukset(VASEN,&nappi1,&nappi2,&monta,&u,&v); loppu: closegraph(); return(k); } int peli() { int k; registerbgidriver(EGAVGA_driver); initialize(); alustapisteet(); naytto(); hiirenalue(0,0,MaxX-10,MaxY-18); naytahiirikursori(); grhiirikursori(nuoli,0,0); k=lopetus(); if (k==0 || k==1) return(0); else return(1); } main() { clrscr(); if (!alustahiiri()) { printf("\n Hiirt„ ei saada k„ytt””n. Ohjelma vaatii Microsoft-"); printf("yhteensopivan hiiren."); } else while(peli()); printf("\n\n %s%s",tyhja,nerotxt); printf("\n %s%s\n\n",tyhja,tekija); } /* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */