//globale variabeles unsigned char bord[7][7]; unsigned char laatste = 10; unsigned int totaal = 0; //alle velden op nul zetten void leegmaken(void) { unsigned char x,y; for (x=0;x<7;x++) { for (y=0;y<7;y++) { bord[x][y] = 0; } } } //een zet doorvoeren naar het bord void invoer(unsigned char wie, unsigned char in) { unsigned char x,y; //als de speler aan de beurt is een zet inlezen if (wie == 1) { while (PORTB != 255) ; in = wie; in = ~in; } //deze lussen zorgen er voor dat het steentje zo laag mogelijk terecht komt for (y=0;y<7;y++) { if (bord[in][y] == 0) { if (wie == 1) bord[in][y] = 10; if (wie ==2) { bord[in][y] = 100; laatste = in; } break; } } return 0; } //de zet van de computer laten zien void uitvoer(void) { if (laatste != 10) PORTA = laatste; } //kijken of iemand verloren heeft //de functie levert 1 terug als de speler wint //en twee als de computer wint unsigned char verloren(void) { unsigned char x,y; unsigned int som; //kijken of er vier op een rij is wordt gedaan door te //kijken of de som van vier vakjes 40(4*10) of 400(4*100) is //horizontaal for (y=0;y<7;y++) { for (x=0;x<=3;x++) { som = bord[x][y] + bord[x+1][y] + bord[x+2][y] + bord[x+3][y]; if (som == 40) return 1; if (som == 400) return 2; } } //verticaal for (x=0;x<7;x++) { for (y=0;y<=3;y++) { som = bord[x][y] + bord[x][y+1] + bord[x][y+2] + bord[x][y+3]; if (som == 40) return 1; if (som == 400) return 2; } } //diagonaal links for (y=0;y<=4;y++) { for (x=3;x<7;x++) { som = bord[x][y] + bord[x-1][y+1] + bord[x-2][y+2] + bord[x-3][y+3]; if (som == 40) return 1; if (som == 400) return 2; } } //diagonaal rechts for (y=0;y<=4;y++) { for (x=0;x<=3;x++) { som = bord[x][y] + bord[x+1][y+1] + bord[x+2][y+2] + bord[x+3][y+3]; if (som == 40) return 1; if (som == 400) return 2; } } return 0; } //kijken of er ergens drie op een rij is //deze functie krijgt door van het hoofdprogramma //naar welke speler hij moet kijken //hij levert het open plekje binnen de vier terug unsigned char drie(unsigned int wie) { unsigned char x,y,z; unsigned int som; if (wie==1) wie = 30; if (wie==2) wie = 300; //horizontaal for (y=0;y<7;y++) { for (x=0;x<=3;x++) { som = bord[x][y] + bord[x+1][y] + bord[x+2][y] + bord[x+3][y]; if (som == wie) { for (z=0;z<=3;z++) { if (bord[x+z][y] == 0) { if (bord[x+z][y-1] == 100 || bord[x+z][y-1] == 10 || y==0) { return (x+z); } } } } } } //verticaal for (x=0;x<7;x++) { for (y=0;y<=3;y++) { som = bord[x][y] + bord[x][y+1] + bord[x][y+2] + bord[x][y+3]; if (som == wie) { return x; } } } //diagonaal links for (y=0;y<=4;y++) { for (x=3;x<7;x++) { som = bord[x][y] + bord[x-1][y+1] + bord[x-2][y+2] + bord[x-3][y+3]; if (som == wie) { for (z=0;z<=3;z++) { if (bord[x-z][y+z] == 0) { if (bord[x-z][y+z-1] == 100 || bord[x-z][y+z-1] == 10) { return (x-z); } } } } } } //diagonaal rechts for (y=0;y<=4;y++) { for (x=0;x<=3;x++) { som = bord[x][y] + bord[x+1][y+1] + bord[x+2][y+2] + bord[x+3][y+3]; if (som == wie) { for (z=0;z<=3;z++) { if (bord[x+z][y+z] == 0) { if (bord[x+z][y+z-1] == 100 || bord[x+z][y+z-1] == 10) { return (x+z); } } } } } } //niets gevonden? dan levert hij 10 terug return 10; } //hetzelfde maar dan met twee op een rij unsigned char twee(unsigned int wie) { unsigned char x,y,z; unsigned int som; if (wie==1) wie = 20; if (wie==2) wie = 200; //horizontaal for (y=0;y<7;y++) { for (x=0;x<=3;x++) { som = bord[x][y] + bord[x+1][y] + bord[x+2][y] + bord[x+3][y]; if (som == wie) { for (z=0;z<=3;z++) { if (bord[x+z][y] == 0) { if (bord[x+z][y-1] == 100 || bord[x+z][y-1] == 10 || y==0) { //dit zorgt er voor dat er niet dit gebeurt %0## maar 0%## if (z == 0 && bord[x+z+1][y] == 0 && (bord[x+z+1][y-1] != 0 || y == 0)) return (x+z+1); return (x+z); } } } } } } //verticaal for (x=0;x<7;x++) { for (y=0;y<=3;y++) { som = bord[x][y] + bord[x][y+1] + bord[x][y+2] + bord[x][y+3]; if (som == wie) { return x; } } } //diagonaal links for (y=0;y<=4;y++) { for (x=3;x<7;x++) { som = bord[x][y] + bord[x-1][y+1] + bord[x-2][y+2] + bord[x-3][y+3]; if (som == wie) { for (z=0;z<=3;z++) { if (bord[x-z][y+z] == 0) { if (bord[x-z][y+z-1] == 100 || bord[x-z][y+z-1] == 10) { return (x-z); } } } } } } //diagonaal rechts for (y=0;y<=4;y++) { for (x=0;x<=3;x++) { som = bord[x][y] + bord[x+1][y+1] + bord[x+2][y+2] + bord[x+3][y+3]; if (som == wie) { for (z=0;z<=3;z++) { if (bord[x+z][y+z] == 0) { if (bord[x+z][y+z-1] == 100 || bord[x+z][y+z-1] == 10) { return (x+z); } } } } } } return 10; } main() { unsigned char driezet, tweezet, wil, ok, testen; unsigned int aantal; TRISA = 0; TRISB = 255; leegmaken(); uitvoer(); while (1==1) { //eerst speler een zet laten doen invoer(1,0); //totaal aantal zetten ophogen totaal++; //kijken of de speler al gewonnen heeft if (verloren() == 1) { uitvoer(); //printf("jij wint :(\n"); return 0; } //zoeken of de computer een drie op een rij heeft die hij af kan maken driezet = drie(2); //iets gevonden, zetten! if (driezet < 10) invoer(2,driezet); //niets gevonden? if (driezet == 10) { //kijken of er een drie op een rij is van de speler //die geblokkeerd moet/kan worden driezet = drie(1); //gevonden? blokkeren! if (driezet < 10) invoer(2,driezet); //niets gevonden? if (driezet == 10) { //twee op een rij zoeken en er drie van maken tweezet = twee(2); if (tweezet < 10) invoer(2,tweezet); if (tweezet == 10) { //kijken of de speler twee op een rij heeft en blokkeren tweezet = twee(1); if (tweezet < 10) invoer(2,tweezet); if (tweezet == 10) { //nog steeds niks gevonden? //dan maar willekeurig aantal = 0; do { aantal++; ok = 0; wil = 5; testen = drie(1); if (wil != testen) ok = 1; //maar dan wel zo dat hij geen achtelijke zet doet //na 1000 keer proberen nog niks? Dan toch maar doen als het past }while ((bord[wil][6] != 0 && ok == 0) || (aantal > 1000 && bord[wil][6] != 0)); invoer(2,wil); } } } } totaal++; //kijken of de computer vie rop een rij heeft if (verloren() == 2) { uitvoer(); //printf("ik win :)\n"); return 0; } //remise if (totaal == 49) { uitvoer(); //printf("remise :|\n"); return 0; } uitvoer(); } }