Axrst έγραψε:
Theo έγραψε:
Πολύ πιο δύσκολη λόγικη είναι η τρίλιζα με 1 παίχτη και αντίπαλο το computer
Ενοείται ότι το computer δεν πρέπει να χάνει
Αν έχει κανείς κάτι τέτοιο έτοιμο θα ήθελα να το δω γιατί προσπαθώ να το κάνω και έχω μπλέξει
με combinations και χάνομαι κάπου
Το έχω κάνει, αλλά δεν το έχω πρόχειρο τώρα να το στείλω άμεσα. Η λογική πάντως του AI, είναι η εξής:
(για την κίνηση του Η/Υ)
1. Πρώτα τσεκάρουμε αν μπορούμε με την επόμενη κίνηση να νικήσουμε και αν ναι, την κάνουμε.
2. Δευτερευόντως, τσεκάρουμε αν πρόκειται να νικήσει ο user με την επόμενη κίνηση του, και τον μπλοκάρουμε.
3. Αλλιώς διαλέγουμε μια από τις ελεύθερες γωνίες (τυχαία) αν υπάρχουν.
4. Μετά διαλέγουμε το κέντρο αν είναι ελεύθερο.
5. Τέλος διαλέγουμε μια από τις ελεύθερες πλευρές αν υπάρχουν.
Θα στείλω και ολοκληρωμένο κώδικα όταν τον βρω.
Προσπάθησα και το έκανα και γω
Οι κινήσεις περιγράφονται καλύτερα στο wikipedia
en.wikipedia.org/wiki/Tic-tac-toe
στο κομμάτι strategy
1,2 όπως το λες μετά όμως
3.create fork και 4 avoid fork
Ο κώδικας που έχω κάνει δεν είναι πολύ καθαρός κάνει όμως δουλειά
def play_robot(self):
options=[i for i in range(1,10) if self.board[i]==' ']
#check for win
for i in options:
self.board[int(i)]=self.symbol2
if self.win_check(self.symbol2):
return
else:
self.board[int(i)]=' '
#check for loses
for i in options:
self.board[int(i)]=self.symbol1
if self.win_check(self.symbol1):
self.board[int(i)]=self.symbol2
return
else:
self.board[int(i)]=' '
#Robot tries to make a fork
for i in options:
self.board[int(i)]=self.symbol2
new_options=[i for i in range(1,10) if self.board[i]==' ']
ways_to_win=0
for j in new_options:
self.board[int(j)]=self.symbol2
if self.win_check(self.symbol2):
ways_to_win+=1
self.board[int(j)]=' '
if ways_to_win==2:
return
else:
self.board[int(i)]=' '
#avoid fork
if self.board[5]==self.symbol2 and self.board[1]==self.symbol1 and self.board[9]==self.symbol1 and self.board[2]==' ' and self.board[4]==' ' and self.board[6]==' ' and self.board[8]==' ':
self.board[2]=self.symbol2
return
#avoid fork
if self.board[5]==self.symbol2 and self.board[3]==self.symbol1 and self.board[7]==self.symbol1 and self.board[2]==' ' and self.board[4]==' ' and self.board[6]==' ' and self.board[8]==' ':
self.board[2]=self.symbol2
return
for i in options: #Stop players fork not sure if it evers play
self.board[int(i)]=self.symbol1
new_options=[i for i in range(1,10) if self.board[i]==' ']
ways_to_win=0
for j in new_options:
self.board[int(j)]=self.symbol1
if self.win_check(self.symbol1):
ways_to_win+=1
self.board[int(j)]=' '
if ways_to_win==2:
self.board[int(i)]=self.symbol2
return
else:
self.board[int(i)]=' '
#check for center
if self.board[5]==' ':
self.board[5]=self.symbol2
return
#check for corner
for i in options:
if i in (1,3,5,7):
self.board[i]=self.symbol2
return
#get random
self.board[random.choice(options)]=self.symbol2
Αμά βρεις τον κώδικά σου βάλε θέλω να δω πως το κάνεις
Στην ουσία κάνω το 1 brute force δοκιμάζοντας όλες τι θέσεις το ίδιο το 2 το ίδιο το 3ο βήμα για το 4 που είναι και το πιο περίπλοκο τσεκάρω τι διαγώνιες. Μετά πάω για κέντρο μετά για γωνία μετά για random
Είναι λίγο χαζό αλλά βαρίεμαι να το βελτιώσω
Μία full version όποιος θέλει να παίξει έχω εδώ
github.com/k33theod/triliza
Αν κάποιος μπορέσει να νικήσει θα χαιρόμουν να μάθω για να διορθώσω τον κώδικα. Το έχω κάνει και σε γραφικό tkinter μόλις είναι πλήρες θα το ανεβάσω
Το αρχείο για τρίλιζα με tkinter στον ίδιο δεσμό tic_tac_toe5.pyw τρέχει με διπλό κλικ