TI/Skrypty z zajęć/6

Z Brain-wiki

<source lang="python">

  1. -*- coding: utf-8 -*-

""" Created on Wed Apr 1 10:18:35 2020

@author: Tomek """

import numpy as np import random

plansza = np.zeros((3,3)) plansza[0,0] = 1 plansza[2,2] = 2

def rysuj(plansza):

   kreska = ('---+'*plansza.shape[1])[:-1]
   def znak(z):
       if z == 1: return ' O '
       if z == 2: return ' X '
       return '   '
   for i in range(plansza.shape[0]):
       print('|'.join([znak(liczba) for liczba in plansza[i,:]]))
       if (i<plansza.shape[0]-1): print(kreska)



  1. vec to jednowymiarowa tablica

def sprawdz_linie(vec):

   #gdy vec ma same jedynki zwraca 1
   #gdy vec ma same dwojki zwraca 2
   # w pozostałych przypadkach zwraca 0
   for i in [1,2]:
       if np.count_nonzero(vec-i) == 0: return i
   return 0

def sprawdz_czy_dwa_identyczne_i_zero(vec,gracz):

   if (sum(vec==0)==1) and (sum(vec==gracz)==2):
       return (np.argwhere(vec==0))[0][0]


def czy_koniec():

   global plansza
   if (len(plansza.flatten())-np.count_nonzero(plansza)) == 0:
       return 'REMIS'

   wyniki=[]
   for j in range(len(plansza)):
       wyniki.append(sprawdz_linie(plansza[j,:]))
       wyniki.append(sprawdz_linie(plansza[:,j]))
   wyniki.append(sprawdz_linie(np.diag(plansza)))
   wyniki.append(sprawdz_linie(np.diag(plansza[:,::-1])))

   wynik=max(wyniki)
   if wynik:
       return 'wygral gracz '+str(wynik)


def ruch_losowy():

   global plansza
   mozliwe_ruchy=[]
   for x in range(plansza.shape[0]):
       for y in range(plansza.shape[1]):
           if plansza[x,y]==0: mozliwe_ruchy.append((x,y))
   ruch=random.choice(mozliwe_ruchy)
   plansza[ruch[0],ruch[1]]=2

def ofensywa(gracz):

   global plansza
   
   #po wierszach
   for j in range(len(plansza)):
       wynik = sprawdz_czy_dwa_identyczne_i_zero(plansza[j,:],gracz)
       if wynik!=None:
           plansza[j,wynik]=2
           return True
   
   #po kolumnach
   for j in range(len(plansza)):
       wynik = sprawdz_czy_dwa_identyczne_i_zero(plansza[:,j],gracz)
       if wynik!=None:
           plansza[wynik,j]=2
           return True
   
   #diagonala
   wynik = sprawdz_czy_dwa_identyczne_i_zero(np.diag(plansza),gracz)
   if wynik!=None:
       plansza[wynik,wynik]=2
       return True
   
   #antydiagonala
   wynik = sprawdz_czy_dwa_identyczne_i_zero(np.diag(plansza[:,::-1]),gracz)
   if wynik!=None:
       plansza[wynik,plansza.shape[0]-1-wynik]=2
       return True
   return False



def ruch_komputera():

   czy_byl_ruch = False
   czy_byl_ruch = ofensywa(2)
   if czy_byl_ruch==False: czy_byl_ruch = ofensywa(1)
   if czy_byl_ruch==False: ruch_losowy()


while True:

   #rysujemy plansze
   rysuj(plansza)

   #ruch gracza i
   while True:
       x = int(input('graczu podaj wspolrzedna x:'))
       y = int(input('graczu podaj wspolrzedna y:'))
       if (plansza[x,y] == 0): break
   plansza[x,y] = 1
   
   #sprawdzanie warunku konca
   if czy_koniec():
       print(czy_koniec())
       break
   
   #ruch komputera
   ruch_komputera()
   
   #sprawdzanie warunku konca
   if czy_koniec():
       print(czy_koniec())
       break

</souce>