Untitled

 avatar
unknown
python
2 years ago
4.1 kB
1
Indexable
from random import randrange

board = []
row = 3
column = 3
number = 1
counter = 1

def preper_board():
    # przygotowanie tablicy przy uruchomieniu programu
    global board
    board = [[1 + i + 3*j for i in range(column)]for j in range(row)]
    board[1][1] = "X"

def display_board(board):
# Funkcja, która przyjmuje jeden parametr zawierający bieżący stan tablicy
# i wyświetla go w oknie konsoli.
    for i in range(row):
        for j in range(1):
            print("+" + 3*"-------+")
            print("|" + 3*"       |")
            print("|",board[i][j],"|",board[i][j+1],"|",board[i][j+2],"|", sep="   ")
            print("|" + 3*"       |")
    print("+" + 3*"-------+")    

                
def enter_move(board):
#
# Funkcja, która przyjmuje parametr odzwierciedlający biężący stan tablicy,
# prosi użytkownika o wykonanie ruchu, 
# sprawdza dane wejściowe i aktualizuje tablicę zgodnie z decyzją użytkownika.
#
    move = 0
    lista = []
    lista_numerow = []
    while True: 
        try:
            move = int(input("Wykonaj swój ruch: "))
            lista = make_list_of_free_fields(board)
            lista_numerow = [x[i+1] + 1 + 3*x[i] for x in lista for i in range(1)]
            if move not in lista_numerow:
                raise ValueError
            break
        except ValueError:
            print("Tylko liczby całkowitę dostępne do wyboru")
        except:
            print("Wprowadź liczbę całkowitą")
    # wprowadznie parametru do tablicy
    put_user_choice(board, move)
    display_board(board)
    victory_for(board, "O")
    
    
def put_user_choice(board, move):
    for x in board:
        for i in range(column):
            if x[i] == move:
                x[i] = "O"
                
def put_computer_choice(board, move):
    for x in board:
        for i in range(column):
            if x[i] == move:
                x[i] = "X"
                
    

def make_list_of_free_fields(board):
#
# Funkcja, która przegląda tablicę i tworzy listę wszystkich wolnych pól; 
# lista składa się z krotek, a każda krotka zawiera parę liczb odzwierciedlających rząd i kolumnę.
#
    list_free = [(i, j) for i in range(row) for j in range(column) if board[i][j] != "O" and board[i][j] != "X"]
    return list_free


def victory_for(board, sign):
#
# Funkcja, która dokonuje analizy stanu tablicy w celu sprawdzenia
# czy użytkownik/gracz stosujący "O" lub "X" wygrał rozgrywkę.
#
    dic = {}
    for i in range(row):
        for j in range(column):
            dic[j+1+3*i] = board[i][j]
    if dic[1] == sign and dic[4] == sign and dic[7] == sign or \
    dic[2] == sign and dic[5] == sign and dic[8] == sign or \
    dic[3] == sign and dic[6] == sign and dic[9] == sign or \
    dic[1] == sign and dic[2] == sign and dic[3] == sign or \
    dic[4] == sign and dic[5] == sign and dic[6] == sign or \
    dic[7] == sign and dic[8] == sign and dic[9] == sign or \
    dic[1] == sign and dic[5] == sign and dic[9] == sign or \
    dic[3] == sign and dic[5] == sign and dic[7] == sign:
        if sign == "O":
            print("Wygrałeś!")
            return False
        else:
            print("Wygrywa komputer")
            return False
    
    elif counter < 9:
        if sign == "O":
            draw_move(board)
            return True
        else:
            enter_move(board)
            return True
    else:
        print("No to mamy remis :)")
        return False
            
        
    

def draw_move(board):
#
# Funkcja, która wykonuje ruch za komputer i aktualizuje tablicę.
#   
    lista = make_list_of_free_fields(board)
    lista_numerow = [x[i+1] + 1 + 3*x[i] for x in lista for i in range(1)]
    while True:
        move = 1 + randrange(8)
        if move is lista_numerow:
            continue
        else:
            put_computer_choice(board, move)
            break
            
    display_board(board)
    victory_for(board, "X")
    

def main():
    preper_board()
    display_board(board)
    flag = True
    while True:
        enter_move(board)
    

main()