猜数字游戏开发
用游戏学编程,掌握核心概念
项目概述
游戏规则
- 计算机随机生成一个数字(如1-100)
- 玩家猜测数字
- 系统提示"太大"或"太小"
- 直到猜中为止,记录尝试次数
技能点
- 随机数生成
- 循环控制
- 条件判断
- 异常处理
- 函数封装
版本1:基础版
# guess_number_v1.py
"""猜数字游戏 - 基础版"""
import random
def play_game():
# 生成1-100的随机数
target = random.randint(1, 100)
attempts = 0
print("=" * 30)
print(" 猜数字游戏")
print(" 范围:1-100")
print("=" * 30)
while True:
try:
guess = int(input("\n请猜一个数字:"))
attempts += 1
if guess < target:
print("太小了!再试试")
elif guess > target:
print("太大了!再试试")
else:
print(f"\n恭喜你!猜对了!")
print(f"答案是 {target}")
print(f"你用了 {attempts} 次")
break
except ValueError:
print("请输入有效的数字!")
if __name__ == "__main__":
play_game()
版本2:增加难度选择
# guess_number_v2.py
"""猜数字游戏 - 难度选择版"""
import random
def get_difficulty():
"""选择难度"""
print("\n选择难度:")
print("1. 简单 (1-50)")
print("2. 中等 (1-100)")
print("3. 困难 (1-500)")
print("4. 地狱 (1-1000)")
while True:
choice = input("请选择(1-4):")
difficulties = {
"1": (50, "简单"),
"2": (100, "中等"),
"3": (500, "困难"),
"4": (1000, "地狱")
}
if choice in difficulties:
return difficulties[choice]
print("无效选择,请重新输入")
def play_game():
max_num, difficulty_name = get_difficulty()
target = random.randint(1, max_num)
attempts = 0
max_attempts = int(max_num ** 0.5) + 5 # 限制尝试次数
print(f"\n难度:{difficulty_name}")
print(f"范围:1-{max_num}")
print(f"最多尝试:{max_attempts}次")
print("-" * 30)
while attempts < max_attempts:
try:
guess = int(input(f"\n第{attempts + 1}次,请猜:"))
if guess < 1 or guess > max_num:
print(f"请输入1-{max_num}之间的数字")
continue
attempts += 1
if guess < target:
print("太小了!")
elif guess > target:
print("太大了!")
else:
print(f"\n🎉 恭喜你猜对了!答案是 {target}")
print(f"共尝试 {attempts} 次")
if attempts <= 5:
print("评价:太厉害了!")
elif attempts <= 10:
print("评价:不错!")
else:
print("评价:继续努力!")
return True
except ValueError:
print("请输入有效的数字!")
print(f"\n游戏结束!次数用尽")
print(f"正确答案是:{target}")
return False
def main():
print("=" * 40)
print(" 欢迎来到猜数字游戏")
print("=" * 40)
while True:
play_game()
play_again = input("\n再玩一局?(y/n):")
if play_again.lower() != 'y':
print("感谢游玩,再见!")
break
if __name__ == "__main__":
main()
版本3:增加记录和统计
# guess_number_v3.py
"""猜数字游戏 - 统计版"""
import random
import json
from datetime import datetime
class GuessNumberGame:
def __init__(self):
self.stats = {
"games_played": 0,
"games_won": 0,
"total_attempts": 0,
"best_score": float('inf'),
"history": []
}
self.load_stats()
def save_stats(self):
with open("game_stats.json", "w") as f:
json.dump(self.stats, f)
def load_stats(self):
try:
with open("game_stats.json", "r") as f:
self.stats = json.load(f)
except FileNotFoundError:
pass
def show_stats(self):
print("\n===== 游戏统计 =====")
print(f"总游戏局数:{self.stats['games_played']}")
print(f"获胜局数:{self.stats['games_won']}")
if self.stats['games_played'] > 0:
win_rate = self.stats['games_won'] / self.stats['games_played'] * 100
print(f"胜率:{win_rate:.1f}%")
if self.stats['best_score'] != float('inf'):
print(f"最佳成绩:{self.stats['best_score']}次")
if self.stats['games_won'] > 0:
avg = self.stats['total_attempts'] / self.stats['games_won']
print(f"平均尝试:{avg:.1f}次")
def play(self, max_num=100):
target = random.randint(1, max_num)
attempts = 0
print(f"\n开始游戏!范围:1-{max_num}")
while True:
try:
guess = int(input("你的猜测:"))
attempts += 1
if guess < target:
print("↑ 太小了")
elif guess > target:
print("↓ 太大了")
else:
print(f"\n✓ 正确!用了{attempts}次")
# 更新统计
self.stats['games_played'] += 1
self.stats['games_won'] += 1
self.stats['total_attempts'] += attempts
if attempts < self.stats['best_score']:
self.stats['best_score'] = attempts
print("★ 新纪录!")
self.stats['history'].append({
"date": datetime.now().strftime("%Y-%m-%d %H:%M"),
"attempts": attempts,
"range": max_num
})
self.save_stats()
return True
except ValueError:
print("请输入数字!")
def main_menu(self):
while True:
print("\n===== 猜数字游戏 =====")
print("1. 开始游戏")
print("2. 选择难度")
print("3. 查看统计")
print("4. 退出")
choice = input("请选择:")
if choice == "1":
self.play()
elif choice == "2":
print("1.简单(1-50) 2.中等(1-100) 3.困难(1-500)")
d = input("选择难度:")
ranges = {"1": 50, "2": 100, "3": 500}
self.play(ranges.get(d, 100))
elif choice == "3":
self.show_stats()
elif choice == "4":
print("再见!")
break
if __name__ == "__main__":
game = GuessNumberGame()
game.main_menu()
版本4:二分法AI提示
# guess_number_v4.py
"""猜数字游戏 - AI提示版"""
import random
def binary_search_hint(low, high, target, guess):
"""给出二分法提示"""
optimal = (low + high) // 2
if guess < target:
new_low = guess + 1
new_optimal = (new_low + high) // 2
return f"提示:试试{new_optimal}附近"
else:
new_high = guess - 1
new_optimal = (low + new_high) // 2
return f"提示:试试{new_optimal}附近"
def play_with_hints():
max_num = 100
target = random.randint(1, max_num)
low, high = 1, max_num
attempts = 0
hints_used = 0
print(f"范围:{low}-{high}")
print("输入'h'获取提示")
while True:
user_input = input("猜测:").strip().lower()
if user_input == 'h':
optimal = (low + high) // 2
print(f"💡 最佳猜测:{optimal}")
hints_used += 1
continue
try:
guess = int(user_input)
attempts += 1
if guess < target:
low = guess + 1
print(f"太小!范围缩小到 {low}-{high}")
elif guess > target:
high = guess - 1
print(f"太大!范围缩小到 {low}-{high}")
else:
print(f"\n🎉 猜对了!用了{attempts}次,提示{hints_used}次")
optimal_attempts = len(bin(max_num)) - 2
print(f"(最优解法只需{optimal_attempts}次)")
break
except ValueError:
print("请输入数字或'h'")
if __name__ == "__main__":
play_with_hints()
扩展挑战
反向游戏:电脑猜你的数
def computer_guesses():
"""电脑猜你心里的数字"""
print("想一个1-100的数字,我来猜!")
print("回复:'大'/'小'/'对'")
low, high = 1, 100
attempts = 0
while low <= high:
guess = (low + high) // 2
attempts += 1
print(f"\n我猜 {guess}")
response = input("(大/小/对):").strip()
if response == "对":
print(f"我猜对了!用了{attempts}次")
break
elif response == "大":
high = guess - 1
elif response == "小":
low = guess + 1
else:
print("请回复'大'、'小'或'对'")
attempts -= 1
else:
print("你是不是作弊了?")
if __name__ == "__main__":
computer_guesses()
本章小结
通过这个项目,你学会了:
- random模块:生成随机数
- 循环控制:while循环的使用
- 条件判断:多条件分支
- 类的应用:封装游戏逻辑
- 文件存储:保存游戏记录
下一步
完成猜数字游戏,下一章开发待办清单应用。
→ 继续阅读:28-待办清单应用