石頭剪刀布遊戲代碼編寫思路及步驟

這是一篇當你學會了數據結構,while,if,賦值語句後就可以進行的一個簡單小遊戲編程。不要只收藏,不點贊啊。


編寫思路:

首先,這遊戲是互動式的,玩家出拳,計算機隨機出拳,比較後給出結果。玩家這個實體可以用input函數。計算機隨機可以用random庫,choice是random庫中的一個函數,隨機選擇參數中的單個元素輸出,參數是字元串,輸出的是單個字元。

>>>import random

>>>random.choice("abcdef")

b

>>>random.choice("abcdef")

d

如果想輸出一個單詞怎麼辦?把參數由字元串換位列表,列表的元素用字元串表示,輸出列表中的每一項。

>>>random.choice("abcdefg","aaa")

這裡涉及類創建實例時傳參數,實例本身也就一個參數。所以是3個參數。

>>>random.choice(["aaa","bbb","ccc"])

aaa

>>>random.choice(["aaa","bbb","ccc"])

aaa

>>>random.choice(["aaa","bbb","ccc"])

bbb

初步實現:

原型

創建一個項目myproject

新建一個文件game.py

#game.py

import random

computer=random.choice(["石頭","剪刀","布"])#這樣寫也對,但是因為這個列表中的元素會被反覆用到,可以換種方式表示,把列表先定義出來,賦給一個變數。

all_choice=["石頭","剪刀","布"]

computer=random.choice(all_choice)

player=raw_input("請出拳(石頭/剪刀/布):")

接下來可以進行判斷,先寫結構再補充內容

計算接和人分別都有三種表達方法

if computer==石頭:

if player==石頭:

print("平局")

elif 剪刀:

print( "you lose")

else:

print("you win!")

elif computer==剪刀:

if player==石頭:

print("you win!")

elif 剪刀:

print("平局")

else:

print( "you lose")

else:

if player==石頭:

print( "you lose")

elif 剪刀:

print("you win!!!")

else:

print("平局")

在終端運行,python game.py

請出拳(石頭/剪刀/布):石頭

平局

再次運行 文件

請出拳(石頭/剪刀/布):石頭

you lose

每次運行結果是隨機的。

但是只這樣顯示結果的話,玩家不知道自己為什麼就輸了,沒有計算機出拳的顯示

修改代碼,思考顯示結果應該放在哪個位置。

放在計算機和玩家輸入之後,判斷語句代碼塊(輸出結果)之前。

加入輸出語句,print"Your choice:",player,"Computers choice:",computer)

#player一個變數

再次運行python game.py

請出拳(石頭/剪刀/布):剪刀

Your choice:剪刀 Computers choice:布

you win!!!

三、目前為止,初步實現功能,接下來怎麼將代碼進行完善呢

判斷語句有點過長,簡化

只有三種結果:平局,贏和輸。

平局好判斷,玩家和計算機相同。

玩家贏這個結果也分三種情況(玩家,計算機出拳次序):石頭和剪刀,剪刀和布,布和石頭。

將玩家贏的三種情況放到一個變數中(這裡涉及選擇什麼樣的變數類型),判斷語句不是平局,不是贏,那就是輸。

選取列表的數據類型,命名為win_list,存儲三種玩家贏的情況。列表是一個容器,每一個元素可以是不同類型的數據。

game2.py

import random

all_choice=[石頭,剪刀,布]

win_list=[[石頭,剪刀],[剪刀,布],[布,石頭]]

computer=random.choice(all_choice)

player=raw_input("請出拳(石頭/剪刀/布):")

print"Your choice:",player,"Computers choice:",computer)

當計算機和人進行出拳後,出拳結果組合起來成為一個小列表元素如果是列表win_list中的一項,就是玩家贏。

if computer==player:

print("平局")

elif [player,computer] in win_list:

pritn("you win!!!")

else:

print("you lose")

終端運行一下,python game2.py

成功運行

目前代碼比較簡潔了,但是還有不太盡如人意的地方

比如1、出拳時讓玩家寫入石頭剪刀布,終端運行時來回切換輸入法比較麻煩/2、輸出結果白色背景黑色字體,不太明顯。即進入第三階段改進用戶體驗

三、改進用戶體驗

第一個問題讓用戶輸入123,或者abc會比較容易,比如1代表石頭,2代表剪刀,3代表布

以下文檔保存只game3.py中

import random

all_choice=[石頭,剪刀,布]

win_list=[[石頭,剪刀],[剪刀,布],[布,石頭]]

computer=random.choice(all_choice)

player=raw_input("請出拳(石頭/剪刀/布):")

把提示玩家輸入的提示語句修改一下,改為讓玩家輸入數字。

把提示語句寫到一個變數prompt中,將prompt變數放到input語句中,這樣可讀性更好。

因為列表元素有索引下標的,all_choice[0]=石頭,可以讓玩家輸入0,1,2索引值(但必須在提示語句里讓玩家知道,數字代表的

代表的意思。玩家和

計算機比較的是元素,因此player需要進行重新賦值。

prompt="""(0)石頭

(1)剪刀

(2)布

please input your choice:""" 因為是多行字元串所以要寫三引號,三引號可以保存用戶的格式

ind=int(raw_input(prompt)

player=all_choice[ind] input讀進來的是字元串類型,因此使用int()進行轉換,,否則這裡會報錯。

運行一下:$python game3.py (python是命令,所在目錄為當前文件存儲目錄)

(0)石頭

(1)剪刀

(2)布

please input your choice:

第一個用戶體驗已經改完,接下來第二部改進顏色

在linux終端命令下(echo的功能是在顯示器上顯示一段文字,-e選項是為了處理特殊字元,比如 [):

~$echo -e "OK"

OK

~$echo -e "33[32;1mOK33[0m"

OK(屏幕上應該是綠色)

~$echo -e "33[31;1mOK33[0m"

OK(屏幕上是紅色字體)

33是黃色,34是藍色

OK前面一部分是設置顏色,OK後面一部分是關閉顏色

~$echo -e "33[33;1mOK"

OK(黃色以及接下來的命名行也是黃色

echo的功能是在顯示器上顯示一段文字,-e選項是為了處理特殊字元,比如 [

在python中也是這樣

將列印結果語句凸顯顏色

print("33[32;1m平局33[0m")

平局以綠色來表示

輸和贏都以紅色表示

print("33[31;1myou lose33[0m")

目前第三部分用戶體驗已經完成

回過頭看程序還能怎麼簡化,win_list列表裡大列表包含小列表,有點羅嗦,要存儲的無非是計算機和人的選擇

可以組成列表,當然也可以組成字元串。win_list=["石頭剪刀","剪刀布","布石頭"。

另外print("your choice:",player,"computers choice:",computer)這裡字元串和變數混合著寫,影響可讀性,

改為字元串格式化輸出

print("your choice:%s,compters choice:%s"%(player,computer)),前面全是字元串後面全是變數

在if判斷中,elif語句由[player,computer]改為player+compuer。

只用了數據類型,和if語句就寫出的代碼

如果遊戲規則發生變化,運行了一次後重複這行代碼,最終實現三局兩勝呢?

思路是:

三局兩勝,不是人和計算機出三次拳,因為會有平局,無法判斷誰贏。

執行過程是,計算機和人循環出拳,每次都判斷輸贏,如果有平局就跳過。最後再來一個判斷語句,三次結果中兩次贏的是

最終贏的一方。

因此循環次數不能在之前就確定,不能用for循環要用while循環,數據類型上還需要有計數的變數

人和計算機都有一個計數器,誰贏夠兩次就打破循環

pwin=0

cwin=0

誰贏誰就加1,當任意一方=2時就結束循環,即二者都小於2時(while語句後的真值判斷語句)才可以繼續

另外一個問題是,循環從哪個位置開始寫

固定的語句,比如變數的賦值語句,不用寫在循環里,因為會重新賦值,但是又不需要重新賦值。

因此循環開始的地方是人機出拳之前,將while後的代碼選中按Tab鍵可以向右縮(shift+tab是向左縮進)

最後,在循環體外輸出列印最終的輸贏結果

import random

all_choice=["石頭","剪刀","布"]

win_list=["石頭剪刀","剪刀布","布石頭"]

prompt="""(0)石頭

(1)剪刀

(2)布

please input you choice:"""

pwin=0

cwin=0

while pwin<2 and cwin<2:

computer=random.choice(all_choice)

ind=int(input(prompt))

player=all_choice[ind]

print("your choice:%s,computers choice:%s"%(player,computer))

if computer==player:

print("33[32;1m平局33[0m")

elif player+computer in win_list:

print("33[31;1myou win!!!33[0m")

pwin+=1

else:

print("33[31;1myou lose33[0m")

cwin+=1

if cwin==2: #if後是真假值判斷語句,cwin==2是判斷cwin的值是不是2

print("33[31;1mFinally,you lose33[0m")

else:

print("33[31;1mFinally,you win!!!33[0m")

while循環結束循環補充點

當然,while循環經常與break合用,跳出當前循環(通常是死循環while True)執行循環後的語句。

continue不中斷循環,是結束本次循環,回到循環頂端重新開始,此時while後條件為真,繼續執行,如果為假就退出循環,可以

間接的實現退出循環。

while語句也支持else語句,此時else屬於該循環的子句,break語句執行跳出循環時也會跳過else塊,else子句只在循環完成後執行。這點很容易弄混淆。

while ...else...語句呢,,當while語句正常結束後else語句就可以執行了,如果while語句里有break語句,while不能正常結束的話else語句將不會被執行。

將上面while循環改為while...else語句

while pwin<2 and cwin<2:

computer=random.choice(all_choice)

ind=int(input(prompt)

player=all_choice[ind]

print("your choice:%s,computers choice:%s"%(player,computer))

if computer==player:

print("33[32;1m平局33[0m")

elif player+computer in win_list;

print("33[31;1myou win!!!33[0m")

pwin+=1

else:

print("33[31;1myou lose33[0m")

cwin+=1

else: #此else語句不和if語句平級,和while語句是平級

if cwin==2:

print("33[31;1mFinally,you lose33[0m")

else:

print("33[31;1mFinally,you win!!!33[0m")

執行一下,結果一樣。

至此,這個小程序已經完成。


推薦閱讀:

一種單入口的API框架設計方式(新手向)
Cognition 與職業危機
從過去找原因

TAG:編程 | 遊戲 | 科技 |