歌者文明清理员 发表于 2023-8-11 00:20:07

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:32

消失的它

歌者文明清理员 发表于 2023-8-11 09:13:41

cjjJasonchen 发表于 2023-8-11 09:08
消失的它

“下崽次数: 4”

cjjJasonchen 发表于 2023-8-11 09:23:54

呐,问题我好像差不多看出来了

print_chessboard()
      print("")

你把这个加到place_chess的最后,每帧都打印一下,看看返回值

cjjJasonchen 发表于 2023-8-11 09:27:24

你所有的棋子出现的时候,右上角和右下角的棋子都在变,导致了错误,

但是我还没有成功找到bug的具体位置,应该是生成棋子的算法问题,

代码是你写的,到这里说不定可以直接看出问题。。。所有我觉定先发出来{:10_282:}

cjjJasonchen 发表于 2023-8-11 09:38:32

解决方法:
        第114行改为:
        for name in 'kqbbnnpppppppprr':

        让车最后生成

bug原因:
        不知道为啥,棋子生成是,会顶掉右上角和右下角的格子


注意!这只是暂时修复了生成棋子时的bug,具体原因还没有找到

歌者文明清理员 发表于 2023-8-11 09:40:59

cjjJasonchen 发表于 2023-8-11 09:38
解决方法:
        第114行改为:
       


稍等,我先试试id

歌者文明清理员 发表于 2023-8-11 09:45:18

cjjJasonchen 发表于 2023-8-11 09:38
解决方法:
        第114行改为:
       


问题找到了,id 是一样的(后四位)

只是不知道为什么每次都在变

cjjJasonchen 发表于 2023-8-11 09:49:35

歌者文明清理员 发表于 2023-8-11 09:45
问题找到了,id 是一样的(后四位)

只是不知道为什么每次都在变

因该是因为col的默认值是-1

cjjJasonchen 发表于 2023-8-11 09:53:09

可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子

歌者文明清理员 发表于 2023-8-11 09:56:07

cjjJasonchen 发表于 2023-8-11 09:53
可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子



有思路了,None……?

歌者文明清理员 发表于 2023-8-11 09:57:39

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
还是一样

cjjJasonchen 发表于 2023-8-11 10:06:00

enmmm,还是最简单的方法吧,把车挪到最后生成
114行改成:
for name in 'kqbbnnpppppppprr':

歌者文明清理员 发表于 2023-8-11 18:35:20

cjjJasonchen 发表于 2023-8-11 10:06
enmmm,还是最简单的方法吧,把车挪到最后生成
114行改成:

真的不能解决吗{:10_266:}

cjjJasonchen 发表于 2023-8-11 18:41:47

歌者文明清理员 发表于 2023-8-11 18:35
真的不能解决吗

{:10_282:}

我真的没看明白哪里出了问题。。。。{:10_263:}

对不起{:10_282:}

鱼cpython学习者 发表于 2023-8-11 19:20:17

本帖最后由 鱼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),也就是右上或右下清空。
这也是把车放在最后生成能解决问题的原因

歌者文明清理员 发表于 2023-8-11 22:41:22

鱼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

还是一样捏……

鱼cpython学习者 发表于 2023-8-12 08:51:31

歌者文明清理员 发表于 2023-8-11 22:41
抱歉来晚了




把col.setter里的判断语句改成
if self._row != -1 and old != -1:

其实,我推荐你加个move函数来代替setter实现移动位置的功能

歌者文明清理员 发表于 2023-8-12 13:18:14

鱼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

Ewan-Ahiouy 发表于 2023-8-12 13:29:46

{:10_257:}
页: [1] 2
查看完整版本: Pygame