#include "ataxx.h" // bord.cpp ataxxbord::ataxxbord (int aantalkolommen, int aantalrijen) { // constructor int i; // hulpvariabele voor iteratie maxkolom = aantalkolommen; // onthoud maxkolom als afmeting maxrij = aantalrijen; // onthoud maxrij als afmeting // dynamische array maken veld = new int * [maxkolom]; for (i=0;i maxkolom-1 || test.ydoel > maxrij-1 ) return false; if ( test.xdoel < 0 || test.ydoel < 0 ) return false; // test 2: staat er op het bronveld wel een eigen virus? if ( veld[test.xbron][test.ybron] != test.speler ) return false; // test 3: is het doelvak wel vrij? if ( veld[test.xdoel][test.ydoel] != 0 ) return false; // test 4: afstand bron-doel moet 1 of 2 vakjes zijn, maar niet groter dx = test.xdoel - test.xbron; dy = test.ydoel - test.ybron; // absolute waarden van maken if ( dx < 0 ) dx *= -1; if ( dy < 0 ) dy *= -1; if ( dx > 2 || dy > 2 ) return false; // als alle tests doorstaan zijn, is de zet toegestaan return true; } void ataxxbord::doezet (zet doen) { // voer een zet uit int dx,dy,afstand; // afstanden over x en y die een zet doet // nieuwe veld vullen met virus (zowel bij clonatie als verplaatsing) veld[doen.xdoel][doen.ydoel] = doen.speler; // aangrenzende (vijandige) virussen overnemen for ( dx=doen.xdoel-1; dx<=doen.xdoel+1; dx++ ) { for ( dy=doen.ydoel-1; dy<=doen.ydoel+1; dy++ ) { if ( dx>=0 && dy>=0 && dx 0 ) veld[dx][dy] = doen.speler; } } } // voor het effect is het van belang of het gaat om een verplaatsing // of een clonering // verplaatsingen gaan over afstand 2, clonaties over afstand 1 // bepaald delta(x) en delta(y) dx = doen.xdoel - doen.xbron; dy = doen.ydoel - doen.ybron; if ( dx < 0 ) dx *= -1; if ( dy < 0 ) dy *= -1; // bepaal nu de afstand if ( dx >= dy ) afstand = dx; else afstand = dy; // bij verplaatsing oude veld legen if ( afstand==2 ) veld[doen.xbron][doen.ybron] = 0; } int ataxxbord::telvirussen (int speler) { // telt het aantal virussen voor een speler int x,y; // hulpvariabelen voor iteraties door veld int aantal=0; // aantal gevonden virussen for (x=0;x0) return true; else return false; } zet ataxxbord::allezetten (int speler, int maxzet) { // doorloopt alle mogelijke zetten, en geeft de laatste zet terug of // de de "maxzet"-ste zet (als maxzet==0 dan de laatste zet) int x,y; // hulpvariabelen voor iteraties door veld int dx,dy; // afstanden over x en y die een zet doet int aantal=0; // aantal gevonden mogelijke zetten zet test; // testzet (struct) zet mogenlijkezet; // onthoud de beste mogelijke zet (struct) // initialiseren mogenlijkezet; mocht er geen mogenlijke zet // gevonden worden, dan wordt toch deze "lege" zet teruggegeven // om een compiler warning te voorkomen mogenlijkezet.speler = speler; mogenlijkezet.xbron = 0; mogenlijkezet.ybron = 0; mogenlijkezet.xdoel = 0; mogenlijkezet.ydoel = 0; mogenlijkezet.aantal = 0; // kijk nu voor alle virussen van de speler wat er mogelijk is for (x=0;x maxscore ) { maxscore = score; maxzet = i; } // herstel het juiste bord for (x=0;x