鱼C论坛

 找回密码
 立即注册
查看: 2194|回复: 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 行的输出:
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 , ]
[None, None, None, None, None, None, None, None, ]
[None, None, None, None, None, None, None, None, ]
[None, None, None, None, None, None, None, None, ]
[None, None, None, None, None, None, None, None, ]
[ wp ,  wp ,  wp ,  wp ,  wp ,  wp ,  wp ,  wp , ]
[ wr ,  wn ,  wb ,  wq ,  wk ,  wb ,  wn , None, ]

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


把col.setter里的判断语句改成
if self._row != -1 and old != -1:
其实,我推荐你加个move函数来代替setter实现移动位置的功能

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-11 09:08:32 | 显示全部楼层
消失的它
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

“下崽次数: 4”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你把这个加到place_chess的最后,每帧都打印一下,看看返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

        让车最后生成

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


注意!这只是暂时修复了生成棋子时的bug,具体原因还没有找到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

稍等,我先试试id
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

Snipaste_2023-08-11_09-44-29.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

因该是因为col的默认值是-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:53:09 | 显示全部楼层
可以试试把棋子生成时的xy轴位置改成一个没用的格子,比如3,1啊,4,3啊之类的没有东西的格子
想知道小甲鱼最近在做啥?请访问 -> 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……?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[old][self._col] = None
            chessboard[row][self._col] = 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[self._row][old] = None
            chessboard[self._row][col] = self
还是一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 10:06:00 | 显示全部楼层
enmmm,还是最简单的方法吧,把车挪到最后生成
114行改成:
for name in 'kqbbnnpppppppprr':
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

真的不能解决吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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



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

对不起
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[old][self._col] = None
        chessboard[row][self._col] = self
你用这个setter来实现移动棋子到另一个格子,并把原先的格子清空。但是在初始化阶段,你在初始化棋子的行数chessman.row时,这个setter会顺带把棋盘(0, -1)或者(7, -1),也就是右上或右下清空。
这也是把车放在最后生成能解决问题的原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[old][self._col] = None
            chessboard[row][self._col] = 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[self._row][old] = None
            chessboard[self._row][col] = self

还是一样捏……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


把col.setter里的判断语句改成
if self._row != -1 and old != -1:
其实,我推荐你加个move函数来代替setter实现移动位置的功能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


解决了,方法已经被采纳
    @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[old][self._col] = None
            chessboard[row][self._col] = 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[self._row][old] = None
            chessboard[self._row][col] = self
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 13:29:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 22:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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