從scratch到python——猜數遊戲

之前講解了從scratch到python,基於python turtle庫的實現,講解了用scratch和python turtle繪圖的實現,以及讓小貓動起來和當角色被單擊的例子。

本節課講繼續探索從scratch到python的道路,以猜數遊戲為進行講解。

概述

猜數遊戲是一個很經典的例子,要開發一個完整的猜數遊戲,需要用到編程中的變數、循環、分支,獲取用戶輸入等基本知識,還要對邏輯運算有一定的了解。

本文將會帶領大家實現這樣一個小遊戲,遊戲開始後,讓用戶猜數字,如果數字大於或者小於目標數字將會給出提示,如果猜對了就讓用戶選擇是否繼續玩兒下去,如果選擇繼續,開始新一輪遊戲;否則遊戲結束;同時用戶每猜對一次得5分。

當然還可以更加複雜比如加入時間限制,因為複雜度高一些就不用了。

分解

其實各國在中小學引入編程教育,更多的是讓孩子們從以計算機的方式來考慮問題,培養邏輯思維能力和編程思維,並非是要把所有人都培養成程序員。

編程思維是一個非常重要的概念,含義是將以大的問題分解問小的問題,然後逐步解決每個小問題,最後解決整個問題。

在谷歌教育的公開課中有關於編程思維的詳細論述,感興趣的老師可以去看一下,當然我自己也只是看了個開頭,畢竟推薦讀書的人有時候未必然是讀書的人嘛,但是我知道這是個好東西。

那麼我們就把這個任務分解為以下步驟:

  1. 用一個變數了保存用戶的積分
  2. 生成目標數,在猜數遊戲中目標應該是隨機的,同時保存在變數中
  3. 提示用戶猜測數字,獲取用戶輸入,並保存在變數中
  4. 判斷用戶輸入,給出適當的反饋
  5. 如果用戶猜對了,加5分,詢問是否繼續
  6. 如果用戶選擇繼續,重複1-5步;否則遊戲結束

下面我們按照這個思路來實現這個程序

具體實現

積分變數

首先我們要新建一個變數,保存分數,並且初始化為0分

新建score變數

講變數值設置為9

從現在開始我們就要感受到python的簡潔之美了,在scratch我們新建積分變數並設定為0,需要好幾步操作,而在python中只需要一句命令就好了

score = 0

這也是高級語言的特點,Python作為高級語言,代碼量可以說是Java的十分之一,c語言的百分之一;當然對於初學者來說還是是誠然比較容易理解

聲明積分變數之後,我們就要生成要猜測的目標數字了.

生成目標數字

目標數字是個隨機數,是一定範圍之內的隨機數,所以我們先來看Scratch和Python都是怎麼生成隨機數的

Scratch隨機數積木塊

這次Python就需要費點腦筋了,Python有許多別人寫好的完成特定功能的代碼,成為代碼庫,生成隨機數的代碼庫叫做random,換句話說我們要用生成隨機數的功能,就需要引入random庫,然後庫中有函數,調用對應的函數就可以完成相應的功能

我們要用到的是randomint()函數,比如生成1-10的隨機整數就是randomint(1, 10)

好,背景交代完畢,下面我們就上手來實現生成隨機數

target變數

然後把target的值設定為1到10之間的隨機數

接下來,我們看Python是如何實現的

import randomscore = 0target = random.randint(1, 10)print(score, target)

Python的實現

現在,積分變數也有了,也生成要猜測的數字了,接下來就要提示用戶猜數字了,用戶不輸入數字也就沒得玩了,不過似乎可以寫一個猜數的機器人,用隨機數來猜測,這又是另外一個程序了

獲取用戶輸入

我們還是以Scratch為例進行講解,在Scratch獲取用戶輸入要用到偵測代碼分類中共的兩個代碼塊

得到用戶的輸入

獲取用戶輸入

當然我們需要新建一個變數,並把用戶的回到放到這個變數里

獲取用戶輸入

而Python中則要用到input()函數,但是有一點要注意的是,input()函數讀入的數據的類型是字元串類型,需要轉換成整數,而將字元串轉換為整數要用到int()函數,當然一個嚴格程序這裡還需要對輸入進行驗證的,這個等你熟悉了Python之後可以自行完成.

import randomscore = 0target = random.randint(1, 10)print(score, target)guess_number = int(input(請輸入你要猜的數字:))

判斷用戶輸入對錯

在這裡我們就要用到分支結構了,所謂分支結構簡單的來說就是滿足某個條件的時候做某個事情,比如你高考分數大於700,只要你運氣不是特別被,長得不是特別丑,也不作死基本就能去北大清華了;而如果天氣預報說明天下雨的話,十有八九你是會選擇帶傘出門的,畢竟有的人喜歡淋雨不是.

這裡我們就要進行判斷,如果用戶輸入的大於目標數,就提示大了,否則提示小了,這裡要用到控制模塊中的分支模塊

分支模塊

同時還會用到數字和邏輯運算分類中的比大小

比大小

這裡涉及了邏輯運算和分支結構兩個知識點,大家還記得嗎?

猜數程序結構

這樣,用戶第一次輸入的時候,會判斷用戶輸入的數也就是猜的數跟目標數字孰大孰小,如果大了就會提示大了,如果相等就恭喜,如果小了,就提示你猜的數太小了,問題是實際猜測中很難一次就猜中的,所以我們需要反覆不停的猜測,如果猜錯了就要重新獲取用戶的輸入,一直到猜對

不停猜測知道猜對

不能往下講了,再往下就要用到循環了,循環猜測的過程,我們先不講,回過頭來講python如何實現這一步

首先Python的語法呢,比較有意思,沒有萬惡的大括弧,但是有固定的縮寫,雖然tab黨和空格黨有一場世紀之戰,但是作為空格的擁泵,大家跟我一樣用空格就好了.Python中if語句的格式是

if expr: passelse: pass

注意到了嗎,expr和else後面的語句是有四個空格的,同時:冒號是必不可少的,expr代表的是邏輯表達式,關於邏輯表達式呢,隨便找一本關於編程的書都能夠講個五六七八頁,簡單的說就是大小相等的判斷,這裡呢就是判斷我們猜的數和目標數的大小

import randomscore = 0target = random.randint(1, 10)print(score, target)guess_number = int(input(請輸入你要猜的數字:))if guess_number > target: print(too big)elif guess_number = target: print(right)else: print(too small)guess_number = int(input(請輸入你要猜的數字:))

猜數字

細心的同學們可能注意到了,我用到的判斷和上面說的不一樣啊,雖然不一樣,也差不多啊,想想有什麼不一樣,有什麼一樣呢?寫了這麼多怪累的,就不詳細說了.

這個時候已經可以猜數了,但是只有一次機會,一次之後即便你讀取了用戶猜的數字,你也沒有反饋的機會了,這樣的遊戲肯定是不完整的,雜么辦呢?

循環

日常生活中,我們會說把課文抄10遍,我們就知道需要重複執行抄課文10次,那麼在Scratch是有循環的結構的

重複執行

當然如果你想限制猜測的次數可以用這個,如果在規定的次數內沒有猜到,就扣分,這也很可以,然而這裡我想做的是讓用戶不停的猜測直到猜對為止.

比如隔壁村的王二狗跟俺們村的李翠花約定,在湖邊見面,不見不散,那麼王二狗只能一個人孤零零的在湖邊等著,直到俺們村的李翠花到了湖邊,也就是說只有滿足了某個條件,才會執行,在這裡,就是重複執行,直到猜對了,或者說在沒有猜對的情況下,會讓玩家一直猜猜猜.

重複執行直到

好,接下來我們繼續完善我們的程序

看看上面的程序,我們做了改動,用戶第一次猜測之後,就會判斷guess_number與target是否相等,如果不相等,就會進入裡面的判斷,判斷結束後引導用戶再猜,直到猜對為止.

改動之後的程序

我對程序做了一些修改,改動了哪裡?為什麼?這個程序是否可以繼續優化呢?


這裡是分割線,思考上述問題5分鐘.

然後我們來看Python要怎麼做:

這裡用到了while循環,只要條件成立,就一直做

while expr: pass

下面是代碼

import randomscore = 0target = random.randint(1, 10)print(score, target)guess_number = int(input(請輸入你要猜的數字:))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(請輸入你要猜的數字:))print(恭喜你蒙對了)

程序運行結果

判斷用戶是否繼續玩

這裡就要再次詢問用戶,到這裡呢,其實基本的功能已經完成了,後面完善成為完整的猜數遊戲呢,還是要用到循環,重複執行某些步驟,然後就是給得分變數賦值,你能猜到怎麼做嗎?

歡迎大家投稿,過幾天我公布答案.

推薦閱讀:

創意計算|2018,一個基礎五大主題
少兒編程——教育領域的新藍海
據說有編程思維的孩子,運氣都不會太差!
少兒編程培訓到底應該是大眾普及教育, 還是精英教育
什麼是少兒編程教育

TAG:兒童編程 | 少兒編程 | Python入門 |