Python實現猜拳小游戲的多種方式

来源:https://www.cnblogs.com/Hang666/archive/2023/06/11/17472848.html
-Advertisement-
Play Games

## 簡介 猜拳小游戲是一個經典的小游戲項目,也是初學者學習編程的必要練手題目之一。在 Python 中,我們可以使用多種方式來實現一個簡單的猜拳小游戲。 本文將依次介紹六種Python實現猜拳小游戲的方法,包括:使用 `if-else` 條件語句、使用 `random` 模塊、使用字典映射勝負關係 ...


簡介

猜拳小游戲是一個經典的小游戲項目,也是初學者學習編程的必要練手題目之一。在 Python 中,我們可以使用多種方式來實現一個簡單的猜拳小游戲。

本文將依次介紹六種Python實現猜拳小游戲的方法,包括:使用 if-else 條件語句、使用 random 模塊、使用字典映射勝負關係、for迴圈、while迴圈、函數。知識點依次堆加,這些方式各有優缺點,但無論哪種方式,都能夠幫助初學者熟悉 Python 的編碼語法和邏輯思維,更好地理解 Python 的基本數據類型、控制語句等內容;對於專業人士,可以根據具體需求進行選擇。

實現方式一:使用 if-else 條件語句

不能使用while迴圈和for迴圈還有隨機數模塊,因此電腦的出拳方式的生成只能通過計算得到,而該演算法只能模擬隨機數的一部分特性,因此在實際應用中可能存在一定的問題。

註意,這個程式中沒有使用while迴圈或for迴圈等任何迴圈語句,因此只會執行一次猜拳游戲。

# 定義常量
ROCK = 1
PAPER = 2
SCISSORS = 3

# 輸出歡迎信息
print("歡迎來到猜拳游戲!")
print("游戲規則:")
print("1. 石頭勝剪刀")
print("2. 剪刀勝布")
print("3. 布勝石頭")

# 定義得分變數
player_score = 0
computer_score = 0
tie_count = 0

# 讓玩家輸入出拳方式
player_choice = int(input("請輸入您的出拳方式(1:石頭,2:剪刀,3:布):"))

# 判斷玩家的選擇
if player_choice == ROCK:
    print("你出了石頭")
elif player_choice == PAPER:
    print("你出了剪刀")
else:
    print("你出了布")

# 生成電腦的出拳方式
computer_choice = ((player_score + computer_score + tie_count) % 3) + 1

# 輸出電腦的選擇
if computer_choice == ROCK:
    print("電腦出了石頭")
elif computer_choice == PAPER:
    print("電腦出了剪刀")
else:
    print("電腦出了布")

# 判斷輸贏並輸出結果
if player_choice == ROCK:
    if computer_choice == ROCK:
        print("平局")
        tie_count += 1
    elif computer_choice == PAPER:
        print("電腦獲勝")
        computer_score += 1
    else:
        print("你獲勝")
        player_score += 1
elif player_choice == PAPER:
    if computer_choice == ROCK:
        print("你獲勝")
        player_score += 1
    elif computer_choice == PAPER:
        print("平局")
        tie_count += 1
    else:
        print("電腦獲勝")
        computer_score += 1
else:
    if computer_choice == ROCK:
        print("電腦獲勝")
        computer_score += 1
    elif computer_choice == PAPER:
        print("你獲勝")
        player_score += 1
    else:
        print("平局")
        tie_count += 1

# 輸出得分情況
print(f"您的得分:{player_score},電腦的得分:{computer_score},平局次數:{tie_count}")

實現方式二:使用 random 模塊

在使用if語句的基礎上通過引入 Python 的 random 模塊,實現電腦隨機產生手勢的功能。

註意,這個程式中沒有使用while迴圈或for迴圈等任何迴圈語句,因此只會執行一次猜拳游戲。

# 使用 random 模塊實現猜拳小游戲

import random

# 按照石頭剪刀布的勝負規則判斷輸贏
def who_win(user_input, computer_input):
    win_list = [["石頭","剪刀"], ["剪刀","布"], ["布","石頭"]]
    if user_input == computer_input:
        return 0
    elif [user_input,computer_input] in win_list:
        return 1
    else:
        return -1

while True:
    # 玩家輸入手勢
    user_choice = input("請選擇(石頭/剪刀/布):")

    # 隨機生成電腦的手勢
    computer_choice = random.choice(["石頭", "剪刀", "布"])
    print("電腦選擇:", computer_choice)

    # 判斷勝負
    result = who_win(user_choice, computer_choice)

    if result == 0:
        print("平局,再來一局!")
    elif result == 1:
        print("你贏了!")
    else:
        print("你輸了!")

    # 是否再來一局
    play_again = input("是否再來一局?(y/n)")
    if play_again.lower() != "y":
        break

實現方式三:使用字典映射勝負關係

使用if語句與隨機數模塊和一個字典來映射石頭剪刀布的勝負規則,並根據用戶和電腦輸入的選項對應的鍵值找到其勝出的選項

# 使用字典映射實現猜拳小游戲

import random

# 定義一個字典,表示石頭剪刀布的勝負關係
dict = {"石頭": "剪刀", "剪刀": "布", "布": "石頭"}

while True:
    # 玩家輸入手勢
    user_choice = input("請選擇(石頭/剪刀/布):")

    # 隨機生成電腦的手勢
    computer_choice = random.choice(["石頭", "剪刀", "布"])
    print("電腦選擇:", computer_choice)

    # 判斷勝負
    if dict[user_choice] == computer_choice:
        print("你贏了!")
    elif user_choice == computer_choice:
        print("平局!")
    else:
        print("你輸了!")

    # 是否再來一局
    play_again = input("是否再來一局?(y/n)")
    if play_again.lower() != "y":
        break

實現方式四:for迴圈

這種實現方式使用if語句、隨機數模塊和一個字典來映射石頭剪刀布的勝負規則,並使用for迴圈來實現猜拳小游戲

import random  
  
# 定義石頭剪刀布的勝負規則  
rules = {  
    "rock": {  
        "scissors": "你贏了!",  
        "paper": "你輸了!"  
    },  
    "paper": {  
        "rock": "你贏了!",  
        "scissors": "你輸了!"  
    },  
    "scissors": {  
        "paper": "你贏了!",  
        "rock": "你輸了!"  
    }  
}  

# 迴圈玩5局游戲  
for i in range(5):  
    # 生成隨機選擇  
    player_choice = random.choice(["rock", "paper", "scissors"])  
    computer_choice = random.choice(["rock", "paper", "scissors"])  
    print("你的選擇:{}".format(player_choice))  # 輸出玩家選擇  
    print("電腦的選擇:{}".format(computer_choice))  # 輸出電腦選擇  
  
    # 判斷勝負關係並輸出結果  
    if player_choice == computer_choice:  
        print("平局!")  # 如果玩家和電腦選擇一樣,則平局  
    elif rules[player_choice][computer_choice] == "你贏了!":  
        print(rules[player_choice][computer_choice])  # 如果玩家選擇戰勝電腦選擇,則輸出玩家勝利信息  
    else:  
        print(rules[computer_choice][player_choice])  # 如果電腦選擇戰勝玩家選擇,則輸出電腦勝利信息 

實現方式五:while迴圈

在原有基礎上進行修改,將for迴圈替換為while迴圈;

  1. 增加了用戶交互環節,讓用戶可以選擇自己出拳或者輸入r隨機出拳的功能;
  2. 記錄了游戲結果統計變數(比如用戶勝利場數、電腦勝利場數和回合數),併在游戲結束時列印比分結果;
  3. 在滿足三局兩勝的條件時結束游戲,並詢問用戶是否再次開啟游戲;
import random

# 定義一個字典,用於映射石頭剪刀布的勝負規則
rps_dict = {'石頭': '剪刀', '剪刀': '布', '布': '石頭'}

# 初始化用戶選擇和電腦選擇
user_choice = None
computer_choice = None

# 初始化游戲結果統計變數
user_win_count = 0
computer_win_count = 0
round_count = 0

# 使用while迴圈實現猜拳小游戲
while True:
    # 列印提示信息
    print("歡迎來到猜拳游戲!")
    print("請輸入石頭、剪刀或布(輸入r表示隨機選擇):")

    # 獲取用戶輸入
    user_input = input().strip().lower()

    # 如果用戶輸入為r,則隨機選擇石頭、剪刀或布
    if user_input == 'r':
        computer_choice = random.choice(list(rps_dict.values()))

    # 如果用戶輸入為有效的選項,則將其轉換為對應的值並賦值給user_choice和computer_choice
    elif user_input in list(rps_dict.keys()):
        user_choice = user_input
        computer_choice = rps_dict[user_input]

    # 如果用戶輸入無效,則提示錯誤信息並繼續迴圈
    else:
        print("輸入無效,請重新輸入!")
        continue

    # 判斷勝負並輸出結果
    if user_choice == computer_choice:
        print("平局!")
    elif (user_choice == '石頭' and computer_choice == '剪刀') or \
         (user_choice == '剪刀' and computer_choice == '布') or \
         (user_choice == '布' and computer_choice == '石頭'):
        print("恭喜你,你贏了!")
        user_win_count += 1
    else:
        print("很遺憾,你輸了。")
        computer_win_count += 1

    # 列印本局游戲的結果
    print(f"你出了{user_choice},電腦出了{computer_choice}")
    print(f"當前比分:你 {user_win_count} - {computer_win_count} 電腦\n")

    # 增加回合數並判斷是否達到三局兩勝的條件
    round_count += 1
    if user_win_count == 2:
        print("你已經獲得三局兩勝了,你贏了!")
        break
    elif computer_win_count == 2:
        print("很遺憾,電腦獲得了三局兩勝,你輸了!")
        break

    # 根據用戶的選擇決定是否繼續游戲
    replay = input("是否再玩一局?(y/n)").strip().lower()
    if replay != 'y':
        break

# 詢問用戶是否再次開啟游戲
play_again = input("是否再次開啟游戲?(y/n)").strip().lower()
if play_again == 'y':
    exec(open(__file__).read())
else:
    print("游戲結束!")

實現方式六:函數

對while迴圈的代碼進行重構使用函數進行優化

import random
from time import sleep

# 定義一個字典,用於映射石頭剪刀布的勝負規則
rps_dict = {'石頭': {'name': '石頭', 'defeat': '布'},
            '剪刀': {'name': '剪刀', 'defeat': '石頭'},
            '布': {'name': '布', 'defeat': '剪刀'}}

# 清屏函數,用於在每次輸出前清空屏幕
def clear_screen():
    print('\033c', end='')

# 美化輸出函數,用於列印美觀的輸出界面
def print_beautiful(message):
    print('='*50)
    print(f"{message:^50}")
    print('='*50)

# 獲取用戶輸入函數,用於獲取用戶選擇
def get_user_choice():
    while True:
        user_input = input("請選擇 石頭、剪刀、布:")
        if user_input not in rps_dict:
            print_beautiful("選擇無效,請重新選擇")
        else:
            break
    return rps_dict[user_input]

# 電腦隨機選擇函數
def get_computer_choice():
    return random.choice(list(rps_dict.values()))

# 判斷勝負函數
def judge(user_choice, computer_choice):
    if user_choice == computer_choice:
        result = "平局!"
        winner = None
    elif user_choice['defeat'] == computer_choice['name']:
        result = "很遺憾,你輸了。"
        winner = 'computer'
    else:
        result = "恭喜你,你贏了!"
        winner = 'user'
    return result, winner

# 列印結果函數
def print_result(result, user_choice, computer_choice):
    print_beautiful(result)
    sleep(1)
    print(f"你出了【{user_choice['name']}】,電腦出了【{computer_choice['name']}】")

# 根據勝負結果更新勝利次數函數
def update_win_count(winner, win_count):
    if winner == 'user':
        win_count['user'] += 1
    elif winner == 'computer':
        win_count['computer'] += 1

# 列印當前比分函數
def print_score(win_count):
    print(f"當前比分:你 {win_count['user']} - {win_count['computer']} 電腦\n")

# 判斷是否達成勝利條件函數
def check_victory(win_count):
    if win_count['user'] == 2:
        print_beautiful("恭喜你,你已經獲得三局兩勝了,你贏了!")
        return True
    elif win_count['computer'] == 2:
        print_beautiful("很遺憾,電腦獲得了三局兩勝,你輸了!")
        return True
    else:
        return False

# 再玩一局函數
def ask_replay():
    while True:
        replay = input("是否再玩一局?(y/n)").strip().lower()
        if replay not in ['y', 'n']:
            print_beautiful("輸入無效,請重新輸入")
        else:
            break
    return replay == 'y'

# 游戲結束函數
def game_over():
    print_beautiful("游戲結束!")
    sleep(2)

# 主函數,實現游戲邏輯
def main():
    clear_screen()
    print_beautiful("歡迎來到猜拳游戲!")
    win_count = {'user': 0, 'computer': 0}

    while True:
        user_choice = get_user_choice()
        computer_choice = get_computer_choice()

        result, winner = judge(user_choice, computer_choice)
        print_result(result, user_choice, computer_choice)
        update_win_count(winner, win_count)
        print_score(win_count)

        if check_victory(win_count):
            if not ask_replay():
                break
            else:
                win_count = {'user': 0, 'computer': 0}
                clear_screen()
            
    game_over()

if __name__ == '__main__':
    main()


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [系列文章目錄和關於我](https://www.cnblogs.com/cuzzz/p/16609728.html) ## 零丶背景 最近有很多想學的,像netty的使用、原理源碼,但是苦於自己對於操作系統和nio瞭解不多,有點無從下手,遂學習之。 ## 一丶網路io的過程 ![image-202 ...
  • 如果某個派生自 QObject 的類重寫 eventFilter 方法,那它就成了事件過濾器(Event Filter)。該方法的聲明如下: virtual bool eventFilter(QObject *watched, QEvent *event); watched 參數是監聽事件的對象,即 ...
  • # Go 連接 MySQL之 MySQL 預處理 ## 一、ChatGPT 關於 MySQL 預處理 的回答 ### 問:什麼是MySQL 的預處理 具體執行過程時什麼 #### ChatGPT 答: MySQL的預處理是一種在執行SQL語句之前,先進行編譯和優化的機制。它將SQL語句分成兩個階段: ...
  • ## UDP 簡介 UDP(User Datagram Protocol,用戶數據報協議)是傳輸層的另一種協議,比 TCP 具有更快的傳輸速度,但是不可靠。UDP 發送的數據單元被稱為 UDP 數據報,當網路傳輸 UDP 數據報時,無法保證數據報一定到達目的地,也無法保證各個數據報按發送的順序到達目 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • title: "Go 語言連接資料庫實現增刪改查" date: 2023-06-10T18:55:16+08:00 draft: true tags: ["Go"] categories: ["Go"] # Go 連接 MySQL實現增刪改查 ## 一、初始化連接 ### 創建項目 ![](http ...
  • 一、Maven常用命令及其作用 Maven的生命周期包括:clean、validate、compile、test、package、verify、install、site、deploy,其中需要註意的是:執行後面的命令時,前面的命令自動得到執行,(其中,也可以跳過其中的步驟,如:test,在mvn i ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...