Python 的 while 迴圈提供了一種在特定條件下重複執行程式碼塊的機制。迴圈會持續執行,直到條件不再成立。For 迴圈則適用於迭代序列或其他可迭代物件,依序處理每個元素。Break 和 continue 陳述式可以更精細地控制迴圈流程,例如提前結束迴圈或跳過特定迭代。理解 Truthy 和 Falsey 值的概念,有助於更靈活地運用迴圈條件判斷。結合 range() 函式,可以更方便地控制迴圈迭代次數。這些迴圈控制結構是程式設計的基礎,掌握它們對於建構複雜的程式邏輯至關重要。

while 迴圈的運作原理

while 迴圈是一種控制結構,允許程式碼在某個條件成立的情況下重複執行。下面是一個簡單的 while 迴圈範例:

spam = 0
while spam < 5:
    print('Hello, world.')
    spam = spam + 1

這段程式碼會輸出 “Hello, world.” 五次。讓我們來分析一下這個過程:

  1. 初始化變數 spam 為 0。
  2. 檢查條件 spam < 5,如果成立則進入迴圈。
  3. 執行迴圈內的程式碼,印出 “Hello, world."。
  4. 更新變數 spam 的值,將其增加 1。
  5. 回到步驟 2,重新檢查條件 spam < 5
  6. 如果條件仍然成立,則重複步驟 3-5。
  7. 如果條件不成立,則離開迴圈。

while 迴圈的流程圖

下面是 while 迴圈的流程圖:

@startuml
:初始化變數; --> :檢查條件;
:B; --> [True] :True;
:C; --> :更新變數;
:D; --> :B;
:B; --> [False] :False;
@enduml

這個流程圖顯示了 while 迴圈的運作原理。當條件成立時,迴圈內的程式碼會被執行,然後更新變數的值。當條件不成立時,迴圈會離開。

一個煩人的 while 迴圈

下面是一個簡單的程式範例,示範了一個煩人的 while 迴圈:

name = ''
while name!= 'your name':
    print('Please type your name.')
    name = input('>')

print('Thank you!')

這段程式碼會不斷地要求使用者輸入名字,直到使用者輸入 “your name”。讓我們來分析一下這個過程:

  1. 初始化變數 name 為空字串。
  2. 檢查條件 name!= 'your name',如果成立則進入迴圈。
  3. 執行迴圈內的程式碼,印出 “Please type your name."。
  4. 讀取使用者的輸入,並將其指定給 name 變數。
  5. 回到步驟 2,重新檢查條件 name!= 'your name'
  6. 如果條件仍然成立,則重複步驟 3-5。
  7. 如果條件不成立,則離開迴圈,並印出 “Thank you!"。

圖表翻譯:

下面是這個程式的流程圖:

@startuml
:初始化變數; --> :檢查條件;
:B; --> [True] :True;
:C; --> :讀取使用者輸入;
:D; --> :B;
:B; --> [False] :False;
@enduml

這個流程圖顯示了 while 迴圈的運作原理。當條件成立時,迴圈內的程式碼會被執行,然後讀取使用者的輸入。當條件不成立時,迴圈會離開,並印出感謝訊息。

使用 break 和 continue 陳述式控制 while 迴圈

在 Python 中,while 迴圈是一種用於重複執行程式碼的控制結構。然而,有時我們需要在迴圈中間終止或跳過某些程式碼的執行。這時,我們可以使用 breakcontinue 陳述式來控制 while 迴圈的流程。

break 陳述式

break 陳述式用於立即終止 while 迴圈的執行。當程式執行到 break 陳述式時,會立即跳出迴圈,繼續執行迴圈後面的程式碼。

以下是一個範例程式,示範如何使用 break 陳述式:

while True:
    print('請輸入你的名字。')
    name = input('> ')
    if name == '你的名字':
        break
    print('謝謝!')

在這個範例中,while 迴圈的條件是 True,所以迴圈會一直執行,直到遇到 break 陳述式。如果使用者輸入的名字是 '你的名字',則會執行 break 陳述式,立即終止迴圈,然後執行 print('謝謝!')

continue 陳述式

continue 陳述式用於跳過當前迴圈的剩餘程式碼,直接跳到下一次迴圈的開始。當程式執行到 continue 陳述式時,會立即跳過當前迴圈的剩餘程式碼,繼續執行下一次迴圈。

以下是一個範例程式,示範如何使用 continue 陳述式:

while True:
    print('請輸入你的名字和密碼。')
    name = input('> ')
    password = input('> ')
    if name!= '你的名字' or password!= '你的密碼':
        continue
    print('登入成功!')

在這個範例中,如果使用者輸入的名字或密碼不正確,則會執行 continue 陳述式,跳過當前迴圈的剩餘程式碼,直接跳到下一次迴圈的開始。

內容解密:
  • break 陳述式可以用於立即終止 while 迴圈。
  • continue 陳述式可以用於跳過當前迴圈的剩餘程式碼。
  • 這兩個陳述式可以幫助我們更好地控制程式的流程。

圖表翻譯:

@startuml
:開始; --> :輸入名字和密碼;
:B; --> :檢查名字和密碼;
:C; --> [正確] :正確;
:C; --> [不正確] :不正確;
:E; --> :B;
@enduml

在這個圖表中,我們可以看到 while 迴圈的流程。如果使用者輸入的名字和密碼正確,則會登入成功。如果不正確,則會繼續迴圈,直到使用者輸入正確的名字和密碼。

使用 Continue 和 Break 陳述式控制迴圈

在 Python 中,continuebreak 是兩個重要的陳述式,分別用於控制迴圈的執行。下面是一個範例程式,展示瞭如何使用這兩個陳述式:

print('誰是你?')

name = input('>')

if name!= 'Joe':
    continue

print('Hello, Joe. 什麼是密碼?(它是一種魚。)')

password = input('>')

if password == 'swordfish':
    break

print('存取授權。')

在這個範例中,如果使用者輸入的名字不是 Joe,程式會執行 continue 陳述式,跳回迴圈的開始處。當使用者輸入正確的密碼(swordfish)時,程式會執行 break 陳述式,跳出迴圈並印出「存取授權」。

Truthy 和 Falsey 值

在 Python 中,一些值可以被視為 True 或 False,即使它們不是布林值。例如,0、0.0 和空字串 ('') 被視為 False,而其他值被視為 True。下面是一個範例程式,展示瞭如何使用這些值:

name = ''
while not name:
    print('請輸入你的名字:')
    name = input('>')

num_of_guests = 5
if num_of_guests:
    print('你有嘉賓!')

print(bool(''))  # False
print(bool(0))   # False
print(bool(5))   # True

在這個範例中,如果 name 是空字串,迴圈會繼續執行,直到使用者輸入一個非空字串。如果 num_of_guests 不是 0,程式會印出「你有嘉賓!」。

使用 Bool() 函式

如果你想知道一個值是否為 Truthy 或 Falsey,可以使用 bool() 函式。下面是一個範例:

print(bool(''))  # False
print(bool(0))   # False
print(bool(5))   # True

這個函式會將輸入的值轉換為布林值,True 或 False。

使用 for 迴圈和 range() 函式

當您想要執行一段程式碼的特定次數時,可以使用 for 迴圈和 range() 函式。for 迴圈的語法如下:

for 變數名稱 in range(次數):
    # 要執行的程式碼

其中,變數名稱 是一個暫時的變數名稱,range(次數) 是一個函式,會產生一個從 0 到 次數-1 的整數序列。

range() 函式

range() 函式是一個內建函式,會產生一個整數序列。它的語法如下:

range(起始值, 結束值, 步長)

其中,起始值 是序列的起始值,結束值 是序列的結束值,步長 是每個整數之間的差值。

for 迴圈範例

以下是使用 for 迴圈和 range() 函式的範例:

for i in range(5):
    print(i)

這個程式碼會輸出:

0
1
2
3
4

因為 range(5) 會產生一個從 0 到 4 的整數序列。

布林值

在 Python 中,布林值(Boolean)是一種特殊的資料型態,代表 true 或 false。布林值可以使用 bool() 函式來轉換。以下是幾個範例:

print(bool(0))  # False
print(bool(42))  # True
print(bool('Hello'))  # True
print(bool(''))  # False

布林值在條件判斷中非常重要,後面會再詳細介紹。

while 迴圈和 for 迴圈的比較

while 迴圈和 for 迴圈都是用來執行一段程式碼的,但它們的差異在於 while 迴圈是根據條件來決定是否繼續執行,而 for 迴圈是根據特定的次數來執行。以下是兩者的比較:

# while 迴圈
i = 0
while i < 5:
    print(i)
    i += 1

# for 迴圈
for i in range(5):
    print(i)

兩個程式碼都會輸出相同的結果,但 while 迴圈需要手動更新變數 i,而 for 迴圈則不需要。

使用for迴圈進行迭代

for迴圈是一種用於迭代的控制結構,允許您重複執行一段程式碼。下面是for迴圈的基本結構:

for 變數 in 可迭代物件:
    # 執行的程式碼

其中,變數是用於儲存每次迭代的值的變數,可迭代物件是可以被迭代的物件,例如列表、字串或範圍。

範圍(range)函式

範圍函式是一種用於生成一系列數字的函式。它的基本結構如下:

range(起始值, 結束值, 步長)

其中,起始值是範圍的起始值,結束值是範圍的結束值,步長是每次遞增的步長。

for迴圈範例

下面是一個使用for迴圈和範圍函式的範例:

for i in range(5):
    print(f"On this iteration, i is set to {i}")

這個程式碼會輸出:

On this iteration, i is set to 0
On this iteration, i is set to 1
On this iteration, i is set to 2
On this iteration, i is set to 3
On this iteration, i is set to 4

break和continue陳述式

在for迴圈中,您可以使用break和continue陳述式來控制迭代的流程。break陳述式會終止迭代,而continue陳述式會跳過當前的迭代並繼續下一次迭代。

Carl Friedrich Gauss的故事

有一個故事關於數學家Carl Friedrich Gauss,他曾經被要求計算從0到100的所有數字的總和。他想出了一個巧妙的方法來計算這個總和,但您也可以使用Python程式來計算:

total = 0
for num in range(101):
    total += num
print(total)

這個程式碼會輸出:5050

為什麼是“上到但不包含”?

在程式設計中,範圍通常使用“閉開”格式,即包括起始值但排除結束值。例如,範圍0到10包含數字0到9,而不是0到10。這種格式有很多優點,可以減少錯誤。計算範圍的大小隻需從結束值中減去起始值即可。例如,範圍0到10包含10個數字(0到9)。

圖表翻譯:

@startuml
:開始; --> :for迴圈;
:B; --> :執行程式碼;
:C; --> :是否完成;
:D; --> [是] :是;
:D; --> [否] :否;
@enduml

這個圖表顯示了for迴圈的流程。首先,程式開始執行for迴圈,然後執行程式碼。如果迭代完成,則結束;否則,繼續下一次迭代。

使用range()函式進行迴圈

在Python中,range()函式是一個非常有用的工具,讓我們可以輕鬆地進行迴圈。它可以讓我們指定一個範圍,並且根據這個範圍進行迴圈。

基本使用

range()函式可以接受一個或多個引數。當只傳入一個引數時,它會從0開始,直到但不包括該引數為止。例如:

for i in range(5):
    print(i)

這會輸出:

0
1
2
3
4

指定起始值

如果我們想要從一個特定的數字開始,可以傳入兩個引數。第一個引數是起始值,第二個引數是結束值(不包括)。例如:

for i in range(12, 16):
    print(i)

這會輸出:

12
13
14
15

指定步長

如果我們想要指定步長,可以傳入三個引數。第一個引數是起始值,第二個引數是結束值(不包括),第三個引數是步長。例如:

for i in range(12, 16, 2):
    print(i)

這會輸出:

12
14

使用while迴圈模擬for迴圈

雖然for迴圈更為方便,但我們也可以使用while迴圈來模擬for迴圈的行為。例如:

i = 0
while i < 5:
    print(i)
    i += 1

這會輸出:

0
1
2
3
4

內容解密:

在上面的例子中,我們使用while迴圈來模擬for迴圈的行為。變數i被初始化為0,並且在每次迴圈中增加1,直到i小於5為止。

使用 Python 的 range() 函式進行迴圈

Python 的 range() 函式是一個非常強大的工具,能夠幫助我們建立迴圈。下面是一個範例:

for i in range(0, 10, 2):
    print(i)

這個迴圈會從 0 到 8,間隔 2,印出每個數字。

使用 range() 函式進行倒數

如果你想讓迴圈從大到小進行倒數,可以使用負數作為間隔。例如:

for i in range(5, -1, -1):
    print(i)

這個迴圈會從 5 到 0,間隔 -1,印出每個數字。

匯入模組

Python 有一個豐富的標準函式庫,包含了許多有用的模組。你可以使用 import 陳述式匯入模組。例如:

import random

這樣你就可以使用 random 模組中的函式了。

使用 random 模組

random 模組中有一個很有用的函式叫做 randint(),可以生成一個隨機整數。例如:

import random

for i in range(5):
    print(random.randint(1, 10))

這個迴圈會生成 5 個隨機整數,介於 1 到 10 之間。

結束程式

如果你想在程式執行過程中結束程式,可以使用 sys.exit() 函式。例如:

import sys

print("結束程式")
sys.exit()

這樣程式就會立即結束。

內容解密:

上述程式碼展示瞭如何使用 range() 函式進行迴圈、倒數和匯入模組等。同時,也介紹瞭如何使用 random 模組生成隨機整數和結束程式。

圖表翻譯:

@startuml
:開始; --> :匯入模組;
:B; --> :使用 range() 函式;
:C; --> :使用 random 模組;
:D; --> :結束程式;
:E; --> :結束;
@enduml

這個流程圖展示了程式的執行流程,從匯入模組到結束程式。

猜數遊戲:基礎程式設計概念的實踐

在這個章節中,我們將探討一個簡單的猜數遊戲,該遊戲結合了前面所學的基本程式設計概念。當你執行這個程式時,輸出將類別似於以下內容:

我正在想一個1到20之間的數字。
猜一個數字。

>10
你的猜測太低了。
猜一個數字。

>15
你的猜測太低了。
猜一個數字。

>17
你的猜測太高了。
猜一個數字。

>16
做得好!你只用了4次猜測就猜對了!

現在,讓我們來看看實作這個遊戲的原始碼。請在檔案編輯器中輸入以下程式碼,並將檔案儲存為 guessTheNumber.py

# 這是一個猜數遊戲。

import random

secret_number = random.randint(1, 20)
print('我正在想一個1到20之間的數字。')

# 問玩家猜6次。
for guesses_taken in range(1, 7):
    print('猜一個數字。')
    guess = int(input('>'))

    if guess < secret_number:
        print('你的猜測太低了。')
    elif guess > secret_number:
        print('你的猜測太高了。')
    else:
        print(f'做得好!你只用了{guesses_taken}次猜測就猜對了!')
        break
else:
    print('抱歉,你沒有猜對。正確答案是' + str(secret_number) + '。')

內容解密:

這個程式使用 random.randint(1, 20) 生成一個1到20之間的隨機數字,並將其儲存在 secret_number 變數中。然後,程式使用 for 迴圈讓玩家猜6次。

在每次迭代中,程式會要求玩家猜一個數字,並使用 input() 函式取得玩家的輸入。然後,程式會比較玩家的猜測與 secret_number,並根據比較結果列印預出相應的訊息。如果玩家的猜測與 secret_number 相等,程式會列印預出祝賀訊息並終止迴圈。

如果玩家沒有在6次猜測中猜對,程式會列印預出抱歉訊息,並顯示正確答案。

圖表翻譯:

@startuml
:開始; --> :生成隨機數字;
:B; --> :初始化迴圈;
:C; --> :要求玩家猜數字;
:D; --> :比較玩家猜測與秘密數字;
:E; --> [猜測太低] :猜測太低;
:E; --> [猜測太高] :猜測太高;
:E; --> [猜測正確] :猜測正確;
:F; --> :D;
:G; --> :D;
:H; --> :結束;
@enduml

這個流程圖展示了程式的邏輯流程,從生成隨機數字到要求玩家猜數字,然後比較玩家猜測與秘密數字,最後列印預出相應的訊息或終止迴圈。

猜數遊戲程式剖析

首先,我們來看看這個猜數遊戲的程式碼。這個程式的目的是讓使用者猜一個由程式隨機產生的數字。

程式結構

程式一開始就有一行註解,解釋了這個程式的功能。接下來,程式匯入了 random 模組,以便使用 randint() 函式產生一個隨機數字。

import random
secret_number = random.randint(1, 20)

這裡,secret_number 是一個變數,儲存著由 randint(1, 20) 產生的隨機整數,範圍從 1 到 20。

使用者輸入與比較

使用者被提示輸入一個猜測的數字:

print('Take a guess.')
guess = int(input('>'))

input() 函式用於取得使用者的輸入,並將其轉換為整數儲存在 guess 變數中。

接下來,程式比較使用者的猜測與秘密數字:

if guess < secret_number:
    print('Your guess is too low.')
elif guess > secret_number:
    print('Your guess is too high.')
else:
    # 當猜測正確時的處理
    pass

如果使用者的猜測太低或太高,程式會分別提示「太低」或「太高」。如果猜測正確,則會執行 else 區塊中的程式碼。

迴圈與多次猜測

雖然原始碼中沒有明確展示出來,但這個遊戲其實允許使用者進行多次猜測。通常,這會透過一個 for 迴圈實作,讓使用者有六次機會來猜對秘密數字。

for _ in range(6):
    # 猜測與比較的程式碼放在這裡

每次迴圈,使用者都會被提示輸入一個新的猜測,並且與秘密數字進行比較。如果使用者在六次機會內猜對了,程式會告知使用者並結束;否則,程式會揭露秘密數字。

if guess == secret_number:
    print('Good job! You got it in ' + str(guesses) + ' guesses.')
else:
    print('Nope. The number was ' + str(secret_number))

猜數字遊戲與剪刀石頭布

猜數字遊戲

在這個遊戲中,玩家需要猜一個介於1到20之間的秘密數字。系統會根據玩家的猜測給出提示,告訴玩家猜的數字是太高還是太低。

secret_number = 15  # 秘密數字
for guesses_taken in range(1, 7):  # 玩家有6次猜的機會
    print('Take a guess.')  # 提示玩家猜數字
    guess = int(input('>'))  # 讀取玩家的猜測
    
    if guess < secret_number:  # 如果猜的數字太低
        print('Your guess is too low.')  # 給出提示
    elif guess > secret_number:  # 如果猜的數字太高
        print('Your guess is too high.')  # 給出提示
    else:  # 如果猜對了
        print('Good job! You got it in ' + str(guesses_taken) + ' guesses.')  # 恭喜玩家
        break  # 結束遊戲
else:  # 如果玩家用完所有猜測機會還沒猜對
    print('Nope. The number was ' + str(secret_number))  # 告訴玩家正確答案

剪刀石頭布遊戲

接下來,我們來實作一個簡單的剪刀石頭布遊戲。遊戲規則如下:剪刀剪勝布,布包勝石頭,石頭砸勝剪刀。

import random

while True:  # 不斷遊戲直到玩家決定離開
    print('Enter your choice (rock/paper/scissors):')  # 提示玩家輸入選擇
    user_choice = input('> ').lower()  # 讀取玩家的選擇並轉換為小寫
    
    while user_choice not in ['rock', 'paper', 'scissors']:  # 如果玩家的選擇不正確
        print('Invalid input. Please enter rock, paper or scissors.')  # 提示玩家重新輸入
        user_choice = input('> ').lower()
    
    possible_choices = ['rock', 'paper', 'scissors']  # 可能的選擇
    computer_choice = random.choice(possible_choices)  # 電腦隨機選擇
    
    print(f'\nYou chose {user_choice}, computer chose {computer_choice}.\n')  # 顯示玩家和電腦的選擇
    
    if user_choice == computer_choice:  # 如果玩家和電腦選擇相同
        print(f'Both players selected {user_choice}. It\'s a tie!')  # 平局
    elif user_choice == 'rock':  # 如果玩家選擇石頭
        if computer_choice == 'scissors':  # 如果電腦選擇剪刀
            print('Rock smashes scissors! You win!')  # 玩家贏
        else:  # 如果電腦選擇布
            print('Paper covers rock! You lose.')  # 玩家輸
    elif user_choice == 'paper':  # 如果玩家選擇布
        if computer_choice == 'rock':  # 如果電腦選擇石頭
            print('Paper covers rock! You win!')  # 玩家贏
        else:  # 如果電腦選擇剪刀
            print('Scissors cuts paper! You lose.')  # 玩家輸
    elif user_choice == 'scissors':  # 如果玩家選擇剪刀
        if computer_choice == 'paper':  # 如果電腦選擇布
            print('Scissors cuts paper! You win!')  # 玩家贏
        else:  # 如果電腦選擇石頭
            print('Rock smashes scissors! You lose.')  # 玩家輸
    
    play_again = input('Play again? (yes/no): ')  # 問玩家是否要再玩一次
    if play_again.lower()!= 'yes':  # 如果玩家不想再玩
        break  # 結束遊戲

圖表翻譯:

@startuml
:開始; --> :猜數字;
:B; --> :檢查猜測;
:C; --> [正確] :正確;
:C; --> [錯誤] :錯誤;
:E; --> :結束遊戲;
:F; --> :再次開始;
:開始; --> :剪刀石頭布;
:I; --> :玩家選擇;
:J; --> :電腦選擇;
:K; --> :比較選擇;
:L; --> [平局] :平局;
:L; --> [玩家贏] :玩家贏;
:L; --> [電腦贏] :電腦贏;
@enduml

這個圖表展示了猜數字遊戲和剪刀石頭布遊戲的流程。

剪刀石頭布遊戲實作

剪刀石頭布是一種經典的猜拳遊戲,兩位玩家同時出拳,根據出拳的規則決定勝負。下面是使用Python實作的剪刀石頭布遊戲程式碼。

遊戲規則

  • 剪刀(scissors)贏布(paper)
  • 布(paper)贏石頭(rock)
  • 石頭(rock)贏剪刀(scissors)

程式碼實作

import random

print('ROCK, PAPER, SCISSORS')

# 初始化勝負記錄
wins = 0
losses = 0
ties = 0

while True:  # 主遊戲迴圈
    print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))

    # 玩家輸入迴圈
    while True:
        print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
        player_move = input('> ').lower()

        if player_move == 'q':
            print('Thanks for playing!')
            sys.exit()

        if player_move not in ['r', 'p', 's']:
            print('Invalid input. Please enter r, p, or s.')
            continue

        # 電腦隨機出拳
        computer_move = random.choice(['r', 'p', 's'])

        # 顯示出拳結果
        print('You chose: ' + player_move)
        print('Computer chose: ' + computer_move)

        # 判斷勝負
        if player_move == computer_move:
            print('It is a tie!')
            ties += 1
        elif (player_move == 'r' and computer_move == 's') or \
             (player_move == 's' and computer_move == 'p') or \
             (player_move == 'p' and computer_move == 'r'):
            print('You win!')
            wins += 1
        else:
            print('You lose!')
            losses += 1

        break  # 結束玩家輸入迴圈

內容解密:

上述程式碼使用Python語言實作了剪刀石頭布遊戲。遊戲中,玩家可以輸入自己的出拳選擇,電腦則會隨機出拳。根據出拳規則,判斷勝負並更新勝負記錄。玩家可以繼續遊戲直到選擇離開。

圖表翻譯:

@startuml
:開始; --> :玩家輸入;
:B; --> :電腦出拳;
:C; --> :判斷勝負;
:D; --> :更新記錄;
:E; --> :繼續遊戲;
:F; --> :B;
@enduml

此圖表展示了遊戲的流程,從玩家輸入開始,到電腦出拳、判斷勝負、更新記錄,最後回到玩家輸入繼續遊戲。

建立一款根據Python的石頭剪刀布遊戲

遊戲邏輯概述

在這款遊戲中,玩家可以與電腦對戰。遊戲的核心邏輯是根據玩家和電腦的選擇(石頭、紙或剪刀)來決定勝負。

玩家輸入處理

player_move = input('> ')

這行程式碼用於接收玩家的輸入。玩家可以輸入 'r' 代表石頭, 'p' 代表紙, 's' 代表剪刀,或者 'q' 來離開遊戲。

離開遊戲邏輯

if player_move == 'q':
    sys.exit()  # 離開程式

如果玩家輸入 'q',則立即離開遊戲。

玩家輸入驗證

if player_move not in ['r', 'p', 's']:
    print('請輸入 r、p、s 或 q。')

這段程式碼用於驗證玩家的輸入。如果玩家輸入的內容不是 'r''p''s',則提示玩家輸入正確的選擇。

顯示玩家選擇

if player_move == 'r':
    print('石頭 對戰...')
elif player_move == 'p':
    print('紙 對戰...')
elif player_move == 's':
    print('剪刀 對戰...')

根據玩家的選擇,顯示相應的選擇資訊。

電腦選擇邏輯

import random

move_number = random.randint(1, 3)

if move_number == 1:
    computer_move = 'r'
    print('石頭')
elif move_number == 2:
    computer_move = 'p'
    print('紙')
elif move_number == 3:
    computer_move = 's'
    print('剪刀')

電腦的選擇是透過生成一個隨機數字(1、2 或 3)來決定。如果是 1,則電腦選擇石頭;如果是 2,則選擇紙;如果是 3,則選擇剪刀。

圖表翻譯:

@startuml
:開始; --> :玩家輸入;
:B; --> :C;
:C; --> [r] :r;
:C; --> [p] :p;
:C; --> [s] :s;
:C; --> [其他] :其他;
:D; --> :電腦選擇;
:E; --> :H;
:F; --> :H;
:H; --> :I;
:H; --> :J;
:H; --> :K;
:I; --> :顯示結果;
:J; --> :L;
:K; --> :L;
@enduml

這個流程圖描述了遊戲的主要邏輯流程,從玩家輸入到電腦選擇和顯示結果的整個過程。

完整遊戲程式碼

import sys
import random

while True:
    player_move = input('> ')
    
    if player_move == 'q':
        sys.exit()
        
    if player_move not in ['r', 'p', 's']:
        print('請輸入 r、p、s 或 q。')
        continue
    
    if player_move == 'r':
        print('石頭 對戰...')
    elif player_move == 'p':
        print('紙 對戰...')
    elif player_move == 's':
        print('剪刀 對戰...')
        
    move_number = random.randint(1, 3)
    
    if move_number == 1:
        computer_move = 'r'
        print('石頭')
    elif move_number == 2:
        computer_move = 'p'
        print('紙')
    elif move_number == 3:
        computer_move = 's'
        print('剪刀')
        
    # 根據玩家和電腦的選擇決定勝負
    if player_move == computer_move:
        print('平局!')
    elif (player_move == 'r' and computer_move == 's') or \
         (player_move == 's' and computer_move == 'p') or \
         (player_move == 'p' and computer_move == 'r'):
        print('你贏了!')
    else:
        print('電腦贏了!')

這個完整的程式碼包含了所有必要的邏輯,包括玩家輸入處理、電腦選擇、勝負判斷等。

石頭剪刀布遊戲:勝負判斷與記錄

在石頭剪刀布遊戲中,根據玩家和電腦的出拳進行勝負判斷是關鍵的一步。以下是如何根據出拳結果進行判斷和記錄的示例:

判斷勝負

if player_move == computer_move:
    print('It is a tie!')
    ties = ties + 1
elif player_move == 'r' and computer_move == 's':
    print('You win! Rock smashes scissors.')
    wins = wins + 1
elif player_move == 'p' and computer_move == 'r':
    print('You win! Paper covers rock.')
    wins = wins + 1
elif player_move == 's' and computer_move == 'p':
    print('You win! Scissors cuts paper.')
    wins = wins + 1
else:
    print('You lose!')
    losses = losses + 1

內容解密:

  • if player_move == computer_move: 這行檢查玩家和電腦的出拳是否相同,如果相同則為平局。
  • elif 條件用於檢查玩家勝的情況,例如 player_move == 'r' and computer_move == 's' 表示玩家出石頭而電腦出剪刀,根據遊戲規則,石頭可以壓碎剪刀,所以玩家贏。
  • wins = wins + 1ties = ties + 1 分別用於記錄玩家的勝場和平局次數。
  • else 條件用於處理玩家敗的情況,印出 “You lose!” 並記錄敗場次數。

圖表翻譯:

@startuml
:開始; --> :B;
:B; --> :C;
:C; --> :D;
:D; --> :E;
:D; --> :F;
:D; --> :G;
:E; --> :記錄勝場;
:F; --> :記錄敗場;
:G; --> :記錄平局;
@enduml

圖表翻譯:

  • 圖表描述了從開始到記錄結果的流程。
  • BC 分別代表玩家和電腦的出拳。
  • D 是判斷勝負的關鍵步驟,根據出拳結果決定流程的下一步。
  • EFG 分別對應玩家勝、敗和平局的情況,並分別記錄結果。

程式碼分析:贏、輸與平局記錄

import random, sys

print('ROCK, PAPER, SCISSORS')

# 初始化記錄變數
wins = 0
losses = 0
ties = 0

在這段程式碼中,我們首先匯入了 randomsys 模組,分別用於生成隨機數字和終止程式。接下來,我們初始化了三個變數:winslossesties,用於記錄玩家贏、輸和平局的次數。

玩家選擇與電腦選擇的比較

elif player_move == 's' and computer_move == 'p':
    print('You win!')
    wins = wins + 1

elif player_move == 'r' and computer_move == 's':
    print('You lose!')
    losses = losses + 1

elif player_move == 'p' and computer_move == 'r':
    print('You lose!')
    losses = losses + 1

在這段程式碼中,我們使用 elif 陳述式來比較玩家選擇 (player_move) 和電腦選擇 (computer_move)。根據遊戲規則,當玩家選擇「剪刀」 (s) 而電腦選擇「紙」 (p) 時,玩家贏;當玩家選擇「石頭」 (r) 而電腦選擇「剪刀」 (s) 時,玩家輸;當玩家選擇「紙」 (p) 而電腦選擇「石頭」 (r) 時,玩家也輸。在每種情況下,我們都會印出相應的結果,並更新 winslosses 變數。

圖表翻譯:贏、輸與平局記錄流程

@startuml
:初始化記錄變數; --> :玩家選擇與電腦選擇的比較;
:B; --> :C;
:C; --> :印出贏的結果並更新 wins 變數;
:B; --> :E;
:E; --> :印出輸的結果並更新 losses 變數;
:B; --> :G;
:G; --> :印出平局的結果並更新 ties 變數;
@enduml

這個流程圖展示了贏、輸與平局記錄的流程。首先,我們初始化記錄變數,然後比較玩家選擇和電腦選擇。如果玩家贏,我們印出贏的結果並更新 wins 變數。如果玩家輸,我們印出輸的結果並更新 losses 變數。如果是平局,我們印出平局的結果並更新 ties 變數。

建立一個根據Python的石頭、剪刀、布遊戲

遊戲邏輯概述

石頭、剪刀、布是一種簡單的猜拳遊戲,兩位玩家同時出招,根據出招的規則決定勝負。以下是基本規則:

  • 石頭勝剪刀
  • 剪刀勝布
  • 布勝石頭

程式碼實作

import random
import sys

# 初始化勝負記錄
wins = 0
losses = 0
ties = 0

while True: # 主遊戲迴圈
    print(f'{wins} 勝, {losses} 敗, {ties} 平')
    
    while True: # 玩家輸入迴圈
        print('請輸入您的選擇: (r)石頭 (p)布 (s)剪刀 (q)離開')
        player_move = input('> ').lower()
        
        if player_move == 'q':
            sys.exit() # 離開程式
            
        elif player_move not in ['r', 'p', 's']:
            print('請輸入 r, p, s 或 q。')
            continue
        
        break # 跳出玩家輸入迴圈
    
    # 顯示玩家選擇
    if player_move == 'r':
        print('石頭 對戰...')
    elif player_move == 'p':
        print('布 對戰...')
    elif player_move == 's':
        print('剪刀 對戰...')
    
    # 電腦隨機選擇
    choices = ['r', 'p', 's']
    computer_move = random.choice(choices)
    
    # 顯示電腦選擇
    if computer_move == 'r':
        print('石頭!')
    elif computer_move == 'p':
        print('布!')
    elif computer_move == 's':
        print('剪刀!')
    
    # 判斷勝負
    if player_move == computer_move:
        print('平!')
        ties += 1
    elif (player_move == 'r' and computer_move == 's') or \
         (player_move == 's' and computer_move == 'p') or \
         (player_move == 'p' and computer_move == 'r'):
        print('您贏了!')
        wins += 1
    else:
        print('您輸了!')
        losses += 1

內容解密:

此程式使用兩個迴圈:主遊戲迴圈和玩家輸入迴圈。主遊戲迴圈控制整個遊戲的流程,而玩家輸入迴圈確保玩家輸入有效的選擇。玩家的選擇和電腦的隨機選擇都會被顯示出來,然後根據規則判斷勝負,並更新勝負記錄。

圖表翻譯:

@startuml
:開始; --> :顯示勝負記錄;
:B; --> :玩家輸入選擇;
:C; --> :D;
:D; --> [是] :是;
:D; --> [否] :否;
:E; --> :電腦隨機選擇;
:F; --> :顯示電腦選擇;
:G; --> :判斷勝負;
:H; --> :更新勝負記錄;
:I; --> :A;
@enduml

圖表說明:

此流程圖描述了石頭、剪刀、布遊戲的流程。從開始到顯示勝負記錄,然後進入玩家輸入選擇的迴圈,直到玩家輸入有效選擇。接下來,顯示玩家選擇,電腦隨機選擇,顯示電腦選擇,判斷勝負,更新勝負記錄,最後回到開始。

電腦選擇的顯示

電腦的選擇是透過 random.randint(1, 3) 這個函式來隨機產生的。這個函式會回傳一個 1 到 3 之間的隨機整數,並將其存入 move_number 這個變數中。接著,根據 move_number 的值,程式會將相應的字串 (‘r’、‘p’ 或 ’s’) 存入 computer_move 這個變數中,並且印出電腦的選擇。

import random

# 電腦的選擇
move_number = random.randint(1, 3)

if move_number == 1:
    computer_move = 'r'
    print('ROCK')
elif move_number == 2:
    computer_move = 'p'
    print('PAPER')
elif move_number == 3:
    computer_move = 's'
    print('SCISSORS')

顯示和記錄勝負結果

接下來,程式會根據玩家和電腦的選擇來判斷勝負結果。如果玩家和電腦的選擇相同,則印出 “It is a tie!",並且將 ties 這個變數加 1,以記錄平局的次數。

# 顯示和記錄勝負結果
if player_move == computer_move:
    print('It is a tie!')
    ties = ties + 1

內容解密:

在這段程式碼中,我們使用 random.randint(1, 3) 來產生電腦的隨機選擇。然後,根據這個隨機數字,我們決定電腦的選擇是 ‘r’、‘p’ 還是 ’s’,並且印出相應的選擇。最後,如果玩家和電腦的選擇相同,我們就印出 “It is a tie!",並且增加 ties 的值,以記錄平局的次數。

圖表翻譯:

@startuml
:開始; --> :產生電腦選擇;
:B; --> :判斷勝負;
:C; --> :D;
:D; --> [是] :是;
:D; --> [否] :否;
:E; --> :增加 ties 值;
:F; --> :印出勝負結果;
@enduml

這個流程圖描述了程式的執行流程,從產生電腦選擇到判斷勝負和記錄平局的次數。

獨立程式碼區塊

# 玩家選擇與電腦選擇的比較
if player_move == 'r' and computer_move == 's':
    print('You win!')
    wins = wins + 1
elif player_move == 'p' and computer_move == 'r':
    print('You win!')
    wins = wins + 1
elif player_move == 's' and computer_move == 'p':
    print('You win!')
    wins = wins + 1
elif player_move == 'r' and computer_move == 'p':
    print('You lose!')
    losses = losses + 1
elif player_move == 'p' and computer_move == 's':
    print('You lose!')
    losses = losses + 1
elif player_move == 's' and computer_move == 'r':
    print('You lose!')
    losses = losses + 1

內容解密:

在這個程式碼區塊中,我們實作了玩家選擇與電腦選擇的比較。根據「石頭、紙、剪刀」的規則,當玩家選擇「石頭」(‘r’)而電腦選擇「剪刀」(’s’)時,玩家贏;當玩家選擇「紙」(‘p’)而電腦選擇「石頭」(‘r’)時,玩家贏;當玩家選擇「剪刀」(’s’)而電腦選擇「紙」(‘p’)時,玩家贏。相反,如果玩家選擇「石頭」(‘r’)而電腦選擇「紙」(‘p’)時,玩家輸;如果玩家選擇「紙」(‘p’)而電腦選擇「剪刀」(’s’)時,玩家輸;如果玩家選擇「剪刀」(’s’)而電腦選擇「石頭」(‘r’)時,玩家輸。根據比較結果,我們分別增加勝利(wins)或失敗(losses)的計數器。

流程圖

@startuml
:開始; --> :玩家選擇;
:B; --> :電腦選擇;
:C; --> :比較選擇;
:D; --> :玩家贏;
:D; --> :玩家輸;
:E; --> :增加勝利計數;
:F; --> :增加失敗計數;
:G; --> :結束;
:H; --> :I;
@enduml

圖表翻譯:

這個流程圖描述了「石頭、紙、剪刀」遊戲的流程。遊戲從開始(A)開始,然後玩家進行選擇(B),接著電腦進行選擇(C)。然後,程式比較玩家和電腦的選擇(D),根據比較結果,決定玩家是否贏(E)或輸(F)。如果玩家贏,則增加勝利計數(G);如果玩家輸,則增加失敗計數(H)。最終,遊戲結束(I)。

從技術架構視角來看,while 迴圈的本質是根據條件判斷的程式碼重複執行機制。本文深入剖析了 while 迴圈的運作原理、流程控制、以及與 for 迴圈的比較,並以猜數字和剪刀石頭布遊戲為例,展示了迴圈的實際應用。然而,while 迴圈的靈活性也伴隨著潛在風險,例如無限迴圈的產生。程式開發者需要仔細設計迴圈條件和終止條件,才能避免程式陷入死迴圈。對於初學者,建議先從簡單的迴圈開始練習,逐步掌握迴圈的精髓。展望未來,隨著程式語言的發展,迴圈結構可能會出現更簡潔、更安全的表達方式,但其核心思想——根據條件的重複執行——將始終保持不變。玄貓認為,熟練掌握 while 迴圈是程式設計的基礎,也是通往進階程式設計的必經之路。對於追求程式碼效率的開發者,更需要深入理解迴圈的底層機制,才能寫出效能更優的程式碼。