首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中实现函数"check_space_taken“?

如何在python中实现函数"check_space_taken“?
EN

Stack Overflow用户
提问于 2021-02-18 00:04:00
回答 1查看 49关注 0票数 1

我需要实现一个函数来检查在终端中正在播放的tic tac toe中是否占用了一个空间,问题是如果占用了一个空间,我不知道如何避免进入棋盘的选择位置,我已经编写了这个函数,下面是我的代码:

代码语言:javascript
复制
import random

board = [[' ',' ',' '],
         [' ',' ',' '],
         [' ',' ',' ']]

def checkwin(board):
    for i in range(3):
        if board[i][0] != " " and board[i][0] == board[i][1] == board[i][2]:
            return True  #winning row
        if board[0][i] != " " and board[0][i] == board[1][i] == board[2][i]:
            return True  #winning column
        #winning diagonals
        if board[1][1] != " " and board[0][0] == board[1][1] == board[2][2]:
            return True
        if board[1][1] != " " and board[2][0] == board[1][1] == board[0][2]:
            return True
        else:
            return False

def check_space_taken(board, number):
    if not choose_position(board, number) == ' ':
        return True
    else:
        return False

def choose_position(board, number):
    if number <= 3:
        board[0][number-1] = 'X'
    elif number <= 6:
        board[1][number-4] = 'X'
    elif number <= 9:
        board[2][number-7] = 'X'
    return board, number

def computer_position(board, computer_number):
    computer_number = random.randint(0,9)
    if computer_number <= 3:
        board[0][computer_number-1] = 'O'
    elif computer_number <= 6:
        board[1][computer_number-4] = 'O'
    elif computer_number <= 9:
        board[2][computer_number-7] = 'O'
    return board, computer_number

Game_over = False

while not Game_over:
    player_input = int(input('move to: '))
    player_changed_board = choose_position(board, player_input)
    computer_input = random.randint(0,9)
    computer_changed_board = computer_position(board, computer_input)

    for x in player_changed_board:
        print(x)

    for y in computer_changed_board:
        print('computer move')
        print(y)

    if checkwin(board):
        print('\n-----------------------Congrats you won-----------------------\n')
        Game_over = True
EN

回答 1

Stack Overflow用户

发布于 2021-02-18 10:19:59

我认为如果使用x,y坐标,这会更容易,但下面是:

代码语言:javascript
复制
from itertools import chain
from random import choice


def cast(x, y, base):
    """
    Create a y by x matrix from a vector
    """
    if x * y == len(base):
        return [list(base[i*x: x+i*x]) for i in range(y)]
    raise ValueError('Dimensions do not agree with base')

def flat(board):
    """
   Create a 1D vector from a matrix 
    """
    return [*chain.from_iterable(board)]

def check_space_taken(board, number):
    """
    check if a space is taken
    """
    return flat(board)[number] == ' '

def empty_space_indices(board):
    """
    find all empty spaces
    """
    flattened = flat(board)
    return [*filter(lambda x: flattened[x]==' ', range(len(flattened)))]

def play(board, number, letter):
    """
   Simplify the code base by using a single function for move-making 
    """
    board = flat(board)
    board[number] = letter
    board = cast(3, 3, board)
    return board

def won(board, letter):
    """
    checkwin seems to have a bug
    """
    for i in range(3):
        if letter == board[i][0] == board[i][1] == board[i][2]:
            return True
        elif letter == board[0][i] == board[1][i] == board[2][i]:
            return True
        elif letter == board[0][0] == board[1][1] == board[2][2]:
            return True
        elif letter == board[2][0] == board[1][1] == board[0][2]:
            return True
    return False

def show(board):
    """
    Neat representation of the board.
    checkout the module tabulate for better options:
        https://github.com/astanin/python-tabulate
    """
    table = '\n'.join("{}|{}|{}".format(*row) for row in board)
    table = table.join('\n' * 2)
    print(table)
    return table

def game_over(board):
    """
    check if the board is full or there is a winner
    """
    return len(empty_space_indices(board))==0 or won(board, 'x') or won(board, 'o')
    
def main(board=None):
    """REPL"""
    if board:
        show(board)
    board = board if not isinstance(board, type(None)) else [
        [' ',' ',' '],
        [' ',' ',' '],
        [' ',' ',' ']
    ]
    player_move = None
    while not game_over(board):
        while not player_move in empty_space_indices(board):
            player_move = int(input(f'pick a tile from {empty_space_indices(board)}:\n\t'))
        board = play(board, player_move, 'x')
        
        if not game_over(board):
            computer_move = choice(empty_space_indices(board))
            board = play(board, computer_move, 'o')
            
        show(board)

main()

警告:我认为checkwin可能有问题,因为以下代码没有终止游戏:

代码语言:javascript
复制
x|o|o
 |o|o
x|x|x

您可以使用以下方法进行检查:

代码语言:javascript
复制
def relist(table):
    """parse the table from show back into a list"""
    t = table.splitlines()
    return [i.split('|') for i in t]
    
t = """x|o|o
 |o|o
x|x|x"""
rt = relist(t)

for r in rt: print(r)
print(checkwin(rt))
print(game_over(rt))
print(won(rt, 'x'))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66245640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档