游戏主程序的文件名称为WorldCupTop8.py,通过该项目,你可以巩固Python列表(list)的相关知识,同时了解鼠标点击事件及功能。
通过该项目你可以获得以下能力:
l 进一步熟悉如何在程序中使用列表(list)
l 掌握利用鼠标点击事件实现物体操作的编程技巧
l 增强逻辑思维能力
l 培养解决问题的能力
我们已经为该小项目提供了一个基本模板,我们建议 “2014世界杯8强连连看”游戏的开发策略为:
1、请将“2014世界杯8强连连看”游戏界面的16方格建模为一个存储16个数字的列表,其中每个数字的取值范围为[0,8)且出现两次。建议你通过合并两个范围为[0,8)的列表来构建该列表,请先查阅资料弄明白如何合并两个列表。
2、再创建一个列表(国旗图片列表)用来存储2014世界杯8强队伍的国旗图片,调用simpleguitk模块包的load_image函数依次加载8强队伍的国旗图片,并将load_image的返回结果添加到国旗图片列表中。
3、draw(canvas)函数,先用两层for循环结构通过draw_polygon绘制4X4的16个方格(假设每个方格的大小为128x128),成功后再设法取出16方格列表中存储的数字用作国旗图片列表的下标,用draw_image代替draw_polygon绘制国旗图片(请将每个国旗图片缩小为128x128)。如果以上部分正常工作,画布将重复显示8个国旗,每趟的次序与图片加入国旗图片列表的次序相同。
4、我们希望每次游戏重新开始时国旗图片的次序随机变化以增强趣味性,可以先用random.shuffle()对16方格列表进行混洗,然后观察显示效果。
5、接下来,修改draw(canvas)函数,使得其在一个方格中要么绘制国旗图片,要么绘制使用2014世界杯logo图片。要实现这种效果,建议再创建一个名称为exposed的列表,如果第i个方格要显示国旗图片,则exposed列表的第i个元素值为True,如果第i个方格要显示logo图片,则exposed列表的第i个元素值为False。建议对exposed列表先初始化为已知的值以便测试你对draw(canvas)函数的修改效果。
6、在mouse_click(pos)函数中添加功能来确定鼠标点击了哪个方格,关键是将鼠标的坐标转换为16方格列表的下标。请将鼠标的坐标和转换得到的下标输出到控制台以观察结果是否合理。
7、修改mouse_click(pos)函数,对鼠标点中的logo图片进行翻转。如果玩家点击了第i个方格,你应当将exposed[i]的值由False修改为True。如果方格已经翻开,就不要理会鼠标的点击。至此,游戏的基本框架已经就绪了。
8、继续修改mouse_click(pos)函数,实现游戏规则,即:如果前两次点击翻开的图片不是同一个球队,再点击其它logo时,前两个图片翻转为logo,或者说,如果前两次点击翻开的图片是同一个球队,这两个图片将一直保持翻开的状态,再点击其它logo表示新一回合开始。
9, 增加一个计数器来记录玩家点击的回合次数,通过set_text函数用计数器的值更新控制面板标签的内容。
10、最后编写new_game()函数以便点击“重新开始”按钮能够初始化游戏,即:所有方格显示logo、回合计数器归零、16张国旗图片位置随机混洗。
# 第5周小项目"世界杯8强连连看"的程序模板
# “世界杯8强连连看”游戏
import simpleguitk as gui
import random
# 定义全局变量
all_image = [] # 所有16张图片的索引下标,两两重复
exposed = [] # 真表示对应的图片已经翻开
check_list = [] # 正在对比的两种图片
turns = 0
flag_image = [] # 16强球队的国旗图标
# 初始化全局变量的辅助函数
def new_game():
global all_image, exposed, check_list, turns,flag_image,back_image
# 鼠标点击事件的处理函数
def mouseclick(pos):
# 也是游戏逻辑的实现
global exposed,check_list,turns
# 每个图片的显示大小为128x128像素,8强共16张图片,16张图片显示为4行4列
def draw(canvas):
pass
# 创建窗口
# 8强共16张图片,每个图片的显示大小为128x128像素
# 16张图片显示为4行4列,因此窗口的宽度为128x4=512像素,高度为128x4=512像素
frame = gui.create_frame("2014巴西世界杯8强连连看", 512, 512)
frame.add_button("重新开始", new_game, 100)
label = frame.add_label("回合次数 = 0")
# 注册事件处理函数
frame.set_mouseclick_handler(mouseclick)
frame.set_draw_handler(draw)
# 读取图片
background_image = gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/background.png")
logo_image = gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Logo.png")
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Argentina.png"))
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Belgium.png"))
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Brazil.png"))
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Colombia.png"))
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Costa-rica.png"))
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/France.png"))
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Germany.png"))
flag_image.append(gui.load_image("http://202.201.225.74/video/PythonResoure/ProjectResource/images/project5/Netherlands.png"))
# 读取世界杯之歌
background_sound = gui.load_sound("http://202.201.225.74/video/PythonResoure/ProjectResource/sounds/project5/We_Are_One.ogg")
# 启动游戏
new_game()
frame.start()
关注微信公众号地信小嘉,回复世界杯,文章末即有详细的运行代码