Python3.8.10每日一练(中国军旗)

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
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容