剪刀石頭布是個看似簡單,但卻富有哲理的遊戲。
如果用最直覺的方法來想,你的3個情況(剪刀、石頭、布) x 電腦的3個情況,你可能會寫出有9種條件的if判斷式。
但仔細想一想其實剪刀石頭布就是一個下一個拳一定會贏前一個拳的遊戲,換句話說,如果換成選數字,就是下一個數字一定贏前一個數字的遊戲。
像是我們設定0是剪刀、1是石頭、2是布,比較大的數字會贏比較小的數字,2 -> 1、1 -> 0、0 -> 2,遇到這種有循環關係的情況就可以取餘數運算(%),因為取餘數運算其實是一個把值限制住的運算,a % b -> 小於 b 的數。
如果你還搞不懂%(取餘數)和//(取商數整數)的用法,這裡舉的小例子。
大家都知道13除以3等於4餘1,那麼13 // 3 = 4、13 % 3 = 1,這樣子就很清楚了。
0 % 3 -> 0
1 % 3 -> 1
2 % 3 -> 2
3 % 3 -> 0
4 % 3 -> 1
5 % 3 -> 2
6 % 3 -> 0
0~n: % (n+1)
先import亂數的函式庫。
import random
使用者要輸入他的選擇,電腦的選擇則是用亂數的方式取,接著輸出雙方的選擇。我們把 0, 1, 2 翻譯成剪刀石頭布,所以後面也準備了一個翻譯清單 0 -> 剪刀 1 -> 石頭 2 -> 布,而這個0, 1, 2剛好就是元素在list裡的座號。
my = int(input("[0]剪刀 [1]石頭 [2]布: "))
com = random.randint(0, 2)
trans = ["剪刀", "石頭", "布"]
print("我的:", trans[my])
print("電腦:", trans[com])
重頭戲來了,要判斷誰輸誰贏。那這邊先假設me = 剪刀,com = 布,括號內的+1就相當是往下一個拳前進,但是這裡不可能會有3,布的剋星也就是布+1應該是剪刀才對,於是我們對3取餘數,讓它重新回到0。
if my == (com + 1) % 3:
print("Win")
elif com == (my + 1) % 3:
print("Lose")
else:
print("Even")
最後放個完整版程式碼。
import random
my = int(input("[0]剪刀 [1]石頭 [2]布: "))
com = random.randint(0, 2)
trans = ["剪刀", "石頭", "布"]
print("我的:", trans[my])
print("電腦:", trans[com])
if my == (com + 1) % 3:
print("Win")
elif com == (my + 1) % 3:
print("Lose")
else:
print("Even")
這個童年遊戲相信大家也有玩過吧!其實它的原理跟剪刀石頭布是一樣的,稍微不同的是只有同時出現棒子+老虎或是雞+蟲才會分出勝負,如果是老虎+雞則是平手。
一開始照樣先import亂數的函式庫。
import random
接著要讓使用者要輸入他的選擇,而電腦的選擇則是由亂數的方式取,接著輸出雙方的選擇。
my = int(input("[0]棒子 [1]老虎 [2]雞 [3]蟲: "))
com = random.randint(0, 3)
trans = ["棒子", "老虎", "雞", "蟲"]
print("我的:", trans[my])
print("電腦:", trans[com])
這個遊戲跟剪刀石頭布不一樣的是平手條件反而是最複雜的,所以我們平手的情況放在最後。
if my == (com + 1) % 4: #我是電腦的下一個就會輸
print("Lose")
elif com == (com - 1) % 4: #我是電腦的上一個就是贏
print("Win")
else:
print("Even")
最後放個完整版程式碼。
import random
my = int(input("[0]棒子 [1]老虎 [2]雞 [3]蟲: "))
com = random.randint(0, 3)
trans = ["棒子", "老虎", "雞", "蟲"]
print("我的:", trans[my])
print("電腦:", trans[com])
if my == (com + 1) % 4: #我是電腦的下一個就會輸
print("Lose")
elif com == (com - 1) % 4: #我是電腦的上一個就是贏
print("Win")
else:
print("Even")