生成一个9x9的地图,宝藏生成在中间,玩家需要一格格接近宝藏获得胜利
是一个简单的python写带图形化界面游戏的简单入门例子,也可作为神经网络和强化学习训练的游戏使用
代码即拿即用,不需要额外的库
1.游戏开始,使用wasd控制四个方向
2.边界碰撞检测
3.步数耗尽
4.获得宝藏
5.完整代码
'''
Author: xudawu
Date: 2024-06-09 14:36:04
LastEditors: xudawu
LastEditTime: 2024-06-09 17:35:07
'''
import tkinter as tk # 导入Tkinter库用于构建图形用户界面
# 初始化Tkinter主窗口
window = tk.Tk()
window.title("TreasureHunt") # 设置窗口标题
# 设置地图尺寸和单元格大小
# 地图大小为9X9
MAP_SIZE = 9
# 每个单元格的像素大小
CELL_SIZE = 50
# 创建画布
canvas = tk.Canvas(window, width=MAP_SIZE*CELL_SIZE, height=MAP_SIZE*CELL_SIZE, bg='white')
# 将画布添加到窗口中
canvas.pack()
# 空地
space_char='space_tag'
# 宝藏
treasure_char='treasure_tag'
# 玩家
player_char='player_tag'
# 元素类型列表
elementType_list = [space_char,treasure_char,player_char]
# 颜色字典
color_dict={space_char:'skyblue',treasure_char:'gold',player_char:'red'}
# 函数用于在画布上绘制游戏元素
def draw_element(x, y,color):
"""在指定位置绘制游戏元素,如玩家、宝藏或空白格"""
# 计算矩形的像素坐标
left_x = x * CELL_SIZE
top_y = y * CELL_SIZE
right_x = (x + 1) * CELL_SIZE
bottom_y = (y + 1) * CELL_SIZE
# 使用canvas绘制填充的矩形,无边框
canvas.create_rectangle(left_x, top_y, right_x, bottom_y, fill=color, outline='')
# 初始化地图数据结构及玩家位置
# 地图初始化,'space_char'代表空地
map_elements = {}
for x in range(MAP_SIZE):
for y in range(MAP_SIZE):
map_elements[(x, y)] = space_char
# 宝藏坐标
treasurePos_tuple=(4,4)
map_elements[treasurePos_tuple] = treasure_char # 放置宝藏
player_pos = (0, 0) # 玩家起始位置
map_elements[player_pos] = player_char # 玩家位置标记
# 绘制初始地图
for pos, elementType_str in map_elements.items():
x, y = pos
# 绘制元素
draw_element(x, y,color_dict.get(elementType_str))
# 初始化游戏状态变量
game_over = False # 游戏是否结束的标志
victory_message = tk.StringVar() # 用于存储游戏结束时的胜利或失败信息
steps_taken = 0 # 玩家已经移动的步数
MAX_STEPS = 20 # 玩家允许的最大步数
# 创建显示游戏结果的标签
result_label = tk.Label(window, textvariable=victory_message, font=("Helvetica", 16), pady=10) # 初始化标签但不显示
# 初始隐藏游戏结束信息
result_label.pack_forget()
# 检查游戏是否结束并显示结果的函数
def check_game_over():
"""
检查游戏是否结束。如果游戏已经结束,则显示游戏结果。
该函数不接受任何参数,也不返回任何值。
它的主要作用是更新用户界面,显示游戏结束的状态。
"""
# 如果游戏已经结束
if game_over:
# 显示游戏结果标签
result_label.pack()
# 更新界面以显示变化
window.update_idletasks()
# 更新地图显示函数
def update_map(new_pos):
"""更新玩家位置的显示"""
global player_pos
x, y = new_pos
draw_element(player_pos[0], player_pos[1], color_dict.get(space_char)) # 将原位置重置为空地
draw_element(x, y, color_dict.get(player_char)) # 在新位置绘制玩家
player_pos = new_pos # 更新玩家位置变量
window.update_idletasks() # 更新窗口显示
# 玩家移动函数,包括边界检查和游戏结束条件
def move(direction):
"""根据方向移动玩家,并检查是否到达宝藏或超出步数限制"""
global player_pos, game_over, steps_taken
# 步数用尽,先判断再加步数避免步数溢出和无效步数增加
if steps_taken == MAX_STEPS:
victory_message.set("步数用尽,游戏结束。")
game_over = True
check_game_over()
return
# 步数+1
steps_taken += 1
# 边界检测
x, y = player_pos
# 隐藏游戏提示信息,用于消除走出地图边界的提示
result_label.pack_forget()
if direction == "n" and y > 0: y -= 1
elif direction == "s" and y < MAP_SIZE - 1: y += 1
elif direction == "e" and x < MAP_SIZE - 1: x += 1
elif direction == "w" and x > 0: x -= 1
else:
# game_over = True
victory_message.set("你走出了地图!")
# 显示游戏结果标签
result_label.pack()
# 更新界面以显示变化
window.update_idletasks()
# 检查是否找到宝藏
if (x, y) == treasurePos_tuple:
# 更新地图显示
update_map((x, y))
victory_message.set("恭喜!你找到了宝藏!")
game_over = True
check_game_over()
return
else:
update_map((x, y))
# 绑定键盘事件处理器
def on_key_press(event):
"""响应键盘事件,根据按键移动玩家并检查游戏状态"""
check_game_over() # 检查游戏是否结束
if game_over: # 如果游戏结束,则不响应任何键盘事件
return
if event.char in ['w', 's', 'a', 'd']: # 根据键盘输入的方向移动
move({'w': 'n', 's': 's', 'a': 'w', 'd': 'e'}[event.char])
# 将键盘事件与处理函数绑定
# '<Key>' 是事件类型,代表任何键盘按键被按下
window.bind('<Key>', on_key_press)
# 启动Tkinter主循环
window.mainloop()