TI/Skrypty z zajęć/5

Z Brain-wiki
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 10 12:47:27 2020

@author: tgub
"""
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)



#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:
            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:
            plansza[wynik,j]=2
            return True
    #diagonala
    wynik = sprawdz_czy_dwa_identyczne_i_zero(np.diag(plansza),gracz)
    if wynik:
        plansza[wynik,wynik]=2
        return True
    #antydiagonala
    wynik = sprawdz_czy_dwa_identyczne_i_zero(np.diag(plansza[:,::-1]),gracz)
    if wynik:
        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: 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
    if czy_koniec():
        print(czy_koniec())
        break
    ruch_komputera()
    if czy_koniec():
        print(czy_koniec())
        break