gpt4 book ai didi

Python - OOP 井字棋

转载 作者:太空宇宙 更新时间:2023-11-03 19:08:50 25 4
gpt4 key购买 nike

我正在为一项作业编写一个井字棋游戏。它需要使用面向对象的编程,并且必须相对智能——它需要阻止玩家的成功。我在这方面遇到了很多麻烦。

我的麻烦来 self 的 rowabouttowin 方法:我做了一个非常复杂的列表理解,但我认为我做得不正确。

我想要的是一种检查玩家是否即将水平赢得游戏的方法(O _ O、O O _ 或 _ O O 如果 mark = O),如果玩家是,则返回计算机所在的位置应该玩。

关于如何最好地解决这个问题有什么帮助或建议吗?

from random import randint

class TTT:
board = [[' ' for row in range(3)] for col in range(3)]
currentgame = []

def print(self):
"""Displays the current board."""
print("\n-----\n".join("|".join(row) for row in self.board))

def mark(self,pos,mark):
"""Method that places designated mark at designated position on the board."""
x,y = pos
self.board[x][y] = mark

def win(self,mark):
"""Method that checks if someone has won the game."""
if mark == self.board[0][0] == self.board[1][1] == self.board[2][2]:
return True
if mark == self.board[2][0] == self.board[1][1] == self.board[0][2]:
return True
elif mark == self.board[0][0] == self.board[1][0] == self.board[2][0]:
return True
elif mark == self.board[1][0] == self.board[1][1] == self.board[1][2]:
return True
elif mark == self.board[0][1] == self.board[1][1] == self.board[2][1]:
return True
elif mark == self.board[0][2] == self.board[1][2] == self.board[2][2]:
return True
elif mark == self.board[0][0] == self.board[0][1] == self.board[0][2]:
return True
elif mark == self.board[2][0] == self.board[2][1] == self.board[2][2]:
return True
else:
return False



def choose(self,mark):
"""The computer chooses a place to play. If the player is not about to win,
plays randomly. Otherwise, does a series of checks to see if the player is about
to win horizontally, vertically, or diagonally. I only have horizontal done."""
spotx = randint(0,2)
spoty = randint(0,2)
if self.rowabouttowin(mark):
self.mark((self.rowabouttowin(mark)),mark)
elif self.legalspace(spotx,spoty):
self.mark((spotx,spoty),mark)
else:
self.choose(mark)


def legalspace(self,spotx,spoty):
"""Returns True if the provided spot is empty."""
if self.board[spotx][spoty] == ' ':
return True
else:
return False


def rowabouttowin(self,mark):
"""If the player is about to win via a horizontal 3-in-a-row,
returns location where the computer should play"""
for row in range(3):
if any(' ' == self.board[row][1] for i in range(3)) and any(self.board[row][i] == self.board[row][j] for i in range(3) for j in range(3)):
if self.board[row][i] == ' ' : yield(self.board[row][i % 3], self.board[row][i])

当前给出此错误消息:

Traceback (most recent call last):
File "<pyshell#49>", line 1, in <module>
x.choose('x')
File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 40, in choose
self.mark((self.rowabouttowin(mark)),mark)
File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 11, in mark
x,y = pos
File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 61, in rowabouttowin
if self.board[row][i] == ' ' : yield(self.board[row][i % 3], self.board[row][i])
NameError: global name 'i' is not defined

最佳答案

一些提示:

  • 您使用的是类变量,而不是实例变量,因此请查找差异。我将您的类更改为使用实例变量,因为您设置的变量应该属于实例。

  • 考虑让内容更具可读性。

  • 使用__str__制作类的可打印版本。这样,您就可以执行print(class_instance),结果会很好。

这是我所做的更改:

from random import randint

class TTT(object):
def __init__(self):
self.board = [[' ' for row in range(3)] for col in range(3)]
self.currentgame = []

def __str__(self):
"""Displays the current board."""

return "\n-----\n".join("|".join(row) for row in self.board)

def mark(self, pos, mark):
"""Method that places designated mark at designated position on the board."""

x, y = pos
self.board[x][y] = mark

def win(self, mark):
"""Method that checks if someone has won the game."""

for row in self.board:
if row[0] == row[1] == row[2]:
return True

for i in range(3):
if self.board[0][i] == self.board[1][i] == self.board[2][i]:
return True

if board[0][0] == board[1][1] == board[2][2]:
return True
elif board[0][2] == board[1][1] == board[2][0]:
return True
else:
return False



def choose(self, mark):
"""The computer chooses a place to play. If the player is not about to win,
plays randomly. Otherwise, does a series of checks to see if the player is about
to win horizontally, vertically, or diagonally. I only have horizontal done."""

spotx = randint(0, 2)
spoty = randint(0, 2)

if self.rowabouttowin(mark):
self.mark((self.rowabouttowin(mark)), mark)
elif self.legalspace(spotx, spoty):
self.mark((spotx, spoty), mark)
else:
self.choose(mark)


def legalspace(self, spotx, spoty):
"""Returns True if the provided spot is empty."""

return self.board[spotx][spoty] == ' '


def rowabouttowin(self, mark):
"""If the player is about to win via a horizontal 3-in-a-row,
returns location where the computer should play"""

for row in range(3):
check_one = any(' ' == self.board[row][1] for i in range(3))
check_two = any(self.board[row][i] == self.board[row][j] for i in range(3) for j in range(3))

# I have no idea what this code does

if self.board[row][i] == ' ' :
yield self.board[row][i % 3], self.board[row][i]

关于Python - OOP 井字棋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com