• 【Python】取火柴小游戏(巴什博弈)


    火柴游戏:Python编程示例

    当我们想要玩一个简单而有趣的游戏,同时又想锻炼自己的编程技能时,一个经典的选择就是火柴游戏。这个游戏的规则很简单:有一堆火柴,每次可以拿走1到6根,两名玩家轮流取火柴,拿到最后一根的玩家获胜。在本篇博客中,我们将使用Python来模拟和玩这个火柴游戏。

    游戏规则

    游戏规则非常简单:

    1. 有一堆火柴,初始数量可以是任意值。
    2. 两名玩家轮流行动,一位是人类玩家,另一位是电脑。
    3. 每位玩家可以选择拿走1到6根火柴,但不能拿走超过剩余火柴数量的火柴。
    4. 游戏继续,直到只剩下一根火柴。
    5. 拿到最后一根火柴的玩家获胜。

    Python实现

    要实现这个游戏,我们可以使用Python编程语言。首先,我们需要初始化游戏的初始火柴数量,然后通过编写代码来模拟玩家和电脑的行动。以下是游戏的Python代码示例:

    import random
    
    total = random.randint(60, 100)
    print('总共 ', total, ' 根火柴')
    
    winner = 0
    
    while winner == 0:
        player = int(input('请输入你要取的火柴数:'))
        while player < 0 or player > 6 or total - player < 0:
            player = int(input('请重新输入你要取的火柴数:'))
        total -= player
        print('玩家选了 ', player , ' 根火柴')
        print('现在还剩 ', total , ' 根火柴')
        if total == 0:
            winner = 1
            break
    
        npc = total % 7 # 取的火柴数需要把对方变成7的倍数才对自己有利
        if npc == 0:
            npc = random.randint(1, 6)  # npc 无法必赢局,1-6随便选一个
        total -= npc
        print('npc 选了 ', npc , ' 根火柴')
        print('现在还剩 ', total , ' 根火柴')
        if total == 0:
            winner = 2
            break
    
    if winner == 1:
        print("你赢了")
    else:
        print("你输了")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Python实现(GUI版)

    可采用tkinter实现GUI版:

    import random
    import tkinter as tk
    from tkinter import messagebox
    
    class BashGame:
        def __init__(self, root: tk.Tk):
            self.root = root
            self.root.title("取火柴")
            self.player = 0
            self.npc = 0
            self.piles = total = random.randint(60, 100)  # 初始化堆的物品数量
            self.create_gui()
    
        def create_gui(self):
            self.label0 = tk.Label(self.root, text=f"本轮你拿走的火柴数量: {self.player}")
            self.label0.pack(pady=10)
            self.label1 = tk.Label(self.root, text=f"本轮电脑拿走的火柴数量: {self.npc}")
            self.label1.pack(pady=10)
            self.label2 = tk.Label(self.root, text=f"当前火柴数量: {self.piles}")
            self.label2.pack(pady=10)
            self.entry = tk.Entry(self.root, width=40)
            self.entry.pack()
            self.button = tk.Button(self.root, text="拿走物品", command=self.take_items)
            self.button.pack()
            self.root.mainloop()
    
        def take_items(self):
            try:
                num_to_take = int(self.entry.get())
                if num_to_take < 1 or num_to_take > 6:
                    messagebox.showerror("错误", "只能拿走1到6根火柴")
                    return
                if num_to_take > self.piles:
                    messagebox.showerror("错误", "没有足够的物品可供拿走")
                    return
                self.player = num_to_take
                self.piles -= num_to_take
                self.label0.config(text=f"本轮你拿走的火柴数量: {self.player}")
                self.label2.config(text=f"当前物品数量: {self.piles}")
                if self.piles == 0:
                    messagebox.showinfo("游戏结束", "你赢了!")
                else:
                    # 让电脑随机拿走物品
                    computer_choice = self.piles % 7
                    if computer_choice == 0:
                        computer_choice = random.randint(1, 6)
                    self.npc = computer_choice
                    self.piles -= computer_choice
                    self.label1.config(text=f"本轮电脑拿走的火柴数量: {self.npc}")
                    self.label2.config(text=f"当前物品数量: {self.piles}")
                    if self.piles == 0:
                        messagebox.showinfo("游戏结束", "电脑赢了!")
            except ValueError:
                messagebox.showerror("错误", "请输入一个有效的数字")
    
    if __name__ == "__main__":
        root = tk.Tk()
        game = BashGame(root)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    App逆向入门
    基于matlab的三维点云数据ICP拼接算法实现
    C++面向对象程序设计(第2版)第二章(类和对象的特性)知识点总结
    SAP 电商云 Spartacus UI Store 相关的设计明细
    力扣 -- 132. 分割回文串 II
    Linux —— 线程控制
    Linux Cgroup v1(中文翻译)(4):Block IO Controller
    什么是代币销毁?如何从流通中移除加密货币?
    maven基础
    如何提高社交产品的活跃度?
  • 原文地址:https://blog.csdn.net/u011956367/article/details/133987374