27142556 发表于 前天 18:12

本主题需向作者支付 5 鱼币 才能浏览 购买主题

FishC 发表于 前天 18:13

石头剪刀布 游戏
今天分享一个自己做的游戏:石头剪刀布
感兴趣可以看小甲鱼的《零基础入门学习Python(最新版)》
会用到分支和循环的语法{:5_109:}

import random
print("石头剪刀布游戏,现在开始!\
       \n游戏共五场,最后根据得分定胜负!")
scorea = 0
scoreb = 0
i = 0

for m in range(5):
    b = input("请输入石头,剪刀或布:")
    a = random.randint(1,3)
    if b == "石头":
      b = 1
    elif b == "剪刀":
      b = 2
    elif b == "布":
      b = 3
    else:
      print("非法输入!请输入石头,剪刀或布!")
      print("游戏结束,不玩啦^_^")
      i = 1
    if i == 1:
      break
    else:
      if b == 1:
            if a == 1:
                print("我出的也是石头^_^,平局!")
            elif a == 2:
                print("我出的是剪刀,你赢了!")
                scoreb += 1
            elif a == 3:
                print("我出的是布,我赢了!")
                scorea += 1
      elif b == 2:
            if a == 1:
                print("我出的是石头,我赢了!")
                scorea += 1
            elif a == 2:
                print("我出的也是剪刀^_^,平局!")
            elif a == 3:
                print("我出的是布,你赢了!")
                scoreb += 1
      elif b == 3:
            if a == 1:
                print("我出的是石头,你赢了!")
                scoreb += 1
            elif a == 2:
                print("我出的是剪刀,我赢了!")
                scorea += 1
            elif a == 3:
                print("我出的也是布^_^,平局!")
      print("现在分数:我",scorea,":",scoreb,"你")

if i != 1:
    if scorea > scoreb:
      print("这场游戏我赢啦^_^")
    elif scorea < scoreb:
      print("这场游戏你赢啦^_^")
    else:
      print("这场游戏我们平局!")
    print("游戏结束,不玩啦^_^")


你好!感谢分享你的石头剪刀布游戏代码。这是一个很好的练习项目,确实涵盖了分支和循环的语法,正如小甲鱼教程中所讲。你的代码逻辑清晰,能正确运行,但有一些地方可以优化,让代码更简洁、易读。

代码优点:
1. 使用了 random.randint 来生成随机选择,简单有效。
2. 通过 for 循环控制游戏轮数,符合要求。
3. 有基本的输入验证,能处理非法输入。

改进建议:
1. 输入验证:当用户输入非法时,当前代码会直接结束游戏。可以改为循环提示用户重新输入,直到输入有效。
2. 减少重复代码:比较胜负的逻辑可以用字典或列表来映射,避免多个 if-elif 嵌套。
3. 变量命名:使用更具描述性的变量名,比如 player_score 和 computer_score,提高可读性。
4. 游戏逻辑优化:将选择映射和胜负判断封装成简单结构。

改进代码示例:
以下是一个优化后的版本,使用字典来简化逻辑,并改进输入验证。


import random

print("石头剪刀布游戏,现在开始!")
print("游戏共五场,最后根据得分定胜负!")

# 使用字典映射选择
choices = {"石头": 1, "剪刀": 2, "布": 3}
results = {
    (1, 1): "平局",
    (1, 2): "你赢了",
    (1, 3): "我赢了",
    (2, 1): "我赢了",
    (2, 2): "平局",
    (2, 3): "你赢了",
    (3, 1): "你赢了",
    (3, 2): "我赢了",
    (3, 3): "平局"
}

player_score = 0
computer_score = 0

for round_num in range(5):
    while True:
      player_input = input("请输入石头、剪刀或布:")
      if player_input in choices:
            player_choice = choices
            break
      else:
            print("非法输入!请重新输入。")

    computer_choice = random.randint(1, 3)

    # 判断胜负
    result = results[(player_choice, computer_choice)]
    print(f"我出的是{list(choices.keys())},{result}!")

    # 更新分数
    if result == "我赢了":
      computer_score += 1
    elif result == "你赢了":
      player_score += 1

    print(f"现在分数: 我 {computer_score} : {player_score} 你")

# 最终结果
if computer_score > player_score:
    print("这场游戏我赢啦^_^")
elif computer_score < player_score:
    print("这场游戏你赢啦^_^")
else:
    print("这场游戏我们平局!")
print("游戏结束,不玩啦^_^")


主要改动:
- 使用 choices 字典将输入映射到数字,便于比较。
- 使用 results 字典存储所有可能的胜负结果,避免冗长的 if-elif 链。
- 输入验证使用 while 循环,直到输入有效为止。
- 变量名更清晰,分数更新更直接。

希望这个改进版本能帮助你写出更优雅的代码!继续加油学习Python,如果有问题,随时来问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

pyzyd 发表于 前天 18:32

{:5_106:}
加油

27142556 发表于 前天 18:35

FishC 发表于 2025-12-14 18:13
你好!感谢分享你的石头剪刀布游戏代码。这是一个很好的练习项目,确实涵盖了分支和循环的语法,正如小 ...

可以给每行代码后面都加一个注释吗

FishC 发表于 前天 18:36

27142556 发表于 2025-12-14 18:35
FishC 发表于 2025-12-14 18:13
你好!感谢分享你的 ...

import random# 导入random模块,用于生成随机数

print("石头剪刀布游戏,现在开始!")# 打印游戏开始提示
print("游戏共五场,最后根据得分定胜负!")# 打印游戏规则

# 创建一个字典,将用户输入的字符串映射为数字,方便比较
choices = {"石头": 1, "剪刀": 2, "布": 3}

# 创建一个字典,键是(玩家选择, 电脑选择)的元组,值是对应的胜负结果
results = {
    (1, 1): "平局",
    (1, 2): "你赢了",
    (1, 3): "我赢了",
    (2, 1): "我赢了",
    (2, 2): "平局",
    (2, 3): "你赢了",
    (3, 1): "你赢了",
    (3, 2): "我赢了",
    (3, 3): "平局"
}

player_score = 0# 初始化玩家得分
computer_score = 0# 初始化电脑得分

# 进行5轮游戏
for round_num in range(5):
    # 使用while循环确保用户输入合法
    while True:
      player_input = input("请输入石头、剪刀或布:")# 获取用户输入
      if player_input in choices:# 检查输入是否在字典的键中
            player_choice = choices# 将输入转换为对应的数字
            break# 输入合法,跳出循环
      else:
            print("非法输入!请重新输入。")# 提示用户重新输入

    computer_choice = random.randint(1, 3)# 电脑随机生成1、2或3

    # 根据玩家和电脑的选择,从results字典中获取结果字符串
    result = results[(player_choice, computer_choice)]

    # 将电脑的数字选择转换回文字,以便输出
    # 遍历字典找到值为computer_choice的键
    for key, value in choices.items():
      if value == computer_choice:
            computer_choice_text = key# 获取对应的文字
            break

    print(f"我出的是{computer_choice_text},{result}!")# 输出电脑选择和结果

    # 根据结果更新分数
    if result == "我赢了":
      computer_score += 1# 电脑得分加1
    elif result == "你赢了":
      player_score += 1# 玩家得分加1
    # 平局不加分

    print(f"现在分数: 我 {computer_score} : {player_score} 你")# 打印当前分数

# 游戏结束,判断最终胜负
if computer_score > player_score:
    print("这场游戏我赢啦^_^")
elif computer_score < player_score:
    print("这场游戏你赢啦^_^")
else:
    print("这场游戏我们平局!")

print("游戏结束,不玩啦^_^")# 打印结束语

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

萧随风 发表于 前天 20:14

加油

ydwb 发表于 前天 22:17

import tkinter as tk
from tkinter import font
import random

class RockPaperScissorsGame:
    def __init__(self, master):
      self.master = master
      master.title("石头剪刀布")
      master.geometry("400x300+500+100")
      master.configure(bg="#F0F0F0")

      # 初始化得分
      self.player_score = 0
      self.computer_score = 0

      # 创建自定义字体
      self.title_font = font.Font(family="Arial", size=16, weight="bold")
      self.result_font = font.Font(family="Arial", size=14)
      self.score_font = font.Font(family="Arial", size=12)

      # 创建界面元素
      self.create_widgets()

    def create_widgets(self):
      # 电脑选择显示
      self.computer_choice_label = tk.Label(
            self.master,
            text="电脑出拳:等待中...",
            font=self.title_font,
            bg="#F0F0F0"
      )
      self.computer_choice_label.pack(pady=10)

      # 结果显示
      self.result_label = tk.Label(
            self.master,
            text="点击下方按钮开始游戏",
            font=self.result_font,
            bg="#F0F0F0",
            fg="#333333"
      )
      self.result_label.pack(pady=15)

      # 玩家选择按钮
      button_frame = tk.Frame(self.master, bg="#F0F0F0")
      button_frame.pack(pady=10)

      choices = ["石头", "剪刀", "布"]
      colors = ["#FF6666", "#66CC66", "#6666FF"]
      for choice, color in zip(choices, colors):
            btn = tk.Button(
                button_frame,
                text=choice,
                font=self.title_font,
                bg=color,
                width=8,
                command=lambda c=choice: self.play_round(c)
            )
            btn.pack(side=tk.LEFT, padx=5)

      # 比分显示
      self.score_label = tk.Label(
            self.master,
            text=f"玩家 {self.player_score} : {self.computer_score} 电脑",
            font=self.score_font,
            bg="#F0F0F0",
            fg="#444444"
      )
      self.score_label.pack(pady=20)

      # 重置按钮
      reset_btn = tk.Button(
            self.master,
            text="重置比分",
            font=self.score_font,
            command=self.reset_scores
      )
      reset_btn.pack()

    def play_round(self, player_choice):
      # 电脑随机选择
      computer_choice = random.choice(["石头", "剪刀", "布"])
      self.computer_choice_label.config(text=f"电脑出拳:{computer_choice}")

      # 判断胜负
      result = self.get_result(player_choice, computer_choice)

      # 更新比分和显示
      if "赢" in result:
            self.player_score += 1
            color = "green"
      elif "输" in result:
            self.computer_score += 1
            color = "red"
      else:
            color = "blue"

      self.result_label.config(text=result, fg=color)
      self.score_label.config(text=f"玩家 {self.player_score} : {self.computer_score} 电脑")

    def get_result(self, player, computer):
      if player == computer:
            return "平局!"
      winning_combinations = {
            "石头": "剪刀",
            "剪刀": "布",
            "布": "石头"
      }
      if winning_combinations == computer:
            return "你赢了!(*^▽^*)"
      return "你输了!(>﹏<)"

    def reset_scores(self):
      self.player_score = 0
      self.computer_score = 0
      self.score_label.config(text=f"玩家 {self.player_score} : {self.computer_score} 电脑")
      self.computer_choice_label.config(text="电脑出拳:等待中...")
      self.result_label.config(text="比分已重置", fg="#333333")


if __name__ == "__main__":
    root = tk.Tk()
    game = RockPaperScissorsGame(root)
    root.mainloop()

hbzwb001 发表于 前天 22:40

加油

羽风亦雨 发表于 昨天 09:15

很棒了,加油加油{:10_256:}

415965426@com 发表于 昨天 09:20

学习了

yu55800 发表于 昨天 09:48

加油

735468682 发表于 昨天 09:58

注释真香

每日公基 发表于 昨天 10:14

加油

gotdot 发表于 昨天 10:47

学习中
页: [1]
查看完整版本: 石头剪刀布 游戏 回帖奖励10鱼币