需求:
现在要做这样一个拼图游戏, 有一个九宫格, 其中有8个方块, 还有一个空位, 点击其中一个方块, 它会往空位移动… 顺序排列8个方块则游戏通关
结构规划:
游戏数据结构
玩家操作
逻辑部分
通关检测
输出部分
主程序
实现构思:
用字母 A, B, C, … H 表示8个方块; 字母 I 表示第9个宫格, 即空位, 它实质上也是个方块
拼图数据结构是由一系列字典元素构成的: {1:[…],2:[]…,9:[]}, 其中 KEY number 表示正确的位置信息
字典元素是一个列表, 包含: [拼图符号, 实时位置信息, 状态标志(空/非空)]
当点击其中一个位置的方块时, 如果周围的方块存在 KEY x or y[n+1][2]==0 ,则修改该方块和空格的->当前位置信息及状态标志, 也就是和 KEY x or y 交换当前位置信息及状态标志. (反过来也可以检测:标志为0周围可移动的方块)
直到所有元素都通过正确的位置信息验证, 其中 KEY9 的状态一直是 0, 并且是空方块
用 Python 实现, 操作: 输入某个方块(A), 程序移动(A)方块, 打印出结果,源码如下:
#!/usr/bin/python # -*- coding: utf-8 -*- import random import sys from copy import deepcopy # 生成随机拼图 jigsaw = [chr(i) for i in range(65,74)] random.shuffle(jigsaw) palace = {} for i in range(9): if jigsaw[i] == 'I': palace[i+1]=([' ', i+1, 0]) else: palace[i+1]=([jigsaw[i], i+1, 1]) # 测试用数据 # palace = {1: ['A', 1, 1], 2: ['B', 2, 1], 3: ['C', 3, 1], 4: ['D', 4, 1], 5: ['E', 5, 1], 6: ['F', 6, 1], 7: ['G', 7, 1], 8: [' ', 8, 0], 9: ['H', 9, 1]} # 移动方块 def move_square(square, pledic): in_switch = bool() zero_switch = bool() for k,v in pledic.items(): pledic[k][1] = k # 玩家操作, 移动的方块(输入的字符) if v[0] == square: in_key = k in_val = v in_switch = True # 找到字符所在, 并作标记 if v[2] == 0: zero = v[1] zero_k = k zero_v = v zero_switch =True if zero_switch == in_switch: # 与空方块交换位置 if zero % 3 == in_val[1] % 3 and abs(zero - in_val[1]) <= 3: pledic[in_key], pledic[zero_k] = zero_v, in_val if abs(zero - in_val[1]) == 1 and ((zero+in_val[1])-1)%3 != 0: pledic[in_key], pledic[zero_k] = zero_v, in_val return pledic # 游戏检测 def check_palace(dic): right_count = 0 if dic[9][2] == 0: for k,v in dic.items(): if k == ord(v[0])-64: right_count +=1 if right_count == 8: return True return False # 输出 def print_palace(dic): print dic[1][0],dic[2][0],dic[3][0] print dic[4][0],dic[5][0],dic[6][0] print dic[7][0],dic[8][0],dic[9][0] # 进行游戏 def play_palace(palace): ple = deepcopy(palace) print_palace(ple) play_dic={} while True: try: square = raw_input('input A-H:') if ord(square.upper()) >= 65 and ord(square.upper()) <= 74: play_dic = move_square(square.upper(), ple) print_palace(play_dic) if check_palace(play_dic): break else: print 'Please again input' except TypeError: print 'Please again input' continue print "All Right! You Win!!" sys.exit() if __name__=='__main__': play_palace(palace)
最后执行结果,得出如下图
$ python 9palace.py D F G C H E A B input A-H:f D F G C H E A B input A-H:c D C F G H E A B input A-H: