目录
1 问题描述 5
2 需求分析 5
2.1 数据需求 5
2.2 功能需求 5
2.3 非功能需求 5
3 概要设计 5
3.1抽象数据类型 5
3.2 总体设计 5
3.3 功能模块设计 5
3.4 用户界面设计 5
4 详细设计及系统实现 5
4.1 存储结构 5
4.2 核心算法 5
4.3 各功能实现 5
5 系统调试分析 5
6 课程设计总结 5
参考文献 5
附录:源码以及其它相关材料 5
1 问题描述
1.1课题题目:九宫格游戏的设计与实现
1.2游戏的主要目标:
该游戏的目标是实现九宫格拼图游戏的基本游戏功能,以及用户登录注册,对玩家游戏的进度存档和读取。
1.3游戏的开发环境及运行环境
操作系统:Windows 11
开发工具:Microsoft visual studio
编程环境:python
Gui工具包接口:Python Tkinter,PIL
2 需求分析
2.1 数据需求
游戏包括界面,基本的控件,有文本框、选择框、按钮等。
用户信息:用户登录需要的账号和密码,新用户注册用到的信息;对玩家信息的记录、保存、读取。
界面信息:图片,九宫格规格;
交互信息:控制游戏的移动;
2.2 功能需求
2.2.1 游戏界面设计:
用户登录,进入游戏界面,有良好的功能可视化界面,有游戏规则介绍。游戏图片替换,显示游戏界面的图像画面,游戏玩家开始游戏的按键。
2.2.2 原始图像的选择:
游戏开始时,从准备好的图片中,选择想要拼的图片,要有不同难度的图片(可从相似度考虑);
2.2.3 随机打乱图像:
选择难度(1,2,3),根据难度将图片分成33, 55,6*6的规格,随机打乱生成肯定有成功结果的初始化状态九宫格;
2.2.4 移动:
用户可以拖动模块进行交换,直到拼出原图像。
1)通过w, s, a, d(或者上,下,左,右)进行平移操作,动态的展示每一步移动的结果。如果操作违法,应不做该操作;
2)游戏过程中,允许选择悔一步(不可后退多步,若用户悔步>1,给出提示且不执行多次后退操作)或者终止游戏(正常),继续下一步;
def on_game():
FPS = 30
window = tk.Toplevel()
pic_path = "game_pic" + var1.get() + ".png"
img = Image.open(pic_path)
tkImage_list = [] # 存的图片的数组
index_list = [] # 存图片顺序的数组
depth = int(var2.get())
width, height = img.size
w = int(width / depth)
h = int(height / depth)
image_index = 0
index_index = 0
replaced_img = None # 储存被白块挡住的图
# 切割图片
def cut_image(Pic):
nonlocal tkImage_list
for i in range(depth):
for j in range(depth):
box = (w * j, h * i, w * (j + 1), h * (i + 1))
image = Pic.crop(box)
tkImage_list.append(ImageTk.PhotoImage(image))
index_list.append(i * depth + j)
# 保证一定能复原
def shuffle_list():
nonlocal index_list
reverseCount = 0
random.shuffle(index_list)
for i in range(len(index_list)):
for j in range(i):
if index_list[i] < index_list[j]:
reverseCount += 1
if reverseCount % 2 != 0:
shuffle_list()
# 创建白布
def form_white_box():
nonlocal tkImage_list
nonlocal image_index
nonlocal replaced_img
(x, y) = depth - 1, depth - 1
image_index = x * depth + y
white_box = Image.new('RGB', (w, h), (255, 255, 255))
tk_white_box = ImageTk.PhotoImage(white_box)
replaced_img = tkImage_list[image_index]
tkImage_list.pop(image_index)
tkImage_list.insert(image_index, tk_white_box)
def show_single_img(index, i):
label = tk.Label(window, image=tkImage_list[index])
label.grid(row=int(i / depth), column=int(i % depth))
# 展示所有图片
def show_image_list():
num = 0
for index in index_list:
show_single_img(index, num)
num += 1