#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Fri Nov 29 10:28:50 2019 @author: andrea """ from rtrace import trace import copy class NodoTris: def __init__(self, scacchiera=None): if not scacchiera: self.scacchiera = [ [ '', '', '' ], [ '', '', '' ], [ '', '', '' ],] else: self.scacchiera = scacchiera def vincente(self, simbolo): return ([simbolo] * 3 == self.scacchiera[0] or [simbolo] * 3 == self.scacchiera[1] or [simbolo] * 3 == self.scacchiera[2] or [simbolo] * 3 == [self.scacchiera[0][0], self.scacchiera[1][0], self.scacchiera[2][0], ] or [simbolo] * 3 == [self.scacchiera[0][1], self.scacchiera[1][1], self.scacchiera[2][1], ] or [simbolo] * 3 == [self.scacchiera[0][2], self.scacchiera[1][2], self.scacchiera[2][2], ] or [simbolo] * 3 == [self.scacchiera[0][0], self.scacchiera[1][1], self.scacchiera[2][2], ] or [simbolo] * 3 == [self.scacchiera[0][2], self.scacchiera[1][1], self.scacchiera[2][0], ] ) def patta(self): for line in self.scacchiera: for casella in line: if casella == '': return False return True def mosse(self, simbolo): if self.patta(): return [] elenco = [] for y,linea in enumerate(self.scacchiera): for x,casella in enumerate(linea): if casella == '': nuova_scacchiera = copy.deepcopy(self.scacchiera) nuova_scacchiera[y][x] = simbolo elenco.append(NodoTris(nuova_scacchiera)) return elenco # torno sia la configurazione ottenuta che il simbolo inserito e la sua posizione def mosse2(self, simbolo): if self.patta(): return [] elenco = [] for y,linea in enumerate(self.scacchiera): for x,casella in enumerate(linea): if casella == '': nuova_scacchiera = copy.deepcopy(self.scacchiera) nuova_scacchiera[y][x] = simbolo elenco.append((NodoTris(nuova_scacchiera), (x,y,simbolo))) return elenco def prossimo_giocatore(self): caselle_libere = sum(linea.count('') for linea in self.scacchiera ) return 'o' if caselle_libere % 2 else 'x' def strategia_vincente(self, giocatore): if self.patta(): return False, mosse_fatte if self.vincente(giocatore): return True, mosse_fatte altro = 'o' if giocatore == 'x' else 'x' if self.vincente(altro): return False, mosse_fatte pg = self.prossimo_giocatore() mosse = self.mosse(pg) if pg == giocatore: for mossa in mosse: if mossa.strategia_vincente(giocatore): return True, mosse_fatte else: return False, mosse_fatte else: for mossa in mosse: if not mossa.strategia_vincente(giocatore): return False, mosse_fatte else: return True, mosse_fatte def strategia_vincente2(self, giocatore, mosse_fatte=None): if mosse_fatte == None: mosse_fatte = [] if self.patta(): return False, mosse_fatte if self.vincente(giocatore): return True, mosse_fatte altro = 'o' if giocatore == 'x' else 'x' if self.vincente(altro): return False, mosse_fatte pg = self.prossimo_giocatore() mosse = self.mosse2(pg) if pg == giocatore: for configurazione, mossa in mosse: vf, mosse_finali = configurazione.strategia_vincente2(giocatore, mosse_fatte + [mossa]) if vf: return True, mosse_finali else: return False, mosse_fatte else: for configurazione,mossa in mosse: vf, mosse_finali = configurazione.strategia_vincente2(giocatore, mosse_fatte + [mossa]) if not vf: return False, mosse_finali else: return True, mosse_fatte def __repr__(self): ris = '' for linea in self.scacchiera: for casella in linea: if casella == '': ris += ' ' else: ris += casella ris += '\n' return ris x = NodoTris( [['', '', ''], ['', '', ''], ['o', '', 'x']])