Python tic-tac-toe检测作弊

2024-10-01 04:50:27 发布

您现在位置:Python中文网/ 问答频道 /正文

所以现在我写了一个简单的井字游戏。我甚至没有使用我所做的所有功能,但我的问题是: 我如何判断玩家是否在已经有1或2的地方放置1或2,我想我知道怎么做,但是如果他们输入非法字符或试图覆盖已经放置的1或2,我如何才能将它们放回“输入你的号码”提示符。在

还有没有更紧凑的方法来实现这一点?在

游戏代码如下:

nr = [0,0,0,0,0,0,0,0,0]
keepGoing = True

def checkP1():
    if nr[0] and nr[1] and nr[2] or nr[3] and nr[4] and nr[5] or nr[6] and nr[7] and nr[8] or nr[0] and nr[3] and \
       nr[6] or nr[1] and nr[4] and nr[7] or nr[2] and nr[5] and nr[8] or nr[0] and nr[4] and nr[8] or nr[2] and nr[4] and nr[6] == 1:
        print("P1 Wins")
        keepGoing = False
        return keepGoing



def checkP2():
    if nr[0] and nr[1] and nr[2] or nr[3] and nr[4] and nr[5] or nr[6] and nr[7] and nr[8] or nr[0] and nr[3] and \
       nr[6] or nr[1] and nr[4] and nr[7] or nr[2] and nr[5] and nr[8] or nr[0] and nr[4] and nr[8] or nr[2] and nr[4] and nr[6] == 2:
        print("P2 Wins")
        keepGoing = False
        return keepGoing

def Game():
    while keepGoing:
        PrintBoard()
        in1 = 0
        in2 = 0
        in1 = input("Please enter the number of the position you want to put your symbol P1.")
        nr[int(in1)-1] = 1
        check = checkP1()
        if check == 0:
            PrintBoard()
            break
        in2 = input("Please enter the number of the position you want to put your symbol P2.")
        check = checkP2()
        if check == 0:
            PrintBoard()
            break
        nr[int(in2)-1] = 2

def PrintBoard():
    print("",nr[0],nr[1],nr[2],"\n",nr[3],nr[4],nr[5],"\n",nr[6],nr[7],nr[8])

def Reset():
    nr = [0,0,0,0,0,0,0,0,0]

    keepGoing = True

Tags: orandthetrue游戏ifdefcheck
2条回答

回答你的具体问题

how can I then put them back at the "Input your number" prompt if they enter an illegal character or they try to overwrite an already placed 1 or 2

我会用一个函数来做这个:

def get_valid_input(board):
    while True:
        try:
            move = int(input("Please enter the number of the position you want to put your symbol."))
        except ValueError:
            print("Input must be an integer number.")
        else:
            if move not in range(1, 10):
                print("Move must be 1-9.")
            elif board[move-1] in (1, 2):
                print("Location already used.")
            else:
                return move

这将持续到当前任何玩家给出有效的move

^{pr2}$

一些更一般的建议:

  • 你当前对获胜者的检查不起作用-if a or b == c没有像你想的那样做(参见例如this question)。例如,nr[0] and nr[1] and nr[2] == 2实际上测试bool(nr[0]) and bool(nr[1]) and (nr[2] == 2);只要最后一个值是2,另外两个不为零,那么它就是True。CoDEmanX在评论中的建议在这里很有用。在
  • 使用标志keepgoing不是很像python;我会创建一个函数game_over(board),如果游戏结束(无论是赢还是平局),则返回True,否则False,则整个循环变成while True: ... if game_over(board): break。在
  • 不要依赖范围来访问变量,而是显式地传递所需的内容(例如,board参数传递给get_valid_input和{})。去掉keepgoing会删除其中一个全局变量,但您可以将board作为其他函数的参数,并根据需要使用return。或者,考虑使用class来保存board和所有函数。在

如何使用切片来确定赢家的示例:

def same(iterable):
    it = iter(iterable)
    start_val = it.__next__()
    for val in it:
        if val != start_val:
            return
    if start_val != 0:
        return start_val

nr = [0] * 9

nr[1] = 1
nr[2] = 2
nr[4] = 2
nr[6] = 2
nr[7] = 1
nr[8] = 1

for i in range(0, len(nr), 3):
    print(nr[i:i+3])

winner = (
    same(nr[0:3]) or same(nr[3:6]) or same(nr[6:9]) or
    same(nr[0::3]) or same(nr[1::3]) or same(nr[2::3]) or
    same(nr[::4]) or same(nr[2:-1:2])
)

if winner is not None:
    print("Player %i won!" % winner)

same()是一个helper函数,它检查iterable的所有元素是否都具有相同的值,如果是,则返回该值,除非它是0(因此我们只捕获{}s和{}s)。在

您可以看到切片符号中的模式,使用for循环可以轻松地缩放它们。在

相关问题 更多 >