Hulp nodig met AI

Status
Niet open voor verdere reacties.

Dizaster

Gebruiker
Lid geworden
16 okt 2007
Berichten
35
Code:
void compMove() {
     short int square = 0;
     short int score = 0;
     short int test1 = 0;
     short int test2 = 0;
     short int test3 = 0;
     short int test4 = 0;
     short int test5 = 0;
     short int test6 = 0;
     short int test7 = 0;
     short int test8 = 0;
     short int test9 = 0;
     
     if (square1 == ' ') {
          if ((square2 == 'O' && square3 == 'O') || (square4 == 'O' && square7 == 'O') || (square5 == 'O' && square9 == 'O')) test1 = 1000;                 
          else if ((square2 == 'X' && square3 == 'X') || (square4 == 'X' && square7 == 'X') || (square5 == 'X' && square9 == 'X')) test1 = 100;
          else if (square2 == 'X' || square3 == 'X' || square4 == 'X' || square5 == 'X' || square7 == 'X' || square9 == 'X') test1 = 10;
          else test1 = 1;             
     }
     if (square3 == ' ') {          
          if ((square2 == 'O' && square1 == 'O') || (square5 == 'O' && square7 == 'O') || (square6 == 'O' && square9 == 'O')) test3 = 1000;      
          else if ((square2 == 'X' && square1 == 'X') || (square5 == 'X' && square7 == 'X') || (square6 == 'X' && square9 == 'X')) test3 = 100;
          else if (square2 == 'X' || square1 == 'X' || square5 == 'X' || square6 == 'X' || square7 == 'X' || square9 == 'X') test3 = 10;
          else test3 = 1;             
     }
     if (square7 == ' ') {          
          if ((square1 == 'O' && square4 == 'O') || (square3 == 'O' && square5 == 'O') || (square8 == 'O' && square9 == 'O')) test7 = 1000;      
          else if ((square1 == 'X' && square4 == 'X') || (square3 == 'X' && square5 == 'X') || (square8 == 'X' && square9 == 'X')) test7 = 100;
          else if (square1 == 'X' || square4 == 'X' || square3 == 'X' || square5 == 'X' || square8 == 'X' || square9 == 'X') test7 = 10;
          else test7 = 1;             
     }
     if (square9 == ' ') {          
          if ((square1 == 'O' && square5 == 'O') || (square3 == 'O' && square6 == 'O') || (square7 == 'O' && square8 == 'O')) test9 = 1000;      
          else if ((square1 == 'X' && square5 == 'X') || (square3 == 'X' && square6 == 'X') || (square7 == 'X' && square8 == 'X')) test9 = 100;
          else if (square1 == 'X' || square5 == 'X' || square3 == 'X' || square6 == 'X' || square7 == 'X' || square8 == 'X') test9 = 10;
          else test9 = 1;             
     }
     if (square2 == ' ') {        
          if ((square1 == 'O' && square3 == 'O') || (square5 == 'O' && square8 == 'O')) test2 = 1000;      
          else if ((square1 == 'X' && square3 == 'X') || (square5 == 'X' && square8 == 'X')) test8 = 100;
          else if (square1 == 'X' || square3 == 'X' || square5 == 'X' || square8 == 'X') test2 = 10;
          else test2 = 1;                             
     }
     if (square4 == ' ') {      
          if ((square1 == 'O' && square7 == 'O') || (square5 == 'O' && square6 == 'O')) test4 = 1000;      
          else if ((square1 == 'X' && square7 == 'X') || (square5 == 'X' && square6 == 'X')) test4 = 100;
          else if (square1 == 'X' || square7 == 'X' || square5 == 'X' || square6 == 'X') test4 = 10;
          else test4 = 1;                             
     }
     if (square6 == ' ') {     
          if ((square3 == 'O' && square9 == 'O') || (square4 == 'O' && square5 == 'O')) test6 = 1000;      
          else if ((square3 == 'X' && square9 == 'X') || (square4 == 'X' && square5 == 'X')) test6 = 100;
          else if (square3 == 'X' || square9 == 'X' || square4 == 'X' || square5 == 'X') test6 = 10;
          else test6 = 1;                             
     }
     if (square8 == ' ') {     
          if ((square2 == 'O' && square5 == 'O') || (square7 == 'O' && square9 == 'O')) test8 = 1000;      
          else if ((square2 == 'X' && square5 == 'X') || (square7 == 'X' && square9 == 'X')) test8 = 100;
          else if (square2 == 'X' || square5 == 'X' || square7 == 'X' || square9 == 'X') test8 = 10;
          else test8 = 1;                             
     }
     if (square5 == ' ') {      
          if ((square1 == 'O' && square9 == 'O') || (square2 == 'O' && square8 == 'O') || (square3 == 'O' && square7 == 'O') || (square4 == 'O' && square6 == 'O')) test5 = 1000;      
          else if ((square1 == 'X' && square9 == 'X') || (square2 == 'X' && square8 == 'X') || (square3 == 'X' && square7 == 'X') || (square4 == 'X' && square6 == 'X')) test5 = 100;
          else if (square1 == 'X' || square9 == 'X' || square2 == 'X' || square8 == 'X' || square3 == 'X' || square7 == 'X' || square4 == 'X' || square6 == 'X') test5 = 10;
          else test5 = 1;
     }
     
     if (score < test1) square = 1; score = test1 + 1;
     if (score < test2) square = 2; score = test2 + 1;
     if (score < test3) square = 3; score = test3 + 1;    
     if (score < test4) square = 4; score = test4 + 1;
     if (score < test5) square = 5; score = test5 + 1;
     if (score < test6) square = 6; score = test6 + 1;
     if (score < test7) square = 7; score = test7 + 1;
     if (score < test8) square = 8; score = test8 + 1;
     if (score < test9) square = 9; score = test9 + 1;
     drawFieldPC(square);
}

Dit is een hele simpele AI voor boter kaas en eieren, het lijkt mij ok, maar hij weigert als bijvoorbeeld 1 en 2 kruisje zijn om dan in 3 een rondje te zetten, terwijl hij dat volgens mij hoort te doen als dat het enige vakje is met een "score" van 101

Code:
while (boolWin() != true && checkFull() != true) {
     if (firstTurn() != true) { 
     if (boolWin() != true) compMove();
     }
     if (boolWin() == true) goto gogo;      
     square = inputSquare1P();
     drawField1P(square);
}

Zo wordt de functie compMove aangeroepen, zoals je ziet heb ik al geprobeerd om de computer in het script eerst te laten gaan, behalve bij de 1e beurt om op het scherm de speler het eerst te laten gaan, Ik weet dat het er slordig uitziet, maar daar was ik nog niet aan toe. Wat is er fout aan deze AI functie waardoor hij niet doet wat hij moet doen. Hij moet elk vakje checken en daar een waarde aan toe kennen en dan op het vakje met de hoogste waarde de functie drawField1P() uitvoeren.

Alvast bedankt


EDIT: als ik een kruisje op 5 zet dan zet de AI hem op 6 terwijl hij volgens dit AI script hem dan op 1 zou moeten zetten.. ?? raar ??
 
Laatst bewerkt:
Heb het al opgelost, ik heb

Code:
     if (score < test1) square = 1; score = test1 + 1;
     if (score < test2) square = 2; score = test2 + 1;
     if (score < test3) square = 3; score = test3 + 1;    
     if (score < test4) square = 4; score = test4 + 1;
     if (score < test5) square = 5; score = test5 + 1;
     if (score < test6) square = 6; score = test6 + 1;
     if (score < test7) square = 7; score = test7 + 1;
     if (score < test8) square = 8; score = test8 + 1;

vervangen door:

Code:
     if (square1 == ' ') {
          if (test1 >= test2 && test1 >= test3 && test1 >= test4 && test1 >= test5 && test1 >= test6 && test1 >= test7 && test1 >= test8 && test1 >= test9) square = 1;
     }
     if (square2 == ' ') {
          if (test2 >= test1 && test2 >= test3 && test2 >= test4 && test2 >= test5 && test2 >= test6 && test2 >= test7 && test2 >= test8 && test2 >= test9) square = 2;
     }
     if (square3 == ' ') {
          if (test3 >= test1 && test3 >= test2 && test3 >= test4 && test3 >= test5 && test3 >= test6 && test3 >= test7 && test3 >= test8 && test3 >= test9) square = 3;
     }
     if (square4 == ' ') {
          if (test4 >= test1 && test4 >= test2 && test4 >= test3 && test4 >= test5 && test4 >= test6 && test4 >= test7 && test4 >= test8 && test4 >= test9) square = 4;
     }
     if (square5 == ' ') {
          if (test5 >= test1 && test5 >= test2 && test5 >= test3 && test5 >= test4 && test5 >= test6 && test5 >= test7 && test5 >= test8 && test5 >= test9) square = 5;
     }
     if (square6 == ' ') {
          if (test6 >= test1 && test6 >= test2 && test6 >= test3 && test6 >= test4 && test6 >= test5 && test6 >= test7 && test6 >= test8 && test6 >= test9) square = 6;
     }
     if (square7 == ' ') {
          if (test7 >= test1 && test7 >= test2 && test7 >= test3 && test7 >= test4 && test7 >= test5 && test7 >= test6 && test7 >= test8 && test7 >= test9) square = 7;
     }
     if (square8 == ' ') {
          if (test8 >= test1 && test8 >= test2 && test8 >= test3 && test8 >= test4 && test8 >= test5 && test8 >= test6 && test8 >= test7 && test8 >= test9) square = 8;
     }
     if (square9 == ' ') {
          if (test9 >= test1 && test9 >= test2 && test9 >= test3 && test9 >= test4 && test9 >= test5 && test9 >= test6 && test9 >= test7 && test9 >= test8) square = 9;
     }


EDITEDITEDITEDIT:

hij is nog steeds buggy :(

Code:
void compMove() {
     short int square = 0;                     //variabelen declareren
     short int test1 = 0;
     short int test2 = 0;
     short int test3 = 0;
     short int test4 = 0;
     short int test5 = 0;
     short int test6 = 0;
     short int test7 = 0;
     short int test8 = 0;
     short int test9 = 0;

/*Hieronder wordt voor vak 1-9 de score ervan bepaald, de AI kiest het vak met de hoogste score en zet daar zijn O neer.
Eerst word bepaald of vak 1-9 nog leeg is, dan word gekeken naar de andere vakken en aan de hand daarvan de score van vak 1-9 bepaald.
Op het moment is het hele simpele AI maar het is alleen maar om te testen.*/

     
     if (square1 == ' ') {                                                                                                                                                                                 
          if ((square2 == 'O' && square3 == 'O') || (square4 == 'O' && square7 == 'O') || (square5 == 'O' && square9 == 'O')) test1 = 1000;                  
          else if ((square2 == 'X' && square3 == 'X') || (square4 == 'X' && square7 == 'X') || (square5 == 'X' && square9 == 'X')) test1 = 100;            
          else if (square2 == 'X' || square3 == 'X' || square4 == 'X' || square5 == 'X' || square7 == 'X' || square9 == 'X') test1 = 10;                           
          else test1 = 1;             
     }

     if (square3 == ' ') {          
          if ((square2 == 'O' && square1 == 'O') || (square5 == 'O' && square7 == 'O') || (square6 == 'O' && square9 == 'O')) test3 = 1000;      
          else if ((square2 == 'X' && square1 == 'X') || (square5 == 'X' && square7 == 'X') || (square6 == 'X' && square9 == 'X')) test3 = 100;
          else if (square2 == 'X' || square1 == 'X' || square5 == 'X' || square6 == 'X' || square7 == 'X' || square9 == 'X') test3 = 10;
          else test3 = 1;             
     }

     if (square7 == ' ') {          
          if ((square1 == 'O' && square4 == 'O') || (square3 == 'O' && square5 == 'O') || (square8 == 'O' && square9 == 'O')) test7 = 1000;      
          else if ((square1 == 'X' && square4 == 'X') || (square3 == 'X' && square5 == 'X') || (square8 == 'X' && square9 == 'X')) test7 = 100;
          else if (square1 == 'X' || square4 == 'X' || square3 == 'X' || square5 == 'X' || square8 == 'X' || square9 == 'X') test7 = 10;
          else test7 = 1;             
     }

     if (square9 == ' ') {          
          if ((square1 == 'O' && square5 == 'O') || (square3 == 'O' && square6 == 'O') || (square7 == 'O' && square8 == 'O')) test9 = 1000;      
          else if ((square1 == 'X' && square5 == 'X') || (square3 == 'X' && square6 == 'X') || (square7 == 'X' && square8 == 'X')) test9 = 100;
          else if (square1 == 'X' || square5 == 'X' || square3 == 'X' || square6 == 'X' || square7 == 'X' || square8 == 'X') test9 = 10;
          else test9 = 1;             
     }

     if (square2 == ' ') {      
          if ((square1 == 'O' && square3 == 'O') || (square5 == 'O' && square8 == 'O')) test4 = 1000;      
          else if ((square1 == 'X' && square3 == 'X') || (square5 == 'X' && square8 == 'X')) test4 = 100;
          else if (square1 == 'X' || square3 == 'X' || square5 == 'X' || square8 == 'X') test4 = 10;
          else test4 = 1;                             
     }

     if (square4 == ' ') {      
          if ((square1 == 'O' && square7 == 'O') || (square5 == 'O' && square6 == 'O')) test4 = 1000;      
          else if ((square1 == 'X' && square7 == 'X') || (square5 == 'X' && square6 == 'X')) test4 = 100;
          else if (square1 == 'X' || square7 == 'X' || square5 == 'X' || square6 == 'X') test4 = 10;
          else test4 = 1;                             
     }

     if (square6 == ' ') {     
          if ((square3 == 'O' && square9 == 'O') || (square4 == 'O' && square5 == 'O')) test6 = 1000;      
          else if ((square3 == 'X' && square9 == 'X') || (square4 == 'X' && square5 == 'X')) test6 = 100;
          else if (square3 == 'X' || square9 == 'X' || square4 == 'X' || square5 == 'X') test6 = 10;
          else test6 = 1;                             
     }
     if (square8 == ' ') {     
          if ((square2 == 'O' && square5 == 'O') || (square7 == 'O' && square9 == 'O')) test8 = 1000;      
          else if ((square2 == 'X' && square5 == 'X') || (square7 == 'X' && square9 == 'X')) test8 = 100;
          else if (square2 == 'X' || square5 == 'X' || square7 == 'X' || square9 == 'X') test8 = 10;
          else test8 = 1;                             
     }

     if (square5 == ' ') {      
          if ((square1 == 'O' && square9 == 'O') || (square2 == 'O' && square8 == 'O') || (square3 == 'O' && square7 == 'O') || (square4 == 'O' && square6 == 'O')) test5 = 1000;      
          else if ((square1 == 'X' && square9 == 'X') || (square2 == 'X' && square8 == 'X') || (square3 == 'X' && square7 == 'X') || (square4 == 'X' && square6 == 'X')) test5 = 100;
          else if (square1 == 'X' || square9 == 'X' || square2 == 'X' || square8 == 'X' || square3 == 'X' || square7 == 'X' || square4 == 'X' || square6 == 'X') test5 = 10;
          else test5 = 1;
     }


//Hieronder wordt het vakje gezocht en geselecteerd die in de bovenstaande if loops de hoogste score heeft gekregen.

     if (square1 == ' ') {
          if (test1 >= test2 && test1 >= test3 && test1 >= test4 && test1 >= test5 && test1 >= test6 && test1 >= test7 && test1 >= test8 && test1 >= test9) square = 1;
     }

     if (square2 == ' ') {
          if (test2 >= test1 && test2 >= test3 && test2 >= test4 && test2 >= test5 && test2 >= test6 && test2 >= test7 && test2 >= test8 && test2 >= test9) square = 2;
     }

     if (square3 == ' ') {
          if (test3 >= test1 && test3 >= test2 && test3 >= test4 && test3 >= test5 && test3 >= test6 && test3 >= test7 && test3 >= test8 && test3 >= test9) square = 3;
     }

     if (square4 == ' ') {
          if (test4 >= test1 && test4 >= test2 && test4 >= test3 && test4 >= test5 && test4 >= test6 && test4 >= test7 && test4 >= test8 && test4 >= test9) square = 4;
     }

     if (square5 == ' ') {
          if (test5 >= test1 && test5 >= test2 && test5 >= test3 && test5 >= test4 && test5 >= test6 && test5 >= test7 && test5 >= test8 && test5 >= test9) square = 5;
     }

     if (square6 == ' ') {
          if (test6 >= test1 && test6 >= test2 && test6 >= test3 && test6 >= test4 && test6 >= test5 && test6 >= test7 && test6 >= test8 && test6 >= test9) square = 6;
     }

     if (square7 == ' ') {
          if (test7 >= test1 && test7 >= test2 && test7 >= test3 && test7 >= test4 && test7 >= test5 && test7 >= test6 && test7 >= test8 && test7 >= test9) square = 7;
     }

     if (square8 == ' ') {
          if (test8 >= test1 && test8 >= test2 && test8 >= test3 && test8 >= test4 && test8 >= test5 && test8 >= test6 && test8 >= test7 && test8 >= test9) square = 8;
     }

     if (square9 == ' ') {
          if (test9 >= test1 && test9 >= test2 && test9 >= test3 && test9 >= test4 && test9 >= test5 && test9 >= test6 && test9 >= test7 && test9 >= test8) square = 9;
     } 


//Roept de functie aan die het veld tekent, de input, square, bepaald op welk vakje de O van de computer komt.
               
     drawFieldPC(square);
}

wordt nog steeds op eerdergenoemde manier aangeroepen.

Bij deze stappen gaat het mis:

1:
X |---|---
--+--+--
---|---|---
--+--+--
--- |--- |---
2:
X |--- |---
--+--+--
--- |--- |---
--+--+--
--- |--- |O
3:
X |--- |X
--+--+--
--- |--- |---
--+--+--
--- |--- |O
4:
X |--- |X
--+--+--
--- |--- |---
--+--+--
O|--- |O

Hier gaat het mis, waar hij hem op 2 moet zetten zet hij hem op 7. Hij denkt dus dat vakje 7 de hoogste score heeft, alhoewel vak 2 de score 100 zou moeten hebben i.p.v. 1.
Als ik de waarde als output laat verschijnen krijg ik dit:
square:7 <-- moet 2 zijn
test1:0
test2:0 <-- moet 100 zijn
test3:0
test4:10
test5:10
test6:10
test7:10
test8:1
test9:0

Ook bij latere zetten blijft hij test2 als 0 zien. Ook bij dit veld:
X|---|X
X|---|O
O|X|O

geeft hij aan dat 4 100 is terwijl 4 hier de waarde 0 zou moeten hebben omdat 4 niet leeg is, maar gevuld.
Waardoor komt dit? en hoe dit te fixen?
 
Laatst bewerkt:
voor mij is je code totaal onleesbaar dus ik ga het niet eens proberen, misschien moet je het even ordenen dan kan ik er wel even naar kijken
 
Daar was ik al bang voor, ik zal het proberen en dan de vorige post aanpassen.

Wat is er nog niet duidelijk nu?
 
Laatst bewerkt:
Je kunt sowieso een aantal dingen doen om de code leesbaarder te maken. Je zou bijvoorbeeld het board kunnen representeren als een array ipv allemaal verschillende variabelen.

Code:
const int squareN = 9;
char board[squareN]

Op die manier kun je dus iets doen als:

Code:
if( (board[0] == Player) && (board[1] == Player) && (board[2] == Player) )
   return true;
// Dit zou bijvoorbeeld in een controle functie kunnen staan waarbij 'Player' de waarde is van de huidige speler(is makkelijker dan de code dubbel te moeten schrijven voor beide spelers)


Op die manier voorkom je dus ook vreemde code als:

Code:
     if (score < test1) square = 1; score = test1 + 1;
     if (score < test2) square = 2; score = test2 + 1;
     if (score < test3) square = 3; score = test3 + 1;    
     if (score < test4) square = 4; score = test4 + 1;
     if (score < test5) square = 5; score = test5 + 1;
     if (score < test6) square = 6; score = test6 + 1;
     if (score < test7) square = 7; score = test7 + 1;
     if (score < test8) square = 8; score = test8 + 1;

->

Code:
for(int i = 0; i < N; i++)
   if( score < test[i] ) square = i+1, score = test[i]++;

Wat vind je zelf leesbaarder ? :)
 
dat tweede natuurlijk maar ik ben net weer opnieuw begonnen ( 1 dag ofzo ^^ ) en ik kan me die dingen niet herinneren en toen begon ik met dit te maken op de lange manier en was van plan als het eenmaal werkte het dan allemaal simpeler te schrijven, maar ik zit op dit kleine stukje vast, ik zal vanavond wel proberen om alles simpeler te zetten, bedankt, maar als je het probleem nu al ziet dan.. :)


en die waarde voor Player heb ik al, maar hier niet gebruikt omdat ik hier de functie die ik gebruik om de waarde om te keren niet gebruik vanwege wat rare bijwerkingen van de slordigheden in mijn script :) ik gebruik het wel bij 2 player modus
 
Laatst bewerkt:
dat tweede natuurlijk maar ik ben net weer opnieuw begonnen ( 1 dag ofzo ^^ ) en ik kan me die dingen niet herinneren en toen begon ik met dit te maken op de lange manier en was van plan als het eenmaal werkte het dan allemaal simpeler te schrijven, maar ik zit op dit kleine stukje vast, ik zal vanavond wel proberen om alles simpeler te zetten, bedankt, maar als je het probleem nu al ziet dan.. :)

Je maakt het voor jezelf ook alleen maar ingewikkelder als je het op de huidige manier doet. Je moet het uiteraard zelf weten, en natuurlijk begrijp ik dat wanneer je nog niet zo lang bezig bent dat het allemaal wat te veel van het goed is. Maar als je wat structuur in je programma brengt dan is het ook makkelijker om uit te drukken wat je nu precies wilt. (bijvoorbeeld om te controleren of er iemand heeft gewonnen; Kijken of er een locatie vrij is, etc.)

Het is dat ik nu niet zo heel veel tijd heb. (ben zelf bezig met een programma te schrijven, en is nog wel wat werk.)

Zal kijken of ik je morgen een voorbeeld kan maken. :)
 
dankje, maar ik zal het nu proberen wat schoon te maken ( ik weet wel hoe ( met behulp van wat zoeken ) ) en als ik dan zelf het probleem nog niet zie dan post ik wel
 
dankje, maar ik zal het nu proberen wat schoon te maken ( ik weet wel hoe ( met behulp van wat zoeken ) ) en als ik dan zelf het probleem nog niet zie dan post ik wel

http://www.helpmij.nl/forum/showpost.php?p=2437190&postcount=5

Daar staat een voorbeeld in de juiste richting.

Je zou dan bijvoorbeeld een controle functie kunnen schrijven die je na elke zet aanroept(dus nog voordat je de speler wijzigt); Het hangt een beetje van je structuur af, maar dat zou dan iets als onderstaande kunnen worden:

Code:
bool checkWin(const char Player){
   if( (board[0] == Player) && (board[1] == Player) && (board[2] == Player) )
      return true;
   if( (board[0] == Player) && (board[4] == Player) && (board[8] == Player) )
      return true;
  // overige controles
  return false; // return standaard false;
}
 
Jaa dankje, ik heb nu alles opnieuw geschreven, behalve de AI ( das best lastig ) en de meeste functies zijn nu wel de helft korter. Alleen die AI herschrijven gaat lastig, ik kom niet verder dan dit: en dan zou ik voor elke groep die niet hetzelfde verband heeft een nieuwe moeten maken

Code:
     if (square1 == ' ') {
          if ((square2 == 'O' && square3 == 'O') || (square4 == 'O' && square7 == 'O') || (square5 == 'O' && square9 == 'O')) test1 = 1000;                 
          else if ((square2 == 'X' && square3 == 'X') || (square4 == 'X' && square7 == 'X') || (square5 == 'X' && square9 == 'X')) test1 = 100;
          else if (square2 == 'X' || square3 == 'X' || square4 == 'X' || square5 == 'X' || square7 == 'X' || square9 == 'X') test1 = 10;
          else test1 = 1;             
     }
     if (square3 == ' ') {          
          if ((square2 == 'O' && square1 == 'O') || (square5 == 'O' && square7 == 'O') || (square6 == 'O' && square9 == 'O')) test3 = 1000;      
          else if ((square2 == 'X' && square1 == 'X') || (square5 == 'X' && square7 == 'X') || (square6 == 'X' && square9 == 'X')) test3 = 100;
          else if (square2 == 'X' || square1 == 'X' || square5 == 'X' || square6 == 'X' || square7 == 'X' || square9 == 'X') test3 = 10;
          else test3 = 1;             
     }

wordt

Code:
     int aa = 3;
     int ab = 4
     
     for(int i = 0; i < 2; i = i + 2) {
          if (SQUARE[i+1] == ' ') {
               if ((SQUARE[2] == 'O' && SQUARE[aa] == 'O') || (SQUARE[ab] == 'O' && SQUARE[7] == 'O') || (SQUARE[ab+1] == 'O' && SQUARE[9] == 'O')) test[i+1] = 1000;
               else if ((SQUARE[2] == 'X' && SQUARE[aa] == 'X') || (SQUARE[ab] == 'X' && SQUARE[7] == 'X') || (SQUARE[ab+1] == 'X' && SQUARE[9] == 'X')) test[i+1] = 100;
               else if ((SQUARE[2] == 'X' || SQUARE[aa] == 'X') || (SQUARE[ab] == 'X' || SQUARE[7] == 'X' || SQUARE[ab+1] == 'X' || SQUARE[9] == 'X') test[i+1] = 10;
               else test[i+1] = 1;
          }
          aa = aa - 2;
          ab = ab + 1;
     }

Ik weet niet of dit zoveel beter leesbaar is, maar veel meer kan ik van deze onregelmatige if loops niet maken


Nou heb ik geprobeerd het compacter te maken, maar zonder succes, nu zijn alle waarden verkeerd. Ik zal het wel fout hebben gedaan, maar hier is het, ik zal het morgen wel helemaal vanaf het begin opnieuw maken, tenzij iemand ziet wat hier totaal niet klopt.

Code:
void compMove() {
     int square = 0;
     int test[board];
     
     int aa = 3;
     int ab = 4;
     int ac;
     int ad;
     
     for(int i = 0; i < 2; i = i + 2) {
          if (SQUARE[i+1] == ' ') {
               if ((SQUARE[2] == 'O' && SQUARE[aa] == 'O') || (SQUARE[ab] == 'O' && SQUARE[7] == 'O') || (SQUARE[ab+1] == 'O' && SQUARE[9] == 'O')) test[i+1] = 1000;
               else if ((SQUARE[2] == 'X' && SQUARE[aa] == 'X') || (SQUARE[ab] == 'X' && SQUARE[7] == 'X') || (SQUARE[ab+1] == 'X' && SQUARE[9] == 'X')) test[i+1] = 100;
               else if (SQUARE[2] == 'X' || SQUARE[aa] == 'X' || SQUARE[ab] == 'X' || SQUARE[7] == 'X' || SQUARE[ab+1] == 'X' || SQUARE[9] == 'X') test[i+1] = 10;
               else test[i+1] = 1;
          }
          aa = aa - 2;
          ab = ab + 1;
     }
     
     aa = 8;
     ab = 4;
     
     for(int i = 0; i < 2; i = i + 2) {
          if (SQUARE[i+7] == ' ') {
               if ((SQUARE[1] == 'O' && SQUARE[ab] == 'O') || (SQUARE[3] == 'O' && SQUARE[ab+1] == 'O') || (SQUARE[aa] == 'O' && SQUARE[aa+1] == 'O')) test[i+7] = 1000;   
               else if ((SQUARE[1] == 'X' && SQUARE[ab] == 'X') || (SQUARE[3] == 'X' && SQUARE[ab+1] == 'X') || (SQUARE[aa] == 'X' && SQUARE[aa+1] == 'X')) test[i+7] = 100;
               else if (SQUARE[1] == 'X' || SQUARE[ab] == 'X' || SQUARE[3] == 'X' || SQUARE[ab+1] == 'X' || SQUARE[aa] == 'X' || SQUARE[aa+1] == 'X') test[i+7] = 10;
               else test[i+7] = 1;             
          }
          aa = aa - 1;
          ab = ab + 1;        
     }
     
     aa = 3;
     ab = 8;
     
     for(int i = 0; i < 2; i = i + 2) {
          if (SQUARE[i+2] == ' ') {
               if ((SQUARE[1] == 'O' && SQUARE[aa] == 'O') || (SQUARE[5] == 'O' && SQUARE[ab] == 'O')) test[i+2] = 1000; 
               else if ((SQUARE[1] == 'X' && SQUARE[aa] == 'X') || (SQUARE[5] == 'X' && SQUARE[ab] == 'X')) test[i+2] = 100;
               else if (SQUARE[1] == 'X' || SQUARE[aa] == 'X' || SQUARE[5] == 'X' || SQUARE[ab] == 'X') test[i+2] = 10;
               else test[i+2] = 1;                
          }
          aa = aa + 4;
          ab = ab - 2;        
     }
     
     aa = 3;
     ab = 9;
     ac = 4;
     ad = 5;
     
     for(int i = 0; i < 2; i = i + 2) {
          if (SQUARE[i+6] == ' ') {                          
               if ((SQUARE[aa] == 'O' && SQUARE[ab] == 'O') || (SQUARE[ac] == 'O' && SQUARE[ad] == 'O')) test[i+6] = 1000;
               else if ((SQUARE[aa] == 'X' && SQUARE[ab] == 'X') || (SQUARE[ac] == 'X' && SQUARE[ad] == 'X')) test[i+6] = 100;
               else if (SQUARE[aa] == 'X' || SQUARE[ab] == 'X' || SQUARE[ac] == 'X' || SQUARE[ad] == 'X') test[i+6] = 10;
               else test[i+6] = 1;                   
          }
          aa = aa - 1;
          ab = ab - 4;
          ac = ac + 3;
          ad = ad + 4;             
     }
     
     if (SQUARE[5] == ' ') {
          if ((SQUARE[1] == 'O' && SQUARE[9] == 'O') || (SQUARE[2] == 'O' && SQUARE[8] == 'O') || (SQUARE[3] == 'O' && SQUARE[7] == 'O') || (SQUARE[4] == 'O' && SQUARE[6] == 'O')) test[5] = 1000;
          else if ((SQUARE[1] == 'X' && SQUARE[9] == 'X') || (SQUARE[2] == 'X' && SQUARE[8] == 'X') || (SQUARE[3] == 'X' && SQUARE[7] == 'X') || (SQUARE[4] == 'X' && SQUARE[6] == 'X')) test[5] = 100;
          else if (SQUARE[1] == 'X' || SQUARE[9] == 'X' || SQUARE[2] == 'X' || SQUARE[8] == 'X' || SQUARE[3] == 'X' || SQUARE[7] == 'X' || SQUARE[4] == 'X' || SQUARE[6] == 'X') test[5] = 10;
          else test[5] = 1;                  
     }
     
     for(int i = 0; i < board; i++) {
               if (SQUARE[i+1] == ' ') {   
               if (test[i+1] >= test[1] && test[i+1] >= test[2] && test[i+1] >= test[3] && test[i+1] >= test[4] && test[i+1] >= test[5] && test[i+1] >= test[6] && test[i+1] >= test[7] && test[i+1] >= test[8] && test[i+1] >= test[9]) {
                    square = i + 1;              
               }
          }                              
     }
 
     drawFieldPC(square);
}
 
Laatst bewerkt:
Code:
if ((SQUARE[2] == 'O' && SQUARE[aa] == 'O') || (SQUARE[ab] == 'O' && SQUARE[7] == 'O') || (SQUARE[ab+1] == 'O' && SQUARE[9] == 'O')) test[i+1] = 1000;
               else if ((SQUARE[2] == 'X' && SQUARE[aa] == 'X') || (SQUARE[ab] == 'X' && SQUARE[7] == 'X') || (SQUARE[ab+1] == 'X' && SQUARE[9] == 'X')) test[i+1] = 100;
               else if (SQUARE[2] == 'X' || SQUARE[aa] == 'X' || SQUARE[ab] == 'X' || SQUARE[7] == 'X' || SQUARE[ab+1] == 'X' || SQUARE[9] == 'X') test[i+1] = 10;
^^ wth dat is onleesbaar

Code:
//If whoopie eats a cookie this location is the place to be, 1000 should be high enough.
if( ( SQUARE[ 2 ] == 'O' && SQUARE[ aa ] == 'O' ) || 
    ( SQUARE[ ab ] == 'O' && SQUARE[ 7 ] == 'O' ) || 
    ( SQUARE[ ab+1 ] == 'O' && SQUARE[ 9 ] == 'O' ) ) 
    test[ i+1 ] = 1000;
//If whoopie doesn't eat a cookie he could be eating a candybar, 100 is less attractive but a good spot still
else if( ( SQUARE[ 2 ] == 'X' && SQUARE[ aa ] == 'X' ) || 
           ( SQUARE[ ab ] == 'X' && SQUARE[ 7 ] == 'X' ) || 
           ( SQUARE[ ab+1 ] == 'X' && SQUARE[ 9 ] == 'X' ) )
    test[ i+1 ] = 100;
//If whoopie isn't eating a cookie or a candybar he could be eating spinach, YAK value 10 we dont wanna be here if we dont have to
else if( SQUARE[ 2 ] == 'X' || 
          SQUARE[ aa ] == 'X' || 
          SQUARE[ ab ] == 'X' || 
          SQUARE[ 7 ] == 'X' || 
          SQUARE[ ab+1 ] == 'X' || 
          SQUARE[ 9 ] == 'X' )
    test[i+1] = 10;

nogsteeds geen idee wat je hier doet door rare namen ed maar het is wel leesbaar als je weet wat wat is, je kunt ook nog methodes gebruiken
 
nogsteeds geen idee wat je hier doet door rare namen ed maar het is wel leesbaar als je weet wat wat is, je kunt ook nog methodes gebruiken


Ik maak dus AI voor tic tac toe :p
En danku CoD en murdocki, ik ga er nu naar kijken en wss zal het nu ( eindelijk ) wel lukken


EDIT:

het is nu eindelijk gelukt om een hele overzichtelijke en schone AI te maken :D en hij werkt tot nu toe ( de 1e zet -.-") danku, vraag opgelost
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan