|
|
看起来你混淆了两个库:你当前的代码是基于 `tkinter` 的,但错误信息显示你试图运行 `pygame` 的代码(`pygame.event.get()`)。这两个库不能混用。
请检查你在 `hueizhi.py` 中到底用了哪一套代码。如果你确实是用 `tkinter` 画棋盘(就像上一段你贴出的完整代码那样),那么你只需要继续用 `tkinter` 的交互方式,不要导入 `pygame`。
下面我专门针对你这段 **tkinter 代码**,提供完整的棋子移动和人机对战实现。你只需将以下内容追加到你的 `hueizhi.py` 末尾(`root.mainloop()` 之前)即可。
**首先,在你原来的代码中找到最后一行 `root.mainloop()`,把它注释掉或删除,然后替换为下面的完整程序。**(当然你也可以在之前插入,但要确保数据结构定义好。)
---
### 完整 tkinter 人机对战代码(可直接替换你的文件末尾)
- import tkinter as tk
- import random
- root = tk.Tk()
- root.title('中国象棋 - 人机对战')
- canvas = tk.Canvas(root, width=700, height=750, bg='white')
- canvas.pack()
- SIZE = 60
- R = 25
- padding = 30
- # ----- 画棋盘(你的原代码)-----
- for row in range(10):
- y = padding + row * SIZE
- canvas.create_line(padding, y, padding + 8*SIZE, y, width=2)
- for col in range(9):
- x = padding + col * SIZE
- canvas.create_line(x, padding, x, padding + 4*SIZE, width=2)
- canvas.create_line(x, padding + 5*SIZE, x, padding + 9*SIZE, width=2)
- for row in range(10):
- for col in range(9):
- cx = padding + col * SIZE
- cy = padding + row * SIZE
- if (col==0 or col==8) and (row==0 or row==9):
- canvas.create_oval(cx-3, cy-3, cx+3, cy+3, fill='black')
- # ----- 数据结构 -----
- board = [ [None]*9 for _ in range(10) ]
- def set_piece(col, row, color, ptype):
- board[ row ][ col ] = {'color':color, 'type':ptype}
- # 初始化红方
- red_pieces = [
- (0,9,'车'), (1,9,'马'), (2,9,'象'), (3,9,'士'), (4,9,'将'),
- (5,9,'士'), (6,9,'象'), (7,9,'马'), (8,9,'车'),
- (1,7,'炮'), (7,7,'炮')
- ]
- for col in range(0,9,2):
- red_pieces.append((col,6,'兵'))
- for col,row,pt in red_pieces:
- set_piece(col, row, 'red', pt)
- # 初始化黑方
- black_pieces = [
- (0,0,'車'), (1,0,'馬'), (2,0,'象'), (3,0,'士'), (4,0,'将'),
- (5,0,'士'), (6,0,'象'), (7,0,'馬'), (8,0,'車'),
- (1,2,'炮'), (7,2,'炮')
- ]
- for col in range(0,9,2):
- black_pieces.append((col,3,'卒'))
- for col,row,pt in black_pieces:
- set_piece(col, row, 'black', pt)
- # ----- 画棋子函数(带tag)-----
- def draw_one_piece(col, row, color, text, tag='piece'):
- x = padding + col * SIZE
- y = padding + row * SIZE
- canvas.create_oval(x-R, y-R, x+R, y+R, outline='black', width=2, tags=tag)
- canvas.create_oval(x-R, y-R, x+R, y+R, fill=color, tags=tag)
- canvas.create_text(x, y, text=text, font=('Arial',20,'bold'), fill='white', tags=tag)
- def redraw_all():
- canvas.delete('piece')
- for row in range(10):
- for col in range(9):
- piece = board[row][col]
- if piece:
- color = piece['color']
- text = piece['type']
- draw_one_piece(col, row, 'red' if color=='red' else 'black', text, tag='piece')
- redraw_all()
- # ----- 鼠标交互 -------------------------------------------------
- selected = None # (col, row) 当前选中的棋子
- def pos_to_board(px, py):
- col = round((px - padding) / SIZE)
- row = round((py - padding) / SIZE)
- if 0 <= col <= 8 and 0 <= row <= 9:
- return col, row
- return None
- # ---------- 简单走法判断(仅供演示,只实现车、马、炮、兵的部分规则)--------
- def is_legal_move(piece, from_col, from_row, to_col, to_row):
- # 这里仅示意,真正完整的走法规则很长。以下只判断“不走出棋盘、不吃己方”
- if not (0 <= to_col <= 8 and 0 <= to_row <= 9):
- return False
- target = board[to_row][to_col]
- if target and target['color'] == piece['color']:
- return False
- # 实际你应判断具体棋子类型走法,此处直接返回 True 以演示交互
- return True
- def move_piece(from_col, from_row, to_col, to_row):
- piece = board[from_row][from_col]
- if not piece:
- return False
- if is_legal_move(piece, from_col, from_row, to_col, to_row):
- board[to_row][to_col] = piece
- board[from_row][from_col] = None
- redraw_all()
- return True
- return False
- def ai_move():
- # 随机选择一个黑方棋子,随机走一步(不考虑合法性,仅演示)
- black_pieces = []
- for row in range(10):
- for col in range(9):
- p = board[row][col]
- if p and p['color'] == 'black':
- black_pieces.append((col, row))
- if not black_pieces:
- return
- piece_pos = random.choice(black_pieces)
- col, row = piece_pos
- # 随机选择一个相邻位置(包括原地?不要原地)
- dirs = [ (-1,0),(1,0),(0,-1),(0,1) ]
- random.shuffle(dirs)
- for dc, dr in dirs:
- new_col = col + dc
- new_row = row + dr
- if 0 <= new_col <= 8 and 0 <= new_row <= 9:
- target = board[new_row][new_col]
- if not target or target['color'] != 'black':
- # 执行移动
- board[new_row][new_col] = board[row][col]
- board[row][col] = None
- redraw_all()
- return True
- return False
- def on_click(event):
- global selected
- pos = pos_to_board(event.x, event.y)
- if not pos:
- return
- col, row = pos
- piece = board[row][col]
- if selected is None:
- # 第一次点击:选中己方棋子(红方)
- if piece and piece['color'] == 'red':
- selected = (col, row)
- # 高亮选中(可选)
- canvas.create_rectangle(
- padding + col*SIZE - 5, padding + row*SIZE - 5,
- padding + col*SIZE + 5, padding + row*SIZE + 5,
- outline='yellow', width=3, tags='highlight')
- else:
- # 第二次点击:尝试移动
- from_col, from_row = selected
- if move_piece(from_col, from_row, col, row):
- # 移动成功,轮到AI
- canvas.delete('highlight')
- selected = None
- ai_move()
- else:
- # 移动失败,取消选择
- canvas.delete('highlight')
- selected = None
- canvas.bind('<Button-1>', on_click)
- root.mainloop()
复制代码
---
### 说明
1. **此代码完全基于你原来的 tkinter 棋盘**,无需安装额外库。
2. **点击红方棋子(第一次点击)** 会选中它(出现黄色小框),再点击目标位置即可移动。移动后 AI 自动走一步黑方。
3. **AI 非常弱**:它只是随机选择一个黑方棋子,然后向随机方向移动一步(不会吃子)。你可以在此基础上实现真正的 AI(如极小极大搜索)。
4. **走法合法性**:目前只判断了“不出棋盘、不吃己方”,没有实现具体棋子规则(车直线、马蹩脚等)。你需要根据棋子类型补充 `is_legal_move` 函数,但核心交互架构已经完整。
如果你希望用 `pygame` 版本,请在提问时明确说明。不过既然你已经写好了 tkinter 的绘制代码,建议继续用 tkinter 完成,因为两者切换会带来额外工作量。
现在请将你原有的 `pygame` 相关代码全部删除,只保留上面这段完整的 tkinter 代码并运行。祝你成功!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|