鱼C论坛

 找回密码
 立即注册
查看: 3256|回复: 25

[已解决]Pygame

[复制链接]
发表于 2023-8-11 00:20:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 歌者文明清理员 于 2023-8-12 13:18 编辑

(因为 GPT 脚本的问题,先不发求助区)

我的问题:

Snipaste_2023-08-11_00-16-40.png

右上角和右下角车不显示。这很奇怪,代码也检查不出啥错的。

Debug 过程:在第 138 和 139 行之间添加了一行 print(1) 用于 Debug,发现输出了两次 1,应该是重复放置的问题

另外,第 224 行的输出:

  1. pygame 2.5.0 (SDL 2.28.0, Python 3.11.4)
  2. Hello from the pygame community. https://www.pygame.org/contribute.html
  3. [ br ,  bn ,  bb ,  bq ,  bk ,  bb ,  bn , None, ]
  4. [ bp ,  bp ,  bp ,  bp ,  bp ,  bp ,  bp ,  bp , ]
  5. [None, None, None, None, None, None, None, None, ]
  6. [None, None, None, None, None, None, None, None, ]
  7. [None, None, None, None, None, None, None, None, ]
  8. [None, None, None, None, None, None, None, None, ]
  9. [ wp ,  wp ,  wp ,  wp ,  wp ,  wp ,  wp ,  wp , ]
  10. [ wr ,  wn ,  wb ,  wq ,  wk ,  wb ,  wn , None, ]
复制代码


question.zip (21.26 KB, 下载次数: 10)
最佳答案
2023-8-12 08:51:31


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

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

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-11 09:08:32 | 显示全部楼层
消失的它
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:13:41 | 显示全部楼层

“下崽次数: 4”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:23:54 | 显示全部楼层
呐,问题我好像差不多看出来了

  1. print_chessboard()
  2.         print("")
复制代码


你把这个加到place_chess的最后,每帧都打印一下,看看返回值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:27:24 | 显示全部楼层
你所有的棋子出现的时候,右上角和右下角的棋子都在变,导致了错误,

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

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

评分

参与人数 1贡献 +1 收起 理由
歌者文明清理员 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:38:32 | 显示全部楼层
解决方法:
        第114行改为:
  1. for name in 'kqbbnnpppppppprr':
复制代码


        让车最后生成

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


注意!这只是暂时修复了生成棋子时的bug,具体原因还没有找到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:40:59 | 显示全部楼层
cjjJasonchen 发表于 2023-8-11 09:38
解决方法:
        第114行改为:
       

稍等,我先试试id
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:45:18 | 显示全部楼层
cjjJasonchen 发表于 2023-8-11 09:38
解决方法:
        第114行改为:
       

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

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

Snipaste_2023-08-11_09-44-29.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:49:35 | 显示全部楼层
歌者文明清理员 发表于 2023-8-11 09:45
问题找到了,id 是一样的(后四位)

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

因该是因为col的默认值是-1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:53:09 | 显示全部楼层
可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

Snipaste_2023-08-11_09-55-21.png

有思路了,None……?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:57:39 | 显示全部楼层
cjjJasonchen 发表于 2023-8-11 09:53
可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子
  1. class Chessman(pygame.sprite.Sprite):
  2.     def __init__(self, color, name):
  3.         # color: b黑色 / w白色
  4.         # name: k王 / q后 / r车 / b象 / n马 / p兵
  5.         # row for y, col for x
  6.         self.color = color
  7.         self.name = name
  8.         self.image = pygame.image.load(f'images/{color}{name}.png')
  9.         self.back = pygame.Surface((GRID, GRID)).convert_alpha()
  10.         self.back.fill((0, 0, 0, 0))
  11.         pygame.draw.circle(self.back, 'BurlyWood', self.back.get_rect().center, GRID / 2)
  12.         self.rect = self.image.get_rect()
  13.         # 不显示棋子
  14.         self.rect.topleft = (-GRID, -GRID)
  15.         self._row = -1
  16.         self._col = -1

  17.     @property
  18.     def row(self):
  19.         return self._row
  20.    
  21.     @row.setter
  22.     def row(self, row):
  23.         old = self._row
  24.         self._row = row
  25.         self.rect.top = row * GRID
  26.         if old > -1:
  27.             chessboard[old][self._col] = None
  28.             chessboard[row][self._col] = self

  29.     @property
  30.     def col(self):
  31.         return self._col

  32.     @col.setter
  33.     def col(self, col):
  34.         old = self._col
  35.         self._col = col
  36.         self.rect.left = col * GRID
  37.         if old > -1:
  38.             chessboard[self._row][old] = None
  39.             chessboard[self._row][col] = self
复制代码

还是一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 10:06:00 | 显示全部楼层
enmmm,还是最简单的方法吧,把车挪到最后生成
114行改成:
  1. for name in 'kqbbnnpppppppprr':
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 18:35:20 | 显示全部楼层
cjjJasonchen 发表于 2023-8-11 10:06
enmmm,还是最简单的方法吧,把车挪到最后生成
114行改成:

真的不能解决吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 18:41:47 | 显示全部楼层



我真的没看明白哪里出了问题。。。。

对不起
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 19:20:17 | 显示全部楼层
本帖最后由 鱼cpython学习者 于 2023-8-11 19:29 编辑

在34行,row.setter装饰的函数里面加一个判断语句:
  1. @row.setter
  2. def row(self, row):
  3.     old = self._row
  4.     self._row = row
  5.     self.rect.top = row * GRID
  6.     if self._row != -1 and self._col != -1:
  7.         chessboard[old][self._col] = None
  8.         chessboard[row][self._col] = self
复制代码

你用这个setter来实现移动棋子到另一个格子,并把原先的格子清空。但是在初始化阶段,你在初始化棋子的行数chessman.row时,这个setter会顺带把棋盘(0, -1)或者(7, -1),也就是右上或右下清空。
这也是把车放在最后生成能解决问题的原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 22:41:22 | 显示全部楼层
鱼cpython学习者 发表于 2023-8-11 19:20
在34行,row.setter装饰的函数里面加一个判断语句:

你用这个setter来实现移动棋子到另一个格子,并把原 ...


抱歉来晚了

  1.     @row.setter
  2.     def row(self, row):
  3.         old = self._row
  4.         self._row = row
  5.         self.rect.top = row * GRID
  6.         if self._row != -1 and self._col != -1:
  7.             chessboard[old][self._col] = None
  8.             chessboard[row][self._col] = self

  9.     @property
  10.     def col(self):
  11.         return self._col

  12.     @col.setter
  13.     def col(self, col):
  14.         old = self._col
  15.         self._col = col
  16.         self.rect.left = col * GRID
  17.         if self._row != -1 and self._col != -1:
  18.             chessboard[self._row][old] = None
  19.             chessboard[self._row][col] = self
复制代码


还是一样捏……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 08:51:31 | 显示全部楼层    本楼为最佳答案   


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

其实,我推荐你加个move函数来代替setter实现移动位置的功能
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 13:18:14 | 显示全部楼层
鱼cpython学习者 发表于 2023-8-12 08:51
把col.setter里的判断语句改成

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


解决了,方法已经被采纳
  1.     @row.setter
  2.     def row(self, row):
  3.         old = self._row
  4.         self._row = row
  5.         self.rect.top = row * GRID
  6.         if old != -1 and self._col != -1:
  7.             chessboard[old][self._col] = None
  8.             chessboard[row][self._col] = self

  9.     @property
  10.     def col(self):
  11.         return self._col

  12.     @col.setter
  13.     def col(self, col):
  14.         old = self._col
  15.         self._col = col
  16.         self.rect.left = col * GRID
  17.         if self._row != -1 and old != -1:
  18.             chessboard[self._row][old] = None
  19.             chessboard[self._row][col] = self
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 13:29:46 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表