學python也有一段時間,一些基礎知識總是忘記,今天突然來了興趣,打算用基礎知識寫一個小小的文字游戲,也算是復習了
這個游戲是前幾天在網上看到一個練習題,叫做數字猜猜猜;
規則如下:
1、玩家根據提示進行數字區間起始位置和終止位置的輸入
2、依據 1 中輸入的數字區間,產生該區間內一個隨機數,用於進行猜測比對的終值
3、提示用戶輸入所猜測的數字,與 2 中產生的隨機數字進行比對
4、依據 3 中的比對結果。若兩者不等,打印友好提示,重復 3、4 步驟;若兩者相等,則退出該函數,執行下列語句
5、當猜測的值不在指定區間內時,不需要統計次數和記錄
好,那我們現在開始!
整理下思路:
1、 划分功能模塊,日志文件用以進行游戲過程中信息記錄,主程序用以進行代碼編寫
2、 函數的定義要清楚易懂,代碼結構要層次分明
第一步:
自定義游戲進入提示函數guide_page(guide_word):
功能描述: 提示玩家進入游戲,並輸出信息,:
(1)設置參數guide_word,記錄要輸出的標題文字信息
(2)運用字符串的格式化函數(format),拼接“*”號和標題文字信息
# 游戲進入提示函數 def guide_page(guide_word): print('{}{}{}'.format("*" * 50, guide_word, "*" * 50))
第二步:
自定義數字類型判斷函數all_num(n):
功能描述:判斷指定的值是否為數字,要求:
(1)設置參數n接收用於進行判定的變量的值
(2)運用isdigit( )方法進行判定並返回其判定結果
def all_num(n): if not n.isdigit(): print("您輸入的為非數字字符,請重新啟動!") sys.exit(2) return True
第三步:
自定義數值合法性判定函數num_legal(ls):
功能描述:判定指定序列中的數值是否相等以及記錄數字區間起始位置的值是否大於記錄數字區間終止位置的值,要求:
(1)設置列表類型的參數用於接收指定的序列
(2)取出序列中的值並進行比較:
若兩者相等,則退出程序,並提示玩家重新啟動程序;
若表示數字區間起始位置的值大於數字區間終止位置的值,則退出程序,並提示玩家重新啟動程序;
# 數值合法性判定函數 def num_legal(ls): if int(ls[0]) == int(ls[1]): print('您輸入的數字區間大小相同!!請重新啟動程序。') sys.exit(3) elif int(ls[0]) > int(ls[1]): print('您輸入的數字區間大小有誤!!請重新啟動程序。') sys.exit(3) else: return 1
第四步:
自定義產生指定區間隨機數函數set_final_num(num1,num2):
功能描述:根據參數值,產生一個位於參數值區間以內的隨機數, 要求:
(1)設置兩個參數用於接收用戶所輸入區間的起始值和終止值,並將其保存至列表中
(2)利用內置函數filter()及思路分析2中的all_num(n)過濾以確保輸入值全部為數字
(3)依據(2)中過濾后的返回值進行判斷,若全部為數字,則調用自定義的等值判斷函數,判斷輸入值是否相等,並根據判斷之后的返回值,輸出用戶產生隨機數的區間,並運用random模塊,返回產生區間內的隨機數;反之則提示玩家所輸入的為非數字字符,請重新啟動
# 產生指定區間隨機數函數 def set_final_num(num1, num2): lst = [num1, num2] result = list(filter(all_num, lst)) int_result = [] random_value = None for s in result: int_result.append(int(s)) print('所產生的隨機數字區間為%s' % int_result) if num_legal(int_result) == 1: random_value = random.randint(int_result[0], int_result[1]) return random_value, int_result
第五步:
自定義核查數值是否屬於指定區間函數check_num_legal(num):
功能描述:判定所輸入的數值是否在指定的區間
# 核查數值是否屬於指定區間函數 def check_num_legal(num): if num[2] in range(num[1][0], num[1][1] + 1): return True elif num[2] not in range(num[1][0], num[1][1] + 1): print("對不起您輸入的數字未在指定區間!!!") return False
第六步:
自定義日志寫入函數write_record(times,value):
功能描述:將玩家每一次猜測數字和本次猜測次數兩項信息寫入日志文件,要求:
(1)設置參數接收玩家猜測的次數(times)和本次猜測的具體數字(value**)**
(2)根據datetime模塊獲取玩家進行每一次猜測數字輸入的時間
(3)使用with語法操作日志文件,將獲取到的參數和時間信息以追加方式寫入日志文件
# 日志寫入函數 def write_record(times, value): now = datetime.datetime.now() str_now = now.strftime('%Y-%m-%d %H:%M:%S') path = os.getcwd() log_path = os.path.join(path, 'log.txt') log_message = str_now + " 您第{}次猜測的數字為:{}".format(times, value) + "\n" with open(log_path, mode='a') as e: e.write(log_message)
第七步:
自定義main(rand1)函數:
功能描述:依據所產生的隨機數字(rand1),提示玩家輸入猜測數字並進行比對直到猜測到正確數字, 要求:
(1)設置變量temp接收已產生的隨機數字,記錄猜測數字的次數(默認為0)
(2)設置無限循環:
1.提示用戶輸入所猜測數字,並轉換為int類型
2.if判斷核查數值函數,如果為真,則輸出對不起您輸入的數字未在指定區間!!!,跳過本次循環
3.實現用戶輸入一次猜測數字,次數+1
4.調用日志寫入函數,傳入猜測的次數和用戶猜測的數字
5.當猜測的值不在指定區間內時,不需要統計次數和記錄
6.使用if語句判斷用戶猜測的數字,相等,大於,小於的情況,並輸出如效果圖所示的提示信息
# 啟動游戲的判斷邏輯 def main(rand1): total_times = 0 # 設置初始游戲次數 while True: game_num = input("請繼續輸入您猜測的數字:") rand1_list = list(rand1) # 把傳進來的rand1轉成list格式,以便后面添加 if all_num(game_num): # 判斷,如果game_num是由純數字組成的,就把game_num轉為int格式,然后把game_num添加到list里面,以便后面判斷區間使用 game_num = int(game_num) rand1_list.append(game_num) if not check_num_legal(rand1_list): # 把集合傳入到區間判斷函數 continue if check_num_legal(rand1_list): total_times += 1 write_record(times=total_times, value=rand1_list[2]) if game_num == rand1[0]: print('恭喜您!只用了%s次就贏得了游戲' % total_times) break elif game_num < rand1_list[0]: print("*" * 20, "\nLower than the answer") elif game_num > rand1_list[0]: print("*" * 20, "\nHigher than the answer")
ok,碼完了,讓我們測試一下
1.區間開始值大於結束值
2.區間開始值與結束值相等
3.開始或者結束值有非數字字符
4.輸入的猜測字符,不在設定的區間內
5.重復猜測,直到猜對
6.日志輸出
ok,完美運行!
附上完整的代碼:
有些地方寫的有些過於復雜,希望大佬給出牛逼的建議!
# coding:utf-8 import sys import random import datetime import os # 游戲進入提示函數 def guide_page(guide_word): print('{}{}{}'.format("*" * 50, guide_word, "*" * 50)) # 數字類型判斷函數 def all_num(n): if not n.isdigit(): print("您輸入的為非數字字符,請重新啟動!") sys.exit(2) return True # 數值合法性判定函數 def num_legal(ls): if int(ls[0]) == int(ls[1]): print('您輸入的數字區間大小相同!!請重新啟動程序。') sys.exit(3) elif int(ls[0]) > int(ls[1]): print('您輸入的數字區間大小有誤!!請重新啟動程序。') sys.exit(3) else: return 1 # 產生指定區間隨機數函數 def set_final_num(num1, num2): lst = [num1, num2] result = list(filter(all_num, lst)) int_result = [] random_value = None for s in result: int_result.append(int(s)) print('所產生的隨機數字區間為%s' % int_result) if num_legal(int_result) == 1: random_value = random.randint(int_result[0], int_result[1]) return random_value, int_result # 核查數值是否屬於指定區間函數 def check_num_legal(num): if num[2] in range(num[1][0], num[1][1] + 1): return True elif num[2] not in range(num[1][0], num[1][1] + 1): print("對不起您輸入的數字未在指定區間!!!") return False # 日志寫入函數 def write_record(times, value): now = datetime.datetime.now() str_now = now.strftime('%Y-%m-%d %H:%M:%S') path = os.getcwd() log_path = os.path.join(path, 'log.txt') log_message = str_now + " 您第{}次猜測的數字為:{}".format(times, value) + "\n" with open(log_path, mode='a') as e: e.write(log_message) # 啟動游戲的判斷邏輯 def main(rand1): total_times = 0 # 設置初始游戲次數 while True: game_num = input("請繼續輸入您猜測的數字:") rand1_list = list(rand1) # 把傳進來的rand1轉成list格式,以便后面添加 if all_num(game_num): # 判斷,如果game_num是由純數字組成的,就把game_num轉為int格式,然后把game_num添加到list里面,以便后面判斷區間使用 game_num = int(game_num) rand1_list.append(game_num) if not check_num_legal(rand1_list): # 把集合傳入到區間判斷函數 continue if check_num_legal(rand1_list): total_times += 1 write_record(times=total_times, value=rand1_list[2]) if game_num == rand1[0]: print('恭喜您!只用了%s次就贏得了游戲' % total_times) break elif game_num < rand1_list[0]: print("*" * 20, "\nLower than the answer") elif game_num > rand1_list[0]: print("*" * 20, "\nHigher than the answer") if __name__ == '__main__': guide_page("歡迎進入數字猜猜猜小游戲") i = input("請輸入數字區間起始值:") j = input("請輸入數字區間終止值:") a = set_final_num(i, j) # 因為set_final_num函數return了兩個值,所以此時的a是一個元組格式 main(rand1=a)