python - NoneType' 对象没有属性 'winner' PYTHON CHECKERS GAME
问题描述
以下是用于使用 python 制作跳棋 AI 的游戏类的代码,我不确定解决方案是什么,因为我已经尝试过推荐的方法。任何解决方案将不胜感激
import pygame
from constants import RED, WHITE, BLUE, SQUARE_SIZE
from board import Board
class Game: # game class allows you to interface with the board and the pieces. it consists of a few methods
def __init__(self, win):
self._init()
self.win = win
def update(self):
self.board.draw(self.win)
self.draw_valid_moves(self.valid_moves)
pygame.display.update()
def _init(self):
self.selected = None
self.board = Board()
self.turn = RED
self.valid_moves = {}
def winner(self):
return self.board.winner()
def reset(self): # reset method to reset
self._init()
def select(self, row, col): # if i haave selected something then this method will try and move what i have selected to the row and colimn selected. this select metho
if self.selected: # pressed piece will move to row/ column passed
result = self._move(row, col)
if not result: # if the row oclumn was valid, as i already have something slected, then it will be moved, if not i will be able to try and select a different piece
self.selected = None
self.select(row, col) # call method again
piece = self.board.get_piece(row, col)
if piece != 0 and piece.color == self.turn:
self.selected = piece
self.valid_moves = self.board.get_valid_moves(piece)
return True
return False
def _move(self, row, col):# move method
piece = self.board.get_piece(row, col)
if self.selected and piece == 0 and (row, col) in self.valid_moves:# cannot move into a postioon that has another piece checks to see if piece sleected ( only if we have selcted sometihng and what we have sleceted is not another piece then move can be moved/ can move)
self.board.move(self.selected, row, col)#movw selected peice to row and column
skipped = self.valid_moves[(row, col)]
if skipped:
self.board.remove(skipped)
self.change_turn()
else:
return False
return True
def draw_valid_moves(self, moves):#check all of the diagonals of where that checkers piece is. draw squares for all of these valid moves. to do this the row/ column need to be identiified so that a circle can be drawn for each move
for move in moves: # loops through all the keys of the dictionary which is the row/ columns indenitidied as a tuple
row, col = move # all moves are dictionary,
pygame.draw.circle(self.win, BLUE,
(col * SQUARE_SIZE + SQUARE_SIZE // 2, row * SQUARE_SIZE + SQUARE_SIZE // 2), 15)
def change_turn(self): # change turn of players
self.valid_moves = {}
if self.turn == RED:
self.turn = WHITE
else:
self.turn = RED
# in order to implement the AI the game and board class are the most funcdemental aspects, this is because when implementing where the AI can actually move from a certain postion to do this a board needs to be established to score/ eveaulate the postions and know all the piece that could potenitally move
def get_board(self):
return self.board
def ai_move(self, board):
self.board = board
self.change_turn()
解决方案
这可能是因为您拼错了构造函数方法。在 init 之前和之后需要两个下划线,如下所示:
def __init__(self):
self.selected = None
self.board = Board()
self.turn = RED
self.valid_moves = {}
推荐阅读
- powershell - Powershell中的JQ查询不适用于SELECT中的变量
- python - 带有 GCC 的 Python C_API - 未找到 Python.h
- c - 使用 While 循环遍历两个值
- angular - 在路线的“中间”带有硬编码组件的角度嵌套路线
- regex - 正则表达式仅匹配两个字母,其中一个均匀出现
- apache-flink - Flink Sql 未将 RAW('org.apache.avro.util.Utf8', '...') 转换为字符串
- typescript - Prettier 不检测/修复线长
- android - 如何在使用片段的 MVVM 架构中隐藏 SplashScreen 下的数据获取
- vba - 在 Visio VBA 中有没有办法将形状位置引用到标尺?
- ansible - 如何使用 ansible 在 Juniper Switch 上切换 vlan