`
之前講解了從scratch到python,基于python turtle庫的實現(xiàn)八秃,講解了用scratch和python turtle繪圖的實現(xiàn)昔驱,以及讓小貓動起來和當角色被單擊的例子舍悯。
本節(jié)課講繼續(xù)探索從scratch到python的道路睡雇,以猜數(shù)游戲為進行講解它抱。
概述
猜數(shù)游戲是一個很經(jīng)典的例子,要開發(fā)一個完整的猜數(shù)游戲祠墅,需要用到編程中的變量歌径、循環(huán)回铛、分支茵肃,獲取用戶輸入等基本知識,還要對邏輯運算有一定的了解捞附。
本文將會帶領(lǐng)大家實現(xiàn)這樣一個小游戲鸟召,游戲開始后药版,讓用戶猜數(shù)字喻犁,如果數(shù)字大于或者小于目標數(shù)字將會給出提示肢础,如果猜對了就讓用戶選擇是否繼續(xù)玩兒下去传轰,如果選擇繼續(xù)慨蛙,開始新一輪游戲;否則游戲結(jié)束跟匆;同時用戶每猜對一次得5分玛臂。
當然還可以更加復雜比如加入時間限制迹冤,因為復雜度高一些就不用了。
分解
其實各國在中小學引入編程教育橱鹏,更多的是讓孩子們從以計算機的方式來考慮問題蚀瘸,培養(yǎng)邏輯思維能力和編程思維,并非是要把所有人都培養(yǎng)成程序員苏章。
編程思維是一個非常重要的概念奏瞬,含義是將以大的問題分解問小的問題硼端,然后逐步解決每個小問題珍昨,最后解決整個問題镣典。
在谷歌教育的公開課中有關(guān)于編程思維的詳細論述,感興趣的老師可以去看一下澎剥,當然我自己也只是看了個開頭哑姚,畢竟推薦讀書的人有時候未必然是讀書的人嘛叙量,但是我知道這是個好東西夕晓。
那么我們就把這個任務分解為以下步驟:
- 用一個變量了保存用戶的積分
- 生成目標數(shù),在猜數(shù)游戲中目標應該是隨機的析既,同時保存在變量中
- 提示用戶猜測數(shù)字眼坏,獲取用戶輸入宰译,并保存在變量中
- 判斷用戶輸入沿侈,給出適當?shù)姆答?/li>
- 如果用戶猜對了缀拭,加5分填帽,詢問是否繼續(xù)
- 如果用戶選擇繼續(xù)篡腌,重復1-5步嘹悼;否則游戲結(jié)束
下面我們按照這個思路來實現(xiàn)這個程序
具體實現(xiàn)
積分變量
首先我們要新建一個變量绘迁,保存分數(shù)缀台,并且初始化為0分
從現(xiàn)在開始我們就要感受到python的簡潔之美了膛腐,在scratch我們新建積分變量并設(shè)定為0哲身,需要好幾步操作勘天,而在python中只需要一句命令就好了
score = 0
這也是高級語言的特點,Python作為高級語言,代碼量可以說是Java的十分之一,c語言的百分之一;當然對于初學者來說還是是誠然比較容易理解
聲明積分變量之后,我們就要生成要猜測的目標數(shù)字了.
生成目標數(shù)字
目標數(shù)字是個隨機數(shù),是一定范圍之內(nèi)的隨機數(shù),所以我們先來看Scratch和Python都是怎么生成隨機數(shù)的
這次Python就需要費點腦筋了,Python有許多別人寫好的完成特定功能的代碼,成為代碼庫,生成隨機數(shù)的代碼庫叫做random,換句話說我們要用生成隨機數(shù)的功能,就需要引入random庫,然后庫中有函數(shù),調(diào)用對應的函數(shù)就可以完成相應的功能
我們要用到的是randomint()
函數(shù),比如生成1-10的隨機整數(shù)就是randomint(1, 10)
好,背景交代完畢,下面我們就上手來實現(xiàn)生成隨機數(shù)
接下來,我們看Python是如何實現(xiàn)的
import random
score = 0
target = random.randint(1, 10)
print(score, target)
現(xiàn)在,積分變量也有了,也生成要猜測的數(shù)字了,接下來就要提示用戶猜數(shù)字了,用戶不輸入數(shù)字也就沒得玩了,不過似乎可以寫一個猜數(shù)的機器人,用隨機數(shù)來猜測,這又是另外一個程序了
獲取用戶輸入
我們還是以Scratch為例進行講解,在Scratch獲取用戶輸入要用到偵測代碼分類中共的兩個代碼塊
當然我們需要新建一個變量,并把用戶的回到放到這個變量里
而Python中則要用到input()
函數(shù),但是有一點要注意的是,input()
函數(shù)讀入的數(shù)據(jù)的類型是字符串類型,需要轉(zhuǎn)換成整數(shù),而將字符串轉(zhuǎn)換為整數(shù)要用到int()
函數(shù),當然一個嚴格程序這里還需要對輸入進行驗證的,這個等你熟悉了Python之后可以自行完成.
import random
score = 0
target = random.randint(1, 10)
print(score, target)
guess_number = int(input('請輸入你要猜的數(shù)字:'))
判斷用戶輸入對錯
在這里我們就要用到分支結(jié)構(gòu)了,所謂分支結(jié)構(gòu)簡單的來說就是滿足某個條件的時候做某個事情,比如你高考分數(shù)大于700,只要你運氣不是特別被,長得不是特別丑,也不作死基本就能去北大清華了;而如果天氣預報說明天下雨的話,十有八九你是會選擇帶傘出門的,畢竟有的人喜歡淋雨不是.
這里我們就要進行判斷,如果用戶輸入的大于目標數(shù),就提示大了,否則提示小了,這里要用到控制模塊中的分支模塊
同時還會用到數(shù)字和邏輯運算分類中的比大小
這里涉及了邏輯運算和分支結(jié)構(gòu)兩個知識點,大家還記得嗎?
這樣,用戶第一次輸入的時候,會判斷用戶輸入的數(shù)也就是猜的數(shù)跟目標數(shù)字孰大孰小,如果大了就會提示'大了',如果相等就恭喜,如果小了,就提示'你猜的數(shù)太小了',問題是實際猜測中很難一次就猜中的,所以我們需要反復不停的猜測,如果猜錯了就要重新獲取用戶的輸入,一直到猜對
不能往下講了,再往下就要用到循環(huán)了,循環(huán)猜測的過程,我們先不講,回過頭來講python如何實現(xiàn)這一步
首先Python的語法呢,比較有意思,沒有萬惡的大括號,但是有固定的縮寫,雖然tab黨和空格黨有一場世紀之戰(zhàn),但是作為空格的擁泵,大家跟我一樣用空格就好了.Python中if語句的格式是
if expr:
pass
else:
pass
注意到了嗎,expr和else后面的語句是有四個空格的,同時:冒號是必不可少的,expr代表的是邏輯表達式,關(guān)于邏輯表達式呢,隨便找一本關(guān)于編程的書都能夠講個五六七八頁,簡單的說就是大小相等的判斷,這里呢就是判斷我們猜的數(shù)和目標數(shù)的大小
import random
score = 0
target = random.randint(1, 10)
print(score, target)
guess_number = int(input('請輸入你要猜的數(shù)字:'))
if guess_number > target:
print('too big')
elif guess_number = target:
print('right')
else:
print('too small')
guess_number = int(input('請輸入你要猜的數(shù)字:'))
細心的同學們可能注意到了,我用到的判斷和上面說的不一樣啊,雖然不一樣,也差不多啊,想想有什么不一樣,有什么一樣呢?寫了這么多怪累的,就不詳細說了.
這個時候已經(jīng)可以猜數(shù)了,但是只有一次機會,一次之后即便你讀取了用戶猜的數(shù)字,你也沒有反饋的機會了,這樣的游戲肯定是不完整的,雜么辦呢?
循環(huán)
日常生活中,我們會說把課文抄10遍,我們就知道需要重復執(zhí)行抄課文10次,那么在Scratch是有循環(huán)的結(jié)構(gòu)的
當然如果你想限制猜測的次數(shù)可以用這個,如果在規(guī)定的次數(shù)內(nèi)沒有猜到,就扣分,這也很可以,然而這里我想做的是讓用戶不停的猜測直到猜對為止.
比如隔壁村的王二狗跟俺們村的李翠花約定,在湖邊見面,不見不散,那么王二狗只能一個人孤零零的在湖邊等著,直到俺們村的李翠花到了湖邊,也就是說只有滿足了某個條件,才會執(zhí)行,在這里,就是重復執(zhí)行,直到猜對了,或者說在沒有猜對的情況下,會讓玩家一直猜猜猜.
好,接下來我們繼續(xù)完善我們的程序
看看上面的程序,我們做了改動,用戶第一次猜測之后,就會判斷
guess_number
與target
是否相等,如果不相等,就會進入里面的判斷,判斷結(jié)束后引導用戶再猜,直到猜對為止.
我對程序做了一些修改,改動了哪里?為什么?這個程序是否可以繼續(xù)優(yōu)化呢?
這里是分割線,思考上述問題5分鐘.
然后我們來看Python要怎么做:
這里用到了while
循環(huán),只要條件成立,就一直做
while expr:
pass
下面是代碼
import random
score = 0
target = random.randint(1, 10)
print(score, target)
guess_number = int(input('請輸入你要猜的數(shù)字:'))
while guess_number != target:
if guess_number > target:
print('too big')
elif guess_number == target:
print('right')
else:
print('too small')
guess_number = int(input('請輸入你要猜的數(shù)字:'))
print('恭喜你蒙對了')
判斷用戶是否繼續(xù)玩
這里就要再次詢問用戶,到這里呢,其實基本的功能已經(jīng)完成了,后面完善成為完整的猜數(shù)游戲呢,還是要用到循環(huán),重復執(zhí)行某些步驟,然后就是給得分變量賦值,你能猜到怎么做嗎?
歡迎大家投稿,過幾天我公布答案.