Ilias95 έγραψε:
...
Εμάς μας νοιάζει όμως η προγραμματιστική υλοποίηση.
Αυτό ακριβώς!

Δυστυχώς όπως γράφω και στο Readme, δεν ακολούθησα την... πεπατημένη, με αποτέλεσμα να ταλαιπωρηθώ αχρείαστα με το AI του παιχνιδιού. Για να απαντήσω και στην ερώτηση του Κώστα, οι κινήσεις δεν είναι προγραμματισμένες. Κάθε φορά που είναι η σειρά της CPU να παίξει, ψάχνει όλα τα κενά τετράγωνα για κάποιο που του δίνει την νίκη. Αν δεν βρει τετράγωνο στο οποίο να κερδίζει ψάχνει για τετράγωνα που κερδίζει ο αντίπαλος (αυτή η αναζήτηση γίνεται ταυτόχρονα, σε ένα pass).
Τα τετράγωνα τα βαθμολογεί καθώς προχωράει: σε όσα νικάει αυτός βάζει την τιμή RANK_MAX (ίση με 60 στον κώδικα). Σε όσα κερδίζει ο αντίπαλος βάζει την τιμή RANK_WINOPP (ίση με 30 στον κώδικα). Κάνει κι έναν τρίτο έλεγχο παράλληλα με τους άλλους δυο, για να βρει καταστάσεις κατά τις οποίες ο αντίπαλος μπορεί να απειλήσει με διπλή τρίλιζα... άμα βρει, πάει και βάζει πολύ χαμηλή βαθμολογία στα τετράγωνα που ΔΕΝ πρέπει να διαλέξει, προκειμένου να αποφύγει την απειλή διπλής τρίλιζας (τους βάζει την τιμή RANK_FORKOPP, που ισούται με -30 στον κώδικα).
Αφού τελειώσει με τις βαθμολογίες, έχει κρατήσει ποια είναι η υψηλότερη, οπότε παίζει σε εκείνο το τετράγωνο. Αν υπάρχουν περισσότερα του ενός τετραγώνου με την υψηλότερη δυνατή βαθμολογία, τότε διαλέγει ένα από αυτά στην τύχη.
ΥΓ. Η περπατημένη για το AI της τρίλιζας είναι με χρήση gametree και minmax heuristic (για την βαθμολογία)... για ταχύτερη εκτέλεση εκτελείται και μια τεχνική που ονομάζεται alpha-pruning, η οποία αποκλείει απευθείας αδύνατες κινήσεις.