Pygame
本帖最后由 歌者文明清理员 于 2023-8-12 13:18 编辑(因为 GPT 脚本的问题,先不发求助区)
我的问题:
右上角和右下角车不显示。这很奇怪,代码也检查不出啥错的。
Debug 过程:在第 138 和 139 行之间添加了一行 print(1) 用于 Debug,发现输出了两次 1,应该是重复放置的问题
另外,第 224 行的输出:
pygame 2.5.0 (SDL 2.28.0, Python 3.11.4)
Hello from the pygame community. https://www.pygame.org/contribute.html
[ br ,bn ,bb ,bq ,bk ,bb ,bn , None, ]
[ bp ,bp ,bp ,bp ,bp ,bp ,bp ,bp , ]
[ wp ,wp ,wp ,wp ,wp ,wp ,wp ,wp , ]
[ wr ,wn ,wb ,wq ,wk ,wb ,wn , None, ]
消失的它 cjjJasonchen 发表于 2023-8-11 09:08
消失的它
“下崽次数: 4” 呐,问题我好像差不多看出来了
print_chessboard()
print("")
你把这个加到place_chess的最后,每帧都打印一下,看看返回值 你所有的棋子出现的时候,右上角和右下角的棋子都在变,导致了错误,
但是我还没有成功找到bug的具体位置,应该是生成棋子的算法问题,
代码是你写的,到这里说不定可以直接看出问题。。。所有我觉定先发出来{:10_282:}
解决方法:
第114行改为:
for name in 'kqbbnnpppppppprr':
让车最后生成
bug原因:
不知道为啥,棋子生成是,会顶掉右上角和右下角的格子
注意!这只是暂时修复了生成棋子时的bug,具体原因还没有找到 cjjJasonchen 发表于 2023-8-11 09:38
解决方法:
第114行改为:
稍等,我先试试id cjjJasonchen 发表于 2023-8-11 09:38
解决方法:
第114行改为:
问题找到了,id 是一样的(后四位)
只是不知道为什么每次都在变
歌者文明清理员 发表于 2023-8-11 09:45
问题找到了,id 是一样的(后四位)
只是不知道为什么每次都在变
因该是因为col的默认值是-1 可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子 cjjJasonchen 发表于 2023-8-11 09:53
可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子
有思路了,None……? cjjJasonchen 发表于 2023-8-11 09:53
可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子
class Chessman(pygame.sprite.Sprite):
def __init__(self, color, name):
# color: b黑色 / w白色
# name: k王 / q后 / r车 / b象 / n马 / p兵
# row for y, col for x
self.color = color
self.name = name
self.image = pygame.image.load(f'images/{color}{name}.png')
self.back = pygame.Surface((GRID, GRID)).convert_alpha()
self.back.fill((0, 0, 0, 0))
pygame.draw.circle(self.back, 'BurlyWood', self.back.get_rect().center, GRID / 2)
self.rect = self.image.get_rect()
# 不显示棋子
self.rect.topleft = (-GRID, -GRID)
self._row = -1
self._col = -1
@property
def row(self):
return self._row
@row.setter
def row(self, row):
old = self._row
self._row = row
self.rect.top = row * GRID
if old > -1:
chessboard = None
chessboard = self
@property
def col(self):
return self._col
@col.setter
def col(self, col):
old = self._col
self._col = col
self.rect.left = col * GRID
if old > -1:
chessboard = None
chessboard = self
还是一样 enmmm,还是最简单的方法吧,把车挪到最后生成
114行改成:
for name in 'kqbbnnpppppppprr': cjjJasonchen 发表于 2023-8-11 10:06
enmmm,还是最简单的方法吧,把车挪到最后生成
114行改成:
真的不能解决吗{:10_266:} 歌者文明清理员 发表于 2023-8-11 18:35
真的不能解决吗
{:10_282:}
我真的没看明白哪里出了问题。。。。{:10_263:}
对不起{:10_282:} 本帖最后由 鱼cpython学习者 于 2023-8-11 19:29 编辑
在34行,row.setter装饰的函数里面加一个判断语句:
@row.setter
def row(self, row):
old = self._row
self._row = row
self.rect.top = row * GRID
if self._row != -1 and self._col != -1:
chessboard = None
chessboard = self
你用这个setter来实现移动棋子到另一个格子,并把原先的格子清空。但是在初始化阶段,你在初始化棋子的行数chessman.row时,这个setter会顺带把棋盘(0, -1)或者(7, -1),也就是右上或右下清空。
这也是把车放在最后生成能解决问题的原因 鱼cpython学习者 发表于 2023-8-11 19:20
在34行,row.setter装饰的函数里面加一个判断语句:
你用这个setter来实现移动棋子到另一个格子,并把原 ...
抱歉来晚了
@row.setter
def row(self, row):
old = self._row
self._row = row
self.rect.top = row * GRID
if self._row != -1 and self._col != -1:
chessboard = None
chessboard = self
@property
def col(self):
return self._col
@col.setter
def col(self, col):
old = self._col
self._col = col
self.rect.left = col * GRID
if self._row != -1 and self._col != -1:
chessboard = None
chessboard = self
还是一样捏…… 歌者文明清理员 发表于 2023-8-11 22:41
抱歉来晚了
把col.setter里的判断语句改成
if self._row != -1 and old != -1:
其实,我推荐你加个move函数来代替setter实现移动位置的功能 鱼cpython学习者 发表于 2023-8-12 08:51
把col.setter里的判断语句改成
其实,我推荐你加个move函数来代替setter实现移动位置的功能
{:10_275:}解决了,方法已经被采纳
@row.setter
def row(self, row):
old = self._row
self._row = row
self.rect.top = row * GRID
if old != -1 and self._col != -1:
chessboard = None
chessboard = self
@property
def col(self):
return self._col
@col.setter
def col(self, col):
old = self._col
self._col = col
self.rect.left = col * GRID
if self._row != -1 and old != -1:
chessboard = None
chessboard = self {:10_257:}
页:
[1]
2