鱼C论坛

 找回密码
 立即注册
查看: 512|回复: 3

[已解决]python五子棋悔棋时删除最后两子不成功

[复制链接]
发表于 2025-1-10 14:24:39 | 显示全部楼层 |阅读模式

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

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

x
python五子棋按悔棋按钮删除最后两子不成功,显示:
    GameLayer.remove(bo)
TypeError: remove() missing 1 required positional argument: 'obj'
  1. import cocos
  2. from cocos.scene import Scene
  3. from cocos.director import director
  4. from cocos.menu import *
  5. from pyglet.gl import *
  6. import random
  7. import pyglet
  8. list1=[(-1,-1, 0)]
  9. qizi= []
  10. class OptionMenu(Menu):
  11.     def __init__(self):
  12.         super().__init__()
  13.         self.font_item["font_name"] = "kaiti"
  14.         self.font_item["font_size"] = 32
  15.         self.font_item["color"] = (160, 16, 0, 255)

  16.         self.font_item_selected["font_name"] = "kaiti"
  17.         self.font_item_selected["font_size"] = 40
  18.         self.font_item_selected["color"] = (0, 128, 0, 255)
  19.         items = []
  20.         items.append(MenuItem("悔棋", self.on_huiqi))
  21.         items.append(MenuItem("帮助", self.on_help))
  22.         self.create_menu(items, shake(), shake_back(),
  23.                          layout_strategy=fixedPositionMenuLayout([(760, 240), (760, 300)]))

  24.     def on_huiqi(self):
  25.         bo = qizi[-1]
  26.         GameLayer.remove(bo)
  27.         del list1[-1]
  28.         bo = qizi[-1]
  29.         GameLayer.remove(bo)
  30.         del list1[-1]

  31.     def on_help(self):
  32.         pass
  33. class GameLayer(cocos.layer.ColorLayer):
  34.     global  list1, qizi
  35.     def __init__(self):
  36.         super().__init__(22, 142, 202, 128)
  37.         cocos.layer.Layer.is_event_handler = True
  38.         bg = cocos.sprite.Sprite('bc55.jpg')
  39.         bg.position = (350, 350)
  40.         self.add(bg)

  41.     def on_mouse_press(self, x, y, button, modifiers):
  42.         if button == pyglet.window.mouse.LEFT:
  43.             x = round((x - 35) / 45)
  44.             y = round((y - 35) / 45)
  45.             if (x, y, 1) in list1:
  46.                 return None
  47.             elif (x, y, 2) in list1:
  48.                 return None
  49.             elif x < 0 or y < 0 or x > 14 or y > 14:
  50.                 return None

  51.             blk0 = cocos.sprite.Sprite('3.png')
  52.             blk0.position = (x * 45 + 35, y * 45 + 35)
  53.             self.add(blk0)
  54.             qizi.append(blk0)
  55.             list1.append((x, y, 1))

  56.             self.computer_move()

  57.     def computer_move(self):
  58.         x = random.randint(0,14)
  59.         y = random.randint(0, 14)
  60.         if (x, y, 1) in list1:
  61.             return None
  62.         elif (x, y, 2) in list1:
  63.             return None

  64.         wht0 = cocos.sprite.Sprite('4.png')
  65.         wht0.position = (x * 45 + 35, y * 45 + 35)
  66.         self.add(wht0)
  67.         qizi.append(wht0)
  68.         list1.append((x, y, 2))
  69.         wht0.do(cocos.actions.Blink(2, 2))

  70. def create_game_scene():
  71.     scene = Scene()
  72.     scene.add(GameLayer(), z=1)
  73.     scene.add(OptionMenu(), z=2)
  74.     return scene

  75. def main():
  76.     director.init(850, 700,resizable=True,  caption="五子棋")
  77.     director.run(create_game_scene())

  78. if __name__ == "__main__":
  79.     main()
复制代码
最佳答案
2025-1-10 14:30:23
ydwb 发表于 2025-01-10 14:30
raise Exception("Child not found: %s" % str(child) ...


出现这个错误通常是因为要移除的子对象(棋子)在父层(`GameLayer`)中找不到。你提供的代码中有一些问题需要确认和修正:

1. 确保`qizi`列表中存放的是实际已经添加到`GameLayer`中的棋子对象。

2. 在`OptionMenu`类中的`on_huiqi`方法中,`self.parent`是否正确指向包含`GameLayer`的父级对象。这里我们假定`OptionMenu`和`GameLayer`在同一场景中。

请参考以下调整代码的建议:

  1. class OptionMenu(Menu):
  2.     def __init__(self):
  3.         super().__init__()
  4.         # 其他初始化代码...

  5.     def on_huiqi(self):
  6.         # 确保qizi和list1在本地已经被正确初始化
  7.         global qizi, list1
  8.         if len(qizi) >= 2:
  9.             # 移除玩家的最后一步棋子
  10.             last_player_piece = qizi.pop()
  11.             self.parent.get_children()[0].remove(last_player_piece)
  12.             list1.pop()

  13.             # 移除计算机的最后一步棋子
  14.             last_computer_piece = qizi.pop()
  15.             self.parent.get_children()[0].remove(last_computer_piece)
  16.             list1.pop()
复制代码


在这个代码中,`self.parent.get_children()[0]`假设`GameLayer`是场景中的第一个子节点。如果有多个节点,请确认`GameLayer`节点的索引正确。

注意:确保在`GameLayer`类中正确维护棋子对象的添加到`qizi`列表时,它们也被添加到了`GameLayer`中。

另外,确保在程序启动时,`list1`和`qizi`是在游戏的全局上下文中被初始化的,例如可以在文件的最上面:

  1. list1 = []
  2. qizi = []
复制代码


通过上述检查和调整,希望能够解决你遇到的问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-1-10 14:24:51 | 显示全部楼层
你好,根据你提供的代码问题,`GameLayer.remove()`方法的调用方式错误。这里我们需要从`qizi`列表中获取最后两个棋子并移除,而不是直接调用`remove()`方法。此外,代码中使用`del list1`是错误的,因为会导致以后无法访问`list1`。你应该修改`on_huiqi`方法如下:

  1. def on_huiqi(self):
  2.     if len(qizi) >= 2:  # 确保存在至少两个棋子可以移除
  3.         # 移除最后一个玩家的棋子
  4.         last_player_piece = qizi.pop()
  5.         self.parent.remove(last_player_piece)  # 使用self.parent来获取GameLayer的实例
  6.         list1.pop()  # 移除相应的坐标信息

  7.         # 移除最后一个计算机的棋子
  8.         last_computer_piece = qizi.pop()
  9.         self.parent.remove(last_computer_piece)  # 使用self.parent来获取GameLayer的实例
  10.         list1.pop()  # 移除相应的坐标信息
复制代码


请注意,上述代码中的`self.parent`假设`OptionMenu`和`GameLayer`存在于同一场景中,并且`OptionMenu`作为事件的一部分,能够访问`GameLayer`实例。在调用`remove`时,我们从`GameLayer`实例中移除棋子。

确保`qizi`和`list1`在你的代码中是正确初始化的列表对象,并且在棋子移动时,它们按照出现的顺序正确记录每一步的状态。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-10 14:30:07 | 显示全部楼层
    raise Exception("Child not found: %s" % str(child))
Exception: Child not found: <cocos.sprite.Sprite object at 0x0000000007773D30>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-10 14:30:23 | 显示全部楼层    本楼为最佳答案   
ydwb 发表于 2025-01-10 14:30
raise Exception("Child not found: %s" % str(child) ...


出现这个错误通常是因为要移除的子对象(棋子)在父层(`GameLayer`)中找不到。你提供的代码中有一些问题需要确认和修正:

1. 确保`qizi`列表中存放的是实际已经添加到`GameLayer`中的棋子对象。

2. 在`OptionMenu`类中的`on_huiqi`方法中,`self.parent`是否正确指向包含`GameLayer`的父级对象。这里我们假定`OptionMenu`和`GameLayer`在同一场景中。

请参考以下调整代码的建议:

  1. class OptionMenu(Menu):
  2.     def __init__(self):
  3.         super().__init__()
  4.         # 其他初始化代码...

  5.     def on_huiqi(self):
  6.         # 确保qizi和list1在本地已经被正确初始化
  7.         global qizi, list1
  8.         if len(qizi) >= 2:
  9.             # 移除玩家的最后一步棋子
  10.             last_player_piece = qizi.pop()
  11.             self.parent.get_children()[0].remove(last_player_piece)
  12.             list1.pop()

  13.             # 移除计算机的最后一步棋子
  14.             last_computer_piece = qizi.pop()
  15.             self.parent.get_children()[0].remove(last_computer_piece)
  16.             list1.pop()
复制代码


在这个代码中,`self.parent.get_children()[0]`假设`GameLayer`是场景中的第一个子节点。如果有多个节点,请确认`GameLayer`节点的索引正确。

注意:确保在`GameLayer`类中正确维护棋子对象的添加到`qizi`列表时,它们也被添加到了`GameLayer`中。

另外,确保在程序启动时,`list1`和`qizi`是在游戏的全局上下文中被初始化的,例如可以在文件的最上面:

  1. list1 = []
  2. qizi = []
复制代码


通过上述检查和调整,希望能够解决你遇到的问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 20:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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