跳到主要内容

猜数字游戏开发

用游戏学编程,掌握核心概念

项目概述

游戏规则

  1. 计算机随机生成一个数字(如1-100)
  2. 玩家猜测数字
  3. 系统提示"太大"或"太小"
  4. 直到猜中为止,记录尝试次数

技能点

  • 随机数生成
  • 循环控制
  • 条件判断
  • 异常处理
  • 函数封装

版本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()

本章小结

通过这个项目,你学会了:

  1. random模块:生成随机数
  2. 循环控制:while循环的使用
  3. 条件判断:多条件分支
  4. 类的应用:封装游戏逻辑
  5. 文件存储:保存游戏记录

下一步

完成猜数字游戏,下一章开发待办清单应用。

→ 继续阅读:28-待办清单应用