import tkinter as tk
from tkinter import messagebox, font
import random
class MilitaryChess:
def __init__(self, root):
self.root = root
self.root.title("中国军旗")
self.root.geometry("800x650")
self.root.resizable(False, False)
# 设置中文字体
self.font_family = "SimHei"
self.normal_font = font.Font(family=self.font_family, size=10)
self.title_font = font.Font(family=self.font_family, size=16, weight="bold")
self.button_font = font.Font(family=self.font_family, size=10)
# 游戏状态
self.current_player = "红方" # 红方先行
self.selected_piece = None
self.game_over = False
self.winner = None
# 初始化棋盘 (12x5)
self.board = [[None for _ in range(5)] for _ in range(12)]
# 棋子等级 (数字越大等级越高,0表示工兵,特殊规则)
self.rank = {
"军旗": 0, "工兵": 1, "排长": 2, "连长": 3, "营长": 4,
"团长": 5, "旅长": 6, "师长": 7, "军长": 8, "司令": 9,
"地雷": 10, "炸弹": 11
}
# 初始化UI
self.create_widgets()
# 初始化游戏
self.initialize_game()
def create_widgets(self):
# 创建主框架
self.main_frame = tk.Frame(self.root)
self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 创建游戏信息框架
self.info_frame = tk.Frame(self.main_frame, height=50)
self.info_frame.pack(fill=tk.X, pady=(0, 10))
self.info_frame.pack_propagate(False)
self.title_label = tk.Label(self.info_frame, text="中国军旗", font=self.title_font)
self.title_label.pack(side=tk.LEFT, padx=20)
self.status_label = tk.Label(self.info_frame, text=f"当前回合: {self.current_player}", font=self.normal_font)
self.status_label.pack(side=tk.LEFT, padx=20)
self.turn_button = tk.Button(self.info_frame, text="结束回合", font=self.button_font,
command=self.change_turn)
self.turn_button.pack(side=tk.RIGHT, padx=20)
# 创建棋盘框架
self.board_frame = tk.Frame(self.main_frame)
self.board_frame.pack(fill=tk.BOTH, expand=True)
# 创建12x5的棋盘按钮
self.buttons = []
for i in range(12):
row = []
for j in range(5):
btn = tk.Button(self.board_frame, width=10, height=5, font=self.normal_font,
command=lambda r=i, c=j: self.on_board_click(r, c))
btn.grid(row=i, column=j, padx=1, pady=1)
row.append(btn)
self.buttons.append(row)
# 创建操作按钮框架
self.control_frame = tk.Frame(self.main_frame, height=50)
self.control_frame.pack(fill=tk.X, pady=10)
self.control_frame.pack_propagate(False)
self.reset_button = tk.Button(self.control_frame, text="重新开始", font=self.button_font,
command=self.reset_game)
self.reset_button.pack(side=tk.LEFT, padx=20)
self.help_button = tk.Button(self.control_frame, text="游戏帮助", font=self.button_font,
command=self.show_help)
self.help_button.pack(side=tk.RIGHT, padx=20)
def initialize_game(self):
# 初始化棋盘 - 简化版,仅放置部分棋子
# 红方棋子 (上方)
red_pieces = ["军旗", "工兵", "排长", "连长", "营长",
"团长", "旅长", "师长", "军长", "司令",
"地雷", "地雷", "地雷", "炸弹", "炸弹"]
# 随机放置红方棋子
red_positions = [(i, j) for i in range(0, 5) for j in range(5)]
random.shuffle(red_positions)
for i, piece in enumerate(red_pieces):
if i < len(red_positions):
row, col = red_positions[i]
self.board[row][col] = {"type": piece, "player": "红方", "revealed": False}
# 蓝方棋子 (下方)
blue_pieces = ["军旗", "工兵", "排长", "连长", "营长",
"团长", "旅长", "师长", "军长", "司令",
"地雷", "地雷", "地雷", "炸弹", "炸弹"]
# 随机放置蓝方棋子
blue_positions = [(i, j) for i in range(7, 12) for j in range(5)]
random.shuffle(blue_positions)
for i, piece in enumerate(blue_pieces):
if i < len(blue_positions):
row, col = blue_positions[i]
self.board[row][col] = {"type": piece, "player": "蓝方", "revealed": False}
# 绘制棋盘
self.draw_board()
def draw_board(self):
# 绘制铁路线和行营 (简化版)
for i in range(12):
for j in range(5):
# 行营位置 (简化版)
if (i in (2, 4, 7, 9) and j in (1, 3)) or (i in (3, 8) and j == 2):
self.buttons[i][j].config(bg="#aaffaa") # 浅绿色表示行营
else:
self.buttons[i][j].config(bg="#ffffff") # 白色表示普通格子
# 绘制棋子
for i in range(12):
for j in range(5):
piece = self.board[i][j]
if piece:
if piece["revealed"]:
# 已翻开的棋子显示类型和颜色
text = f"{piece['player']}
{piece['type']}"
if piece["player"] == "红方":
self.buttons[i][j].config(text=text, fg="red")
else:
self.buttons[i][j].config(text=text, fg="blue")
else:
# 未翻开的棋子只显示颜色
text = f"{piece['player']}
未翻开"
if piece["player"] == "红方":
self.buttons[i][j].config(text=text, fg="red")
else:
self.buttons[i][j].config(text=text, fg="blue")
else:
# 空位置
self.buttons[i][j].config(text="")
def on_board_click(self, row, col):
if self.game_over:
return
piece = self.board[row][col]
# 如果已经选中一个棋子,尝试移动
if self.selected_piece:
s_row, s_col = self.selected_piece
source_piece = self.board[s_row][s_col]
# 检查是否是合法移动
if self.is_valid_move(s_row, s_col, row, col):
# 处理移动
self.handle_move(s_row, s_col, row, col)
self.selected_piece = None
self.draw_board()
else:
# 如果点击的是己方棋子,更新选中状态
if piece and piece["player"] == self.current_player:
self.selected_piece = (row, col)
self.highlight_selected()
else:
# 如果没有选中棋子,检查是否可以选中当前点击的棋子
if piece and piece["player"] == self.current_player:
self.selected_piece = (row, col)
self.highlight_selected()
def highlight_selected(self):
# 重置所有按钮颜色
self.draw_board()
# 高亮选中的棋子
if self.selected_piece:
row, col = self.selected_piece
self.buttons[row][col].config(bg="#ffffaa") # 黄色表示选中
def is_valid_move(self, s_row, s_col, d_row, d_col):
# 检查目标位置是否是行营
if (d_row in (2, 4, 7, 9) and d_col in (1, 3)) or (d_row in (3, 8) and d_col == 2):
# 行营只能被一个棋子占据
if self.board[d_row][d_col]:
return False
# 检查移动是否是横向或纵向一格
if (abs(s_row - d_row) == 1 and s_col == d_col) or (abs(s_col - d_col) == 1 and s_row == d_row):
return True
# 简化版铁路移动规则:可以沿着铁路直线移动任意格
# 铁路位置简化为所有行和第2列
if (s_col == 2 and d_col == 2) or (s_row == d_row):
# 检查路径上是否有棋子阻挡
if s_col == d_col: # 纵向移动
start_row = min(s_row, d_row)
end_row = max(s_row, d_row)
for r in range(start_row + 1, end_row):
if self.board[r][s_col]:
return False
return True
elif s_row == d_row: # 横向移动
start_col = min(s_col, d_col)
end_col = max(s_col, d_col)
for c in range(start_col + 1, end_col):
if self.board[s_row][c]:
return False
return True
return False
def handle_move(self, s_row, s_col, d_row, d_col):
source_piece = self.board[s_row][s_col]
target_piece = self.board[d_row][d_col]
# 翻开棋子
source_piece["revealed"] = True
if target_piece:
# 处理吃子
target_piece["revealed"] = True
result = self.resolve_battle(source_piece, target_piece)
if result == "win" or result == "draw":
# 移动棋子并移除目标棋子
self.board[d_row][d_col] = source_piece
self.board[s_row][s_col] = None
# 检查是否吃掉军旗
if target_piece["type"] == "军旗":
self.game_over = True
self.winner = self.current_player
messagebox.showinfo("游戏结束", f"{self.winner}胜利!")
elif result == "lose":
# 只移除移动的棋子
self.board[s_row][s_col] = None
else:
# 简单移动
self.board[d_row][d_col] = source_piece
self.board[s_row][s_col] = None
def resolve_battle(self, attacker, defender):
# 处理战斗结果
if attacker["type"] == "工兵" and defender["type"] == "地雷":
return "win" # 工兵可以排除地雷
elif attacker["type"] == "炸弹" or defender["type"] == "炸弹":
return "draw" # 炸弹同归于尽
elif defender["type"] == "军旗":
return "win" # 吃掉军旗
elif defender["type"] == "地雷":
return "lose" # 非工兵碰到地雷输
elif self.rank[attacker["type"]] > self.rank[defender["type"]]:
return "win" # 攻击者等级高
elif self.rank[attacker["type"]] < self.rank[defender["type"]]:
return "lose" # 攻击者等级低
else:
return "draw" # 相同等级同归于尽
def change_turn(self):
if not self.game_over:
self.current_player = "蓝方" if self.current_player == "红方" else "红方"
self.status_label.config(text=f"当前回合: {self.current_player}")
self.selected_piece = None
self.draw_board()
def reset_game(self):
# 重置游戏状态
self.current_player = "红方"
self.selected_piece = None
self.game_over = False
self.winner = None
# 清空棋盘
self.board = [[None for _ in range(5)] for _ in range(12)]
# 重新初始化游戏
self.initialize_game()
# 更新状态标签
self.status_label.config(text=f"当前回合: {self.current_player}")
def show_help(self):
help_text = """
中国军旗游戏规则:
基本规则:
1. 游戏双方为红方和蓝方,各有1个军旗、2个炸弹、3个地雷和10个不同等级的战斗棋子。
2. 红方先行,双方轮流移动棋子。
棋子等级:
司令 > 军长 > 师长 > 旅长 > 团长 > 营长 > 连长 > 排长 > 工兵
特殊棋子:工兵可以排除地雷,炸弹与任何棋子同归于尽。
移动规则:
- 普通格子:只能移动一格。
- 铁路线:可以沿直线任意移动。
- 行营:安全区域,任何棋子不能吃行营中的棋子。
胜负判定:
- 吃掉对方军旗获胜。
- 对方无棋可走时获胜。
操作说明:
- 点击己方棋子选中,再点击目标位置移动。
- 点击"结束回合"按钮切换回合。
"""
messagebox.showinfo("游戏帮助", help_text)
if __name__ == "__main__":
root = tk.Tk()
game = MilitaryChess(root)
root.mainloop()
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END













暂无评论内容