不用Pygame,用Python UI实现含登录页的象棋游戏!附完整代码
要使用 Python 编写一个不使用 `pygame` 的象棋游戏,并且包含登录页面,可以借助 `tkinter` 库来创建图形用户界面(GUI)。以下是一个实现该功能的示例代码: ```python import tkinter as tk from tkinter import messagebox # 登录页面类 class LoginPage: def __init__(self, root): self.root = root self.root.title("象棋登录") self.username_label = tk.Label(root, text="用户名:") self.username_label.pack() self.username_entry = tk.Entry(root) self.username_entry.pack() self.password_label = tk.Label(root, text="密码:") self.password_label.pack() self.password_entry = tk.Entry(root, show="*") self.password_entry.pack() self.login_button = tk.Button(root, text="登录", command=self.login) self.login_button.pack() def login(self): username = self.username_entry.get() password = self.password_entry.get() # 简单模拟验证,实际使用时应与数据库等进行验证 if username == "admin" and password == "123456": self.root.destroy() # 登录成功,打开象棋游戏 game_root = tk.Tk() game = ChessGame(game_root) game_root.mainloop() else: messagebox.showerror("登录失败", "用户名或密码错误") # 象棋游戏类 class ChessGame: def __init__(self, root): self.root = root self.root.title("中国象棋") self.board_size = 9, 10 self.board = [[None] * self.board_size[0] for _ in range(self.board_size[1])] self.current_player = 'red' self.selected_piece = None self.init_board() self.canvas = tk.Canvas(root, width=500, height=600) self.canvas.pack() self.draw_board() self.canvas.bind("<Button-1>", self.on_click) def init_board(self): # 初始化棋盘,放置棋子 red_pieces = [ ('车', 0, 0), ('马', 0, 1), ('相', 0, 2), ('仕', 0, 3), ('帅', 0, 4), ('仕', 0, 5), ('相', 0, 6), ('马', 0, 7), ('车', 0, 8), ('炮', 2, 1), ('炮', 2, 7), ('兵', 3, 0), ('兵', 3, 2), ('兵', 3, 4), ('兵', 3, 6), ('兵', 3, 8) ] black_pieces = [ ('车', 9, 0), ('马', 9, 1), ('象', 9, 2), ('士', 9, 3), ('将', 9, 4), ('士', 9, 5), ('象', 9, 6), ('马', 9, 7), ('车', 9, 8), ('炮', 7, 1), ('炮', 7, 7), ('卒', 6, 0), ('卒', 6, 2), ('卒', 6, 4), ('卒', 6, 6), ('卒', 6, 8) ] for piece, row, col in red_pieces: self.board[row][col] = (piece, 'red') for piece, row, col in black_pieces: self.board[row][col] = (piece, 'black') def draw_board(self): # 绘制棋盘 for i in range(self.board_size[1]): self.canvas.create_line(50, 50 + i * 50, 450, 50 + i * 50) for j in range(self.board_size[0]): self.canvas.create_line(50 + j * 50, 50, 50 + j * 50, 550) # 绘制棋子 for row in range(self.board_size[1]): for col in range(self.board_size[0]): if self.board[row][col]: piece, color = self.board[row][col] x = 50 + col * 50 y = 50 + row * 50 self.canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill='yellow' if color == 'red' else 'gray') self.canvas.create_text(x, y, text=piece, font=('Arial', 20)) def draw_board(self): # 绘制棋盘 for i in range(self.board_size[1]): self.canvas.create_line(50, 50 + i * 50, 450, 50 + i * 50) for j in range(self.board_size[0]): self.canvas.create_line(50 + j * 50, 50, 50 + j * 50, 550) # 绘制棋子 for row in range(self.board_size[1]): for col in range(self.board_size[0]): if self.board[row][col]: piece, color = self.board[row][col] x = 50 + col * 50 y = 50 + row * 50 self.canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill='yellow' if color == 'red' else 'gray') self.canvas.create_text(x, y, text=piece, font=('Arial', 20)) def on_click(self, event): col = (event.x - 50) // 50 row = (event.y - 50) // 50 if 0 <= col < self.board_size[0] and 0 <= row < self.board_size[1]: if self.selected_piece is None: piece = self.board[row][col] if piece and piece[1] == self.current_player: self.selected_piece = (row, col) else: if self.is_valid_move(self.selected_piece, (row, col)): self.move_piece(self.selected_piece, (row, col)) self.current_player = 'black' if self.current_player == 'red' else 'red' self.selected_piece = None self.draw_board() def is_valid_move(self, from_pos, to_pos): piece = self.board[from_pos[0]][from_pos[1]] target = self.board[to_pos[0]][to_pos[1]] if target and target[1] == piece[1]: return False # 简单示例,仅判断基本移动规则,未实现完整规则 if piece[0] == '车': return self.is_valid_rook_move(from_pos, to_pos) elif piece[0] == '马': return self.is_valid_horse_move(from_pos, to_pos) # 其他棋子规则可类似添加 return True def is_valid_rook_move(self, from_pos, to_pos): fr, fc = from_pos tr, tc = to_pos if fr == tr: start, end = min(fc, tc) + 1, max(fc, tc) for col in range(start, end): if self.board[fr][col]: return False return True elif fc == tc: start, end = min(fr, tr) + 1, max(fr, tr) for row in range(start, end): if self.board[row][fc]: return False return True return False def is_valid_horse_move(self, from_pos, to_pos): fr, fc = from_pos tr, tc = to_pos dr, dc = abs(tr - fr), abs(tc - fc) if dr == 2 and dc == 1: block_row = fr + (1 if tr > fr else -1) if not self.board[block_row][fc]: return True elif dr == 1 and dc == 2: block_col = fc + (1 if tc > fc else -1) if not self.board[fr][block_col]: return True return False def move_piece(self, from_pos, to_pos): piece = self.board[from_pos[0]][from_pos[1]] self.board[from_pos[0]][from_pos[1]] = None self.board[to_pos[0]][to_pos[1]] = piece if __name__ == "__main__": root = tk.Tk() login = LoginPage(root) root.mainloop() ``` 代码说明: 1. 登录页面:`LoginPage` 类实现了一个简单的登录页面,用户输入用户名和密码,点击登录按钮进行验证。如果验证成功,将打开象棋游戏窗口。 2. 象棋游戏:`ChessGame` 类实现了象棋游戏的主要逻辑,包括初始化棋盘、绘制棋盘、处理鼠标点击事件、判断棋子移动是否合法等。 3. 棋子移动规则:目前仅实现了车和马的基本移动规则,其他棋子的规则可以根据需要添加。 4. 吃子和将军:代码中未完整实现吃子和将军的逻辑,可根据象棋规则进一步完善。 运行代码后,会先弹出登录页面,输入正确的用户名和密码(用户名:`admin`,密码:`123456`)后,将打开象棋游戏窗口。 ######[AI问答 | 2317点数解答 | 2025-11-23 08:10:33]
- 修正代码实现“3D爱心粒子跳动”,附运行错误及逻辑注意点(字节豆包 | 1111点数解答 | 2025-07-28 22:34:46)159
- Python 实现 3D 爱心粒子跳动特效:代码解析与注意要点(字节豆包 | 1142点数解答 | 2025-07-28 22:36:37)155
- Python生日祝福爱心粒子特效代码优化与开发建议(字节豆包 | 2223点数解答 | 2026-03-21 14:32:57)15
- 超燃年会来袭!诗舞歌戏轮番上阵,共赴欢乐盛宴! (字节豆包 | 206点数解答 | 2025-01-08 10:59:43)347
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)467
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)349
- 职中生用PHP+MySQL+HTML搭建湘绣文化网站,功能全易上手!(DeepSeek | 3146点数解答 | 2025-05-08 23:00:48)207
- Python 报错:for 语句后缩进缺失,附修正示例与注意要点(字节豆包 | 170点数解答 | 2025-03-19 21:49:55)207
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)420
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)414
- HTML 代码问题分析、修正及开发小心点揭秘:打造完美爱心动画 (字节豆包 | 1993点数解答 | 2025-11-02 23:37:54)97
- C++ 实现我的世界基岩版:从简单框架到开发要点揭秘(字节豆包 | 182点数解答 | 2025-02-22 15:53:11)201