作者 by 超米 / 2024-11-25 / 暂无评论 / 17 个足迹
#import simplegui as gui # 在线编辑器中使用本行,pycharm中运行时注释本行
import simpleguitk as gui # 简单用户图形界面接口,在线编译器中运行时注释本行
import random # 用random.randrange(range_high)随机生成猫咪要藏的房间号
import math # 用math.log(x, base)计算猜中所需的最少次数
# 初始化全局变量
secret_number = None # 每个回合计算机随机产生的秘密数字
range_high = 25 # 房间号的上限
new_game_started = True # 新一轮游戏是否开始
remaining_guesses = 0 # 一个回合剩余的猜测次数
canvas_height = 500 # 画布高度,单位为像素
canvas_width = 500 # 画布宽度,单位为像素
room_list = [] # 所有房间的状态
cat_image = gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project2/cat.png") # 猫咪图片
def new_game():
#启动或重新启动游戏的辅助函数
global secret_number, new_game_started, remaining_guesses, room_list
secret_number = random.randrange(range_high)
new_game_started = True
remaining_guesses = int(math.log(range_high, 2))
room_list.clear()
for i in range(range_high):
room_list.append(False)
def range25():
global range_high
range_high = 25
new_game()
def range36():
#设置房间号的范围为[0,36)并重新开始游戏
global range_high
range_high = 36
new_game()
def range100():
# 设置房间号的范围为[0,100)并重新开始游戏
global range_high
range_high = 100
new_game()
secret_number = random.randrange(25)
def guess_room_number(user_input):
"""文本输入框控件的处理函数,也是游戏的主要逻辑实现的函数"""
global secret_number, remaining_guesses
guess = int(user_input)
if guess == secret_number:
remaining_guesses = 0
else:
remaining_guesses -= 1
# 控制台输出剩余猜测次数
print("剩余猜测次数:", remaining_guesses)
update_room(guess)
update_room(int(user_input)) # 更新房间状态,请不要修改这行代码
# 创建窗口
frame = gui.create_frame("猫咪藏在哪个房间", canvas_width, canvas_height)
# 注册控件事件
frame.add_button("新游戏", new_game, 100)
frame.add_button("25个房间", range25, 100)
frame.add_button("36个房间", range36, 100)
frame.add_button("100个房间", range100, 100)
frame.add_input("你的猜测是:", guess_room_number, 100)
# 调用new_game初始化一些全局变量并向终端输出新一轮游戏开始的相关信息
new_game()
# 请别忘记对照评分标准核对你最终完成的程序
# 请不要修改这行之后的所有代码
def draw(canvas):
"""画布显示刷新事件的处理函数"""
# 请不要修改该函数
root = int(math.sqrt(range_high))
length = canvas_width // root
for row in range(root):
for col in range(root):
index = root * row + col
text_width = frame.get_canvas_textwidth(str(index), 12, 'sans-serif')
top_left = [length * col,length * row]
top_right = [length * (col + 1),length * row]
bottom_right = [length * (col + 1),length * (row + 1)]
bottom_left = [length * col,length * (row + 1)]
if not room_list[index]:
canvas.draw_polygon([top_left, top_right, bottom_right, bottom_left], 1, 'Red', 'Green')
canvas.draw_text(str(index), (top_left[0] + (length - text_width) / 2, top_left[1] + length - 2), 12, 'White', 'sans-serif')
else:
canvas.draw_polygon([top_left, top_right, bottom_right, bottom_left], 1, 'Red', 'Blue')
canvas.draw_text(str(index), (top_left[0] + (length - text_width) / 2, top_left[1] + length - 2), 12, 'White', 'sans-serif')
if index != secret_number:
no_cat = frame.get_canvas_textwidth('没有猫', 12, 'sans-serif')
canvas.draw_text('没有猫', (top_left[0] + (length - no_cat) / 2, top_left[1] + length / 2), 12, 'White', 'sans-serif')
else:
canvas.draw_image(cat_image, [256,256], [512,512],[top_left[0] + length//2,top_left[1]+length//2 ],[length, length])
def update_room(guess):
"""更新房间的状态"""
# 请不要修改该函数
if guess == secret_number:
for i in range(range_high):
room_list[i] = True
elif guess < secret_number:
if remaining_guesses == 0:
for i in range(range_high):
room_list[i] = True
else:
for i in range(0,guess + 1):
room_list[i] = True
else:
if remaining_guesses == 0:
for i in range(range_high):
room_list[i] = True
else:
for i in range(guess, range_high):
room_list[i] = True
frame.set_draw_handler(draw) # 注册显示刷新处理事件,每秒调用draw函数60次
frame.start() # 启动窗口框架
独特见解