第 7 關、小遊戲大學問

第七關是我們的一個小項目,結合我們所學知識的一個小遊戲——人機 PK 遊戲。

  • 基礎元素

1、要有玩家敵人:那就是需要定義兩個角色的屬性變量

2、相互攻擊:需要兩個角色都有血量和攻擊的變量(也就是四個變量)

3、攻擊減少血量:比如玩家血量=敵人攻擊力-玩家當前血量

4、最終勝負:就是某一方的血量小於等於 0

 

  • 版本迭代

1、自定屬性,人工 PK

純打印語句,無任何運算

1-1、time 模塊

調用:import time

使用:time.sleep(n)(表示停留 n 秒再運行後續代碼)

1-2、版本 1 代碼實現

import time  #通常import語句會寫到代碼的開頭

print('【玩家】\n血量:100\n攻擊:50')  

print('------------------------')  

time.sleep(1.5)

#暫停1.5秒,再繼續運行後面的代碼



print('【敵人】\n血量:100\n攻擊:30')

print('------------------------')

time.sleep(1.5)



print('你發起了攻擊,【敵人】剩餘血量50')  

print('敵人向你發起了攻擊,【玩家】剩餘血量70') 

print('------------------------')

time.sleep(1.5)



print('你發起了攻擊,【敵人】剩餘血量0')  

print('敵人向你發起了攻擊,【玩家】剩餘血量40')

print('-----------------------')

time.sleep(1.5)



print('敵人死翹翹了,你贏了!')

2、隨機屬性,自動 PK

2-1、random 模塊

調用:import random

使用:random.randint(x,y) (表示隨機生成 x - y 範圍內(含 x 和 y)的一個整數)

2-2、版本 2 代碼實現

思路:

  1. 使用隨機函數定義玩家的血量和攻擊屬性(player_life、player_attack);
  1. 使用隨機函數定義電腦的血量和攻擊屬性(enemy_life、enemy_attack);
  1. 分勝負(某一方血量小於等於 0,則某一方的血量 = 某一方的當前血量 - 另一方的攻擊);
  1. 記錄每一次的戰鬥流程(採用 while 語句循環打印)
import time,random



player_life = random.randint(100,150)

player_attack = random.randint(30,50)

enemy_life = random.randint(100,150)

enemy_attack = random.randint(30,50)



print('【玩家】\n'+'血量:'+str(player_life)+'\n攻擊:'+str(player_attack))

print('------------------------')

time.sleep(1)

print('【敵人】\n'+'血量:'+str(enemy_life)+'\n攻擊:'+str(enemy_attack))

print('------------------------')

time.sleep(1)



while (player_life >0) and (enemy_life > 0):

player_life = player_life - enemy_attack

enemy_life = enemy_life - player_attack

print('你發起了攻擊,【敵人】剩餘血量'+str(enemy_life))

#player_life是整數,所以拼接時要先用str()轉換

print('敵人向你發起了攻擊,【玩家】剩餘血量'+str(player_life))

print('------------------------')

time.sleep(1.5)

# 爲了體現出戰鬥回合,這裏停頓1.5秒

3、打印戰果,三局兩勝

3-1、版本 3 代碼實現

思路:

  1. 結合版本 2 ,實現三局兩勝的情況 for i in range(3)(戰鬥代碼記得置於 for 循環中)
  1. 戰鬥結果:①、定義存放玩家贏的局數變量:player_victory = 0;②、定義存放電腦贏的局數變量:enemy_victory = 0。當某一方贏則 + 1。
import time,random



player_victory = 0

enemy_victory = 0



for i in range(1,4):

  time.sleep(2) # 讓局與局之間有較明顯的有時間間隔

  print(' \n——————現在是第'+str(i)+'局——————') # 作爲局的標記

  player_life = random.randint(100,150)

  player_attack = random.randint(30,50)

  enemy_life = random.randint(100,150)

  enemy_attack = random.randint(30,50)



# 展示雙方角色的屬性

print('【玩家】\n'+'血量:'+str(player_life)+'\n攻擊:'+str(player_attack))

print('------------------------')

time.sleep(1)

print('【敵人】\n'+'血量:'+str(enemy_life)+'\n攻擊:'+str(enemy_attack))

print('------------------------')

time.sleep(1)



# 雙方PK

while player_life > 0 and enemy_life > 0:

  player_life = player_life - enemy_attack

  enemy_life = enemy_life - player_attack

  print('你發起了攻擊,【敵人】剩餘血量'+str(enemy_life))

  print('敵人向你發起了攻擊,【玩家】剩餘血量'+str(player_life))

  print('-----------------------')

  time.sleep(1.5)



#打印最終戰果

if player_life > 0 and enemy_life <= 0:

  player_victory += 1

  print('敵人死翹翹了,你贏了!')

elif player_life <= 0 and enemy_life > 0:

  enemy_victory += 1

  print('悲催,敵人把你幹掉了!')

else:

  print('哎呀,你和敵人同歸於盡了!')



if player_victory > enemy_victory :

  time.sleep(1)

  print('【最終結果:你贏了!】')

elif enemy_victory > player_victory:

  print('【最終結果:你輸了!】')

else:

  print('【最終結果:平局!】')

4、知識拓展

4-1、格式符

4-1-1、格式符 %

格式符%後面有一個字母,這是一個類型碼,用來控制數據顯示的類型

a=123.23

print('這是將浮點型的%d轉爲整數型'%a)

print('這是將浮點型的%f轉爲浮點型'%a)

print('這是將浮點型的%s轉爲字符型'%a)

4-1-2、格式符 format

定義:format()函數用來佔位的是大括號{},不用區分類型碼(%+類型碼)

使用:語法是:'str'.format(),而不是課堂上提到的'str % ()'。而且,它對後面數據的引用更靈活,不限次數,也可指定對應關係。

下面的兩個例子都可以打印出 “七七說,這是第7關啦”:

a='七七'

b=7

print('{}說,這是第{}關啦'.format(a,b))



print('{1}說,這是第{0}關啦'.format(7,'七七'))

# 這裏有點類似列表,{0}代表format中的第一個元素 1 ;{1}代表format中的第二個元素'七七'

4-2、random 模塊

4-2-1、random.randint()

用法:random.randint(x,y):產生 x 到 y 的一個整數型隨機數

import random

print( random.randint(1,10) ) # 產生 1 到 10 的一個整數型隨機數

4-2-2、random.uniform()

用法:random.uniform(x,y):產生 x 到 y 之間的隨機浮點數,區間可以不是整數

import random

print( random.uniform(1.1,5.4) ) # 產生 1.1 到 5.4 之間的隨機浮點數

4-2-3、random.choice()

用法:random.choice(x):從序列 x 中隨機選取一個元素

import random

print( random.choice('python') ) # 從序列中隨機選取一個元素

4-2-4、random.randrange()

用法:random.randrange(x,y,z):生成從 x 到 y 的間隔爲 z 的隨機整數

import random

print( random.randrange(1,100,2) ) # 生成從1到100的間隔爲2的隨機整數

4-2-5、random.shuffle()

用法:random.shuffle(x):將序列 x 中的元素順序打亂

import random

a=[1,3,5,6,7]

random.shuffle(a) # 將序列a中的元素順序打亂

4-2-6、random.sample()

用法:random.sample(x,y):從字符 x 中抽取 y 個隨機字符

import random

print( random.sample('python',3) ) # 從字符串中隨機選取三個字符

5、習題

5-1、random 函數 + 格式符

題目:山腳A84/A85村的學員小明非常懶,一週的時間一個關卡都沒有學!到了考試這天,他問卡西有沒有什麼技巧應對考試,卡西告訴他說可以做一個隨機蒙答案的程序。這個程序是一次蒙出10道題目的答案(答案爲A、B、C、D),你會嗎?快來嘗試做一下!

第一種方法:

import random

for i in range(1,11):

  answer = random.sample('ABCD',1)[0]

  print('第%d題的答案爲%s' %(i,answer))

第二種方法:

import random

answer=[]

for i in range(10):

  answer.append(random.choice(['A', 'B', 'C', 'D']))

  print('第{}道題的答案爲{}'.format(i+1,answer[i]))

5-2、格式化字符

題目:下面的語句中,那個可以正確輸出:“我愛python”

A、print('{2}{0}{1}'%format('愛','python','我'))

B、print('{3}{1}{2}'.format('愛','python','我'))

C、print('{2}{0}{1}'.format('愛','python','我'))

D、print('{%s}{%s}{%s}'.format('愛','python','我'))

答案:C

解析:format 的格式爲 '{}'.format() 。而{}中的數字對應的 format 括號中的元素,類似列表,也是從 0 開始算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章