python入門_猜數字遊戲
題目要求:
根據現實生活中的猜數字遊戲的遊戲規則,運用Python語言模擬實現猜數字遊戲的的基本功能,請學員們參考真實的猜數字遊戲規則和如下的程式執行效果圖進行程式碼編寫,以實現“數字猜猜猜”小遊戲的基本功能。遊戲規則介紹如下:
1、玩家根據提示進行數字區間起始位置和終止位置的輸入
2、依據 1 中輸入的數字區間,產生該區間內一個隨機數,用於進行猜測比對的終值
3、提示使用者輸入所猜測的數字,與 2 中產生的隨機數字進行比對,並將相應的資訊寫入指定的日誌檔案(日誌檔名稱:record.txt;日誌檔案路徑:與.py檔案處於同一級目錄)
4、依據 3 中的比對結果。若兩者不等,列印友好提示,重複 3、4 步驟;若兩者相等,則退出該函式,執行下列語句
5、當猜測的值不在指定區間內時,不需要統計次數和記錄
6、列印如效果圖所示,用以提示遊戲結束的資訊
執行效果圖:
(1)成功執行效果圖:
(2)輸入區間起始值和區間終止值相等效果圖:
(3)輸入區間起始值大於區間終止值效果圖:
(4)輸入區間起始值和終止值為非數字字元效果圖:
任務描述
一、語言和環境
1、實現語言:Python語言
2、版本:Python3.6或Python3.6以上版本
3、環境要求及開發工具:Pycharm
二、程式整體要求
1、劃分功能模組,日誌檔案用以進行遊戲過程中資訊記錄,主程式用以進行程式碼編寫
2、函式的定義要清楚易懂,程式碼結構要層次分明,程式碼中可新增必要的註釋
3、程式中的函式名、變數名、引數名稱要符合命名規範
4、程式執行效果與提供的頁面效果圖、結構保持一致,提示中的分隔符(“*”)數量不做統一要求,文字大小、背景色也不做統一要求
5、將作業專案形成壓縮檔案並提交
三、思路分析:
由題目要求和執行效果,可分析出專案劃分為兩大模組:mooc_test.py和record.txt
前者主要完成遊戲後臺邏輯的控制,並進行如效果圖所示的功能點的補充(要求編碼時注意函式抽取思想的應用):
1、自定義遊戲進入提示函式guide_page(guide_word):
功能描述:提示玩家進入遊戲,並輸出如效果圖示題的所示資訊, 要求:
(1)設定引數guide_word,記錄要輸出的標題文字資訊
(2)運用字串的格式化函式(format),拼接“*”號和標題文字資訊
(3)符合程式執行效果圖中標題的樣式進行輸出(注:“*”號的數量不作統一限制)
2、自定義數字型別判斷函式all_num(n):
功能描述:判斷指定的值是否為數字,要求:
(1)設定引數n接收用於進行判定的變數的值
(2)運用isdigit( )方法進行判定並返回其判定結果
3、自定義數值合法性判定函式num_legal(ls):
功能描述:判定指定序列中的數值是否相等以及記錄數字區間起始位置的值是否大於記錄數字區間終止位置的值,要求:
(1)設定列表型別的引數用於接收指定的序列
(2)取出序列中的值並進行比較:
若兩者相等,則退出程式,並提示玩家重新啟動程式;
若表示數字區間起始位置的值大於數字區間終止位置的值,則退出程式,並提示玩家重新啟動程式;
反之,則返回值為1
注意:匯入sys模組,sys.exit()即退出程式
4、自定義產生指定區間隨機數函式set_final_num(num1,num2):
功能描述:根據引數值,產生一個位於引數值區間以內的隨機數, 要求:
(1)設定兩個引數用於接收使用者所輸入區間的起始值和終止值,並將其儲存至列表中
(2)利用內建函式filter()及思路分析2中的all_num(n)過濾以確保輸入值全部為數字
(3)依據(2)中過濾後的返回值進行判斷,若全部為數字,則呼叫自定義的等值判斷函式,判斷輸入值是否相等,並根據判斷之後的返回值,輸出使用者產生隨機數的區間,並運用random模組,返回產生區間內的隨機數;反之則提示玩家所輸入的為非數字字元,請重新啟動
5、自定義核查數值是否屬於指定區間函式check_num_legal(num):
功能描述:判定所輸入的數值是否在指定的區間
要求:依據輸入的數字區間起始值和終止值,利用條件語句判斷輸入數值是否在指定區間,若不在該區間內,則提示玩家所輸入的數字未在指定區間
6、自定義日誌寫入函式write_record(times,value):
功能描述:將玩家每一次猜測數字和本次猜測次數兩項資訊寫入日誌檔案,要求:
(1)設定引數接收玩家猜測的次數(times)和本次猜測的具體數字(value)
(2)根據datetime模組獲取玩家進行每一次猜測數字輸入的時間
(3)使用with語法操作日誌檔案,將獲取到的引數和時間資訊以追加方式寫入日誌檔案
7、自定義main(rand1)函式:
功能描述:依據所產生的隨機數字(rand1),提示玩家輸入猜測數字並進行比對直到猜測到正確數字, 要求:
(1)設定變數temp接收已產生的隨機數字,記錄猜測數字的次數(預設為0)
(2)設定無限迴圈:
1.提示使用者輸入所猜測數字,並轉換為int型別
2.if判斷核查數值函式,如果為真,則輸出對不起您輸入的數字未在指定區間!!!,跳過本次迴圈
3.實現使用者輸入一次猜測數字,次數+1
4.呼叫日誌寫入函式,傳入猜測的次數和使用者猜測的數字
5.當猜測的值不在指定區間內時,不需要統計次數和記錄
6.使用if語句判斷使用者猜測的數字,相等,大於,小於的情況,並輸出如效果圖所示的提示資訊
8、控制程式邏輯執行流程(if __name__ == '__main__':):
功能描述:依據效果圖,呼叫自定義函式實現對應的功能
要求:
(1)呼叫guide_page( )輸出如效果圖所示的標題資訊
(2)設定兩個變數(i,j)分別接收使用者輸入數字區間的起始值和終止值
(3)呼叫set_final_num( )函式得到隨機數
(4)呼叫main( )執行程式流程
注意:根據“數字猜猜猜”遊戲的整體思路,控制程式的執行流程,記錄玩家每一次遊戲的資料資訊(日誌寫入函式的資訊格式),效果如下:
評分標準是什麼?
一、規範【5分】
1、作業所涉及的所有方法都封裝在"mooc_test.py"檔案中
2、程式碼中寫入的日誌檔案的命名為record.txt
3、程式碼結構要層次分明
4、Python程式碼規範及新增適量註釋
二、程式整體執行效果【8分】
程式正常執行效果,且滿足效果圖要求。資訊間分隔符“*”號數量不做統一要求
三、自定義星(*)號展示函式【5分】
根據執行效果設定‘數字猜猜猜’遊戲執行啟動提示資訊
四、自定義核查某數值是否屬於指定區間函式【6分】
設定引數接收使用者所輸入的資料並判定其是否屬於區間起始值和區間終止值之間
五、自定義數值合法性判定函式【9分】
根據獲取的列表型別引數加以判斷該引數中的2個值是否相等或區間起始值是否大於終止值
六、自定義數字型別判定函式【6分】
正確運用內建函式isdigit()判斷指定資料是否為python中的數值型別
七、自定義日誌寫入函式【11分】
根據每一次所輸入的遊戲猜測數字、猜數字的具體次數將這兩項資訊寫入指定的日誌檔案
注:日誌檔名稱:record.txt,日誌檔案路徑:與.py檔案處於同一目錄下
八、自定義產生指定區間隨機數函式【20分】
根據輸入的區間起始值和終止值,設定一個隨機數以供玩家進行猜測
具體功能如下:
(1)利用內建函式filter()過濾以確保輸入值為數字
(2)若過濾的終值全部為數字,則呼叫自定義函式判斷輸入值是否合法並運用random模組,產生區間內的隨機數
(3)若過濾的終值不是數字,則提示使用者輸入的字元為非數字字元,重新啟動程式
九、自定義main()函式【20分】
依據產生的隨機數提示玩家進行輸入所猜測的具體數字並進行判斷。若輸入的猜測數字與產生的隨機數相等嗎,則返回本次遊戲共猜測了多少次;反之,則迴圈輸入所猜測的數字,重複以上步驟。
十、控制程式邏輯執行流程【10分】
根據“數字猜猜猜”遊戲的整體思路,控制程式的執行流程,並在遊戲開始和結尾進行如效果圖所示的友好提示
主程式 2020年第一次寫
import random import sys from datetime import datetime def guide_page(): """ 功能描述: 提示玩家進入遊戲,並輸出如效果圖示題的所示資訊, 要求: (1)設定引數guide_word,記錄要輸出的標題文字資訊 (2)運用字串的格式化函式(format),拼接“*”號和標題文字資訊 (3)符合程式執行效果圖中標題的樣式進行輸出(注:“*”號的數量不作統一限制) """ str_ = "*"*15 content = "歡迎進入數字猜猜猜小遊戲" str_print = str_ + content + str_ print (str_print) def all_num(n): """ 功能描述:判斷指定的值是否為數字,要求: (1)設定引數n接收用於進行判定的變數的值 (2)運用isdigit( )方法進行判定並返回其判定結果 """ return n.isdigit() def num_legal(ls): """ 功能描述:判定指定序列中的數值是否相等以及記錄數字區間起始位置的值是否大於記錄數字區間終止位置的值,要求: (1)設定列表型別的引數用於接收指定的序列 (2)取出序列中的值並進行比較: 若兩者相等,則退出程式,並提示玩家重新啟動程式; 若表示數字區間起始位置的值大於數字區間終止位置的值,則退出程式,並提示玩家重新啟動程式; 反之,則返回值為1 """ if ls[0] == ls[1]: print("您輸入的區間數字相同!!請重新啟動程式") sys.exit() elif ls[0] > ls[1]: print("您輸入的區間大小有誤!!請重新啟動程式") sys.exit() else: return 1 def set_final_num(num1,num2): """ 功能描述:根據引數值,產生一個位於引數值區間以內的隨機數,要求: (1)設定兩個引數用於接收使用者所輸入區間的起始值和終止值,並將其儲存至列表中 (2)利用內建函式filter()及思路分析2中的all_num(n)過濾以確保輸入值全部為數字 (3)依據(2)中過濾後的返回值進行判斷,若全部為數字,則呼叫自定義的等值判斷函式, 判斷輸入值是否相等,並根據判斷之後的返回值,輸出使用者產生隨機數的區間, 並運用random模組,返回產生區間內的隨機數;反之則提示玩家所輸入的為非數字字元,請重新啟動 """ all_numb = [num1, num2] list_new = list(filter(all_num,all_numb)) if len(list_new) == 2: list_new2 = list(map(lambda n:int(n),list_new)) rest = num_legal(list_new2) if rest == 1: result = random.randint(list_new2[0],list_new2[1]) return result else: print("您所輸入的為非數字字元!!請重新啟動程式。") sys.exit() else: print("您所輸入的為非數字字元!!請重新啟動程式。") sys.exit() def check_num_legal(num): """ 功能描述:判定所輸入的數值是否在指定的區間 要求:依據輸入的數字區間起始值和終止值,利用條件語句判斷輸入數值是否在指定區間, 若不在該區間內,則提示玩家所輸入的數字未在指定區間 """ if ls[0] <= num <= ls[1]: return 1 else: return "所輸入的數字未在指定區間" def write_record(times,value): """ 功能描述:將玩家每一次猜測數字和本次猜測次數兩項資訊寫入日誌檔案,要求: (1)設定引數接收玩家猜測的次數(times)和本次猜測的具體數字(value) (2)根據datetime模組獲取玩家進行每一次猜測數字輸入的時間 (3)使用with語法操作日誌檔案,將獲取到的引數和時間資訊以追加方式寫入日誌檔案""" datetime_ = datetime.now() date_ = datetime_.date() time_ = datetime_.time() rest = "{0} {1}: 第{2}次您猜測的數字為:{3}".format(date_, time_, times, value) file_name = "record.txt" with open(file_name, "a",encoding="utf-8") as f: f.write(rest) f.write("\n") # return def main(rand1): """ 功能描述:依據所產生的隨機數字(rand1),提示玩家輸入猜測數字並進行比對直到猜測到正確數字, 要求: (1)設定變數temp接收已產生的隨機數字,記錄猜測數字的次數(預設為0) (2)設定無限迴圈: 1.提示使用者輸入所猜測數字,並轉換為int型別 2.if判斷核查數值函式,如果為真,則輸出對不起您輸入的數字未在指定區間!!!,跳過本次迴圈 3.實現使用者輸入一次猜測數字,次數+1 4.呼叫日誌寫入函式,傳入猜測的次數和使用者猜測的數字 5.使用if語句判斷使用者猜測的數字,相等,大於,小於的情況,並輸出如效果圖所示的提示資訊 """ temp = rand1 count = 0 while True: num_guess = input("請輸入您猜測的數字:") print("************") is_num = all_num(num_guess) if is_num == True: num_guess = int(num_guess) num_check = check_num_legal(num_guess) if num_check != 1: print("對不起您輸入的數字未在指定區間!!!") continue count += 1 write_record(count,num_guess) if num_guess == temp: str_win = "恭喜您!只用了{0}次就贏得了遊戲".format(count) print(str_win) break elif num_guess < temp: str_Lower = "Lower than the answer" print(str_Lower) elif num_guess > temp: str_Highter = "Higher than the answer" print(str_Highter) else: print("對不起您輸入的不是一個數字") if __name__ == "__main__": """ 功能描述:依據效果圖,呼叫自定義函式實現對應的功能 要求: (1)呼叫guide_page( )輸出如效果圖所示的標題資訊 (2)設定兩個變數(i,j)分別接收使用者輸入數字區間的起始值和終止值 (3)呼叫set_final_num( )函式得到隨機數 (4)呼叫main( )執行程式流程 注意:根據“數字猜猜猜”遊戲的整體思路,控制程式的執行流程, 記錄玩家每一次遊戲的資料資訊(日誌寫入函式的資訊格式) """ guide_page() i = input("數字區間起始值:") j = input("數字區間終止值:") num_random = set_final_num(i, j) ls = [i, j] rst= num_legal(ls) if rst == 1: str_rage = "所產生的隨機數字區間為:['{0}','{1}']".format(i, j) print(str_rage) i = int(i) j = int(j) ls = [i, j] main(num_random) print("END")
主程式 2021年12月重寫
from datetime import datetime import random import sys from guessNumberGame import constants def guide_page(): """ 功能描述: 提示玩家進入遊戲,並輸出如效果圖示題的所示資訊, 要求: (1)設定引數guide_word,記錄要輸出的標題文字資訊 (2)運用字串的格式化函式(format),拼接“*”號和標題文字資訊 (3)符合程式執行效果圖中標題的樣式進行輸出(注:“*”號的數量不作統一限制) """ str = 20 * '*' print(str + constants.GUIDE_WORD + str) def all_num(n): """ 功能描述:判斷指定的值是否為數字,要求: (1)設定引數n接收用於進行判定的變數的值 (2)運用isdigit( )方法進行判定並返回其判定結果 """ rest = str.isdigit(n) return rest def num_legal(ls): """ 功能描述:判定指定序列中的數值是否相等以及記錄數字區間起始位置的值是否大於記錄數字區間終止位置的值,要求: (1)設定列表型別的引數用於接收指定的序列 (2)取出序列中的值並進行比較: 若兩者相等,則退出程式,並提示玩家重新啟動程式; 若表示數字區間起始位置的值大於數字區間終止位置的值,則退出程式,並提示玩家重新啟動程式; 反之,則返回值為1 """ if ls[0] == ls[1]: print(constants.EQUAL_AGAIN_WORD) sys.exit() elif ls[0] > ls[1]: print(constants.REVERSE_AGAIN_WORD) sys.exit() else: return 1 def set_final_num(num1,num2): """ 功能描述:根據引數值,產生一個位於引數值區間以內的隨機數,要求: (1)設定兩個引數用於接收使用者所輸入區間的起始值和終止值,並將其儲存至列表中 (2)利用內建函式filter()及思路分析2中的all_num(n)過濾以確保輸入值全部為數字 (3)依據(2)中過濾後的返回值進行判斷,若全部為數字,則呼叫自定義的等值判斷函式, 判斷輸入值是否相等,並根據判斷之後的返回值,輸出使用者產生隨機數的區間, 並運用random模組,返回產生區間內的隨機數;反之則提示玩家所輸入的為非數字字元,請重新啟動 """ list_str = [num1, num2] list_1 = list(filter(all_num,list_str)) if len(list_1) == 2: legal_rest = num_legal(list_1) if legal_rest == 1: num1 = int(num1) num2 = int(num2) random_num = random.randint(num1,num2) print(random_num) return random_num else: print(constants.STR_AG_WORD) sys.exit() def check_num_legal(num): """ 功能描述:判定所輸入的數值是否在指定的區間 要求:依據輸入的數字區間起始值和終止值,利用條件語句判斷輸入數值是否在指定區間, 若不在該區間內,則提示玩家所輸入的數字未在指定區間 """ if list_input[0] <= num <= list_input[1]: return 1 else: return 0 def write_record(times, value): """ 功能描述:將玩家每一次猜測數字和本次猜測次數兩項資訊寫入日誌檔案,要求: (1)設定引數接收玩家猜測的次數(times)和本次猜測的具體數字(value) (2)根據datetime模組獲取玩家進行每一次猜測數字輸入的時間 (3)使用with語法操作日誌檔案,將獲取到的引數和時間資訊以追加方式寫入日誌檔案 :param times: 當前時間 :param value: 猜測的數字 """ file_name = 'record.txt' datetimenow_ = datetime.now() date_ = datetimenow_.date() time_ = datetimenow_.time() write_str = '{date}{time}:第{times}次您猜測的數字為:{value}'.format(date = date_, time = time_, times = times, value = value) with open(file_name,'a',encoding='utf-8') as f: f.write(write_str) f.write('\n') def writ_n_record(): """每次遊戲結束後,在日誌中換行""" file_name = 'record.txt' with open(file_name, 'a', encoding='utf-8') as f: f.write('\n') def main(rand1): """ 功能描述:依據所產生的隨機數字(rand1),提示玩家輸入猜測數字並進行比對直到猜測到正確數字, 要求: (1)設定變數temp接收已產生的隨機數字,記錄猜測數字的次數(預設為0) (2)設定無限迴圈: 1.提示使用者輸入所猜測數字,並轉換為int型別 2.if判斷核查數值函式,如果為真,則輸出對不起您輸入的數字未在指定區間!!!,跳過本次迴圈 3.實現使用者輸入一次猜測數字,次數+1 4.呼叫日誌寫入函式,傳入猜測的次數和使用者猜測的數字 5.使用if語句判斷使用者猜測的數字,相等,大於,小於的情況,並輸出如效果圖所示的提示資訊 """ temp = 0 count = 0 while(True): #第一次猜測時,顯示請猜測數字 if count <= 0: temp = input(constants.GUESS_WORD) #大於第一次猜測時,顯示請繼續猜測數字 else: temp = input(constants.GUESS_AG_WORD) #判斷猜測的數是否是數值 if all_num(temp): temp = int(temp) else: print(constants.STR_AG_WORD) continue if check_num_legal(temp) == 1: count += 1 times = count value = temp write_record(times, value) if temp > rand1: print(30 * '*') print(constants.HIGHT_WORD) continue elif temp < rand1: print(30 * '*') print(constants.LOWER_WORD) continue else: end_print = '恭喜您!只用了{}次就贏得了遊戲'.format(count) print(end_print) writ_n_record() break else: print(constants.LIMITS_ERR_WORD) continue __name__ = '__main__' """ 功能描述:依據效果圖,呼叫自定義函式實現對應的功能 要求: (1)呼叫guide_page( )輸出如效果圖所示的標題資訊 (2)設定兩個變數(i,j)分別接收使用者輸入數字區間的起始值和終止值 (3)呼叫set_final_num( )函式得到隨機數 (4)呼叫main( )執行程式流程 注意:根據“數字猜猜猜”遊戲的整體思路,控制程式的執行流程, 記錄玩家每一次遊戲的資料資訊(日誌寫入函式的資訊格式) """ guide_page() i = input(constants.NUM1_WORD) j = input(constants.NUM2_WORD) rand_num = set_final_num(i, j) i = int(i) j = int(j) list_input = [i, j] region_str = constants.REGION_WORD + '{}'.format(list_input) print(region_str) main(rand_num) print("END")
constants.py 常量
#文字資訊 GUIDE_WORD = '歡迎進入數字猜猜猜小遊戲' EQUAL_AGAIN_WORD = '您輸入區間數字相同!!請重新啟動程式' REVERSE_AGAIN_WORD = '您輸入區間數字大小有誤!!請重新啟動程式' STR_AG_WORD = '您所輸入的為非數字字元,請重新啟動!' NUM1_WORD = '數字區間起始值:' NUM2_WORD = '數字區間終止值:' REGION_WORD = '所產生的隨機數區間為:' GUESS_WORD = '請輸入您猜測的數字:' GUESS_AG_WORD = '請繼續輸入您猜測的數字:' HIGHT_WORD = 'lower than the answer' LOWER_WORD = 'hight than the answer' LIMITS_ERR_WORD = '對不起您輸入的數字未在指定區間'
總結:
1、該程式知識點 模組的呼叫、datetime模組呼叫、函式的應用、檔案讀寫、filter函式應用、 if巢狀、迴圈
2、第二次寫比第一次更完善,加入了常量表(但是命名用起來很雞肋),提示功能和日誌功能有了部分優化。但是第二次寫沒有了第一次的註釋和“初心”,需要保持
3、熟練度還不夠,經常卡殼,還需要加強知識的熟練程度