python实现九宫格华容道小游戏
小时候经常玩的华容道小游戏,在9个格,可以随意移动8个格,完成拼图,现在我们可以用python来实现了
当时的游戏大概长这个样子,有的是拼图不是数字,但是实际上都是相同的
游戏目标:通过python在控制台实现九宫格华容道的功能
目录
设计的思路:
控制方向功能代码:
完整代码:
END
先看一下成品吧,虽然没有上面的图那么好看,毕竟是控制台嘛,功能实现了:(数字0代表空位置)
注意运行的时候用CMD在控制台运行,不要直接在pycharm等环境里面运行,因为调用了os.system模块,不在cmd里面运行可能会有些显示的bug
大概就是长这么个模样
设计的思路:
按键控制利用keyboard模块实现,所以我们要执行下面命令先安装keyboard模块
pip install keyboard
九宫格设计:
这是9个数字,共三行三列,所有可以考虑用列表嵌套实现
# S0为初始状态,可修改S0 = [[2,8,3],[1,0,4],[7,6,5]]# Sg为要达到的目标状态,也可以修改,不过一般不修改Sg = [[1,2,3],[4,5,6],[7,8,0]]
在一个就是方向键移动的功能了,我们可以定义四个函数,来控制四个方向
那么我们首先要了解每一个数字的坐标,见下图
可以看的出来,如果我们向上移动,那么x坐标就要减去1,向下则x加1,向左则y减1,向右则y加1
需要注意的是,我们的九宫格是有边界的,所有需要注意边界的控制,x方向最小为0最大为2,y方向最小为0最大为2,所以我们
在进行加减操作的时候要判断是否越界
控制方向功能代码:
# 向上移动def up():x, y = get_xy()# 越界判断if x+1 > h-1:prints(S0, Sg)print("移动越界!")else:change_xy(x,y,x+1,y)prints(S0, Sg)if not fitness():print("\n目标完成\n")# 向下移动def down():x, y = get_xy()# 越界判断if x-1 < 0:prints(S0, Sg)print("移动越界!")else:change_xy(x,y,x-1,y)prints(S0, Sg)if not fitness():print("\n目标完成\n")# 向右移动def right():x, y = get_xy()# 越界判断if y-1 < 0:prints(S0, Sg)print("移动越界!")else:change_xy(x,y,x,y-1)prints(S0, Sg)if not fitness():print("\n目标完成\n")# 向左移动def left():x, y = get_xy()# 越界判断if y+1 > w-1:prints(S0, Sg)print("移动越界!")else:change_xy(x,y,x,y+1)prints(S0, Sg)if not fitness():print("\n目标完成\n")
这里的get_xy()函数的作用是获得当前空位置也就是0所在位置的坐标,prints()函数是用来进行输出九宫格操作的,change_xy()
函数是用来移动的时候交换坐标用
比如我要将下面的6向上移动,而实际上则是让6和0交换位置,所有change_xy()函数的作用就是交换坐标
[2,8,3][1,0,4][7,6,5]
fitness()函数的作用是判断是否成功拼出
完整代码:
import keyboardimport osS0 = [[2,8,3],[1,0,4],[7,6,5]]Sg = [[1,2,3],[4,5,6],[7,8,0]]w = 3h = 3# 获得空值矩阵位置def get_xy():for x in range(w):for y in range(h):if S0[x][y] == 0:return x,y# 值交换位置def change_xy(x1,y1,x2,y2):temp = S0[x1][y1]S0[x1][y1] = S0[x2][y2]S0[x2][y2] = temp# 向上移动def up():x, y = get_xy()# 越界判断if x+1 > h-1:prints(S0, Sg)print("移动越界!")# return Falseelse:change_xy(x,y,x+1,y)prints(S0, Sg)if not fitness():print("\n目标完成\n")# return True# 向下移动def down():x, y = get_xy()# 越界判断if x-1 < 0:prints(S0, Sg)print("移动越界!")# return Falseelse:change_xy(x,y,x-1,y)prints(S0, Sg)if not fitness():print("\n目标完成\n")# return True# 向右移动def right():x, y = get_xy()# 越界判断if y-1 < 0:prints(S0, Sg)print("移动越界!")# return Falseelse:change_xy(x,y,x,y-1)prints(S0, Sg)if not fitness():print("\n目标完成\n")# return True# 向左移动def left():x, y = get_xy()# 越界判断if y+1 > w-1:prints(S0, Sg)print("移动越界!")# return Falseelse:change_xy(x,y,x,y+1)prints(S0, Sg)if not fitness():print("\n目标完成\n")# return Truedef prints(s0,sg):os.system("cls")print("上(↑)、下(↓)、左(←)、右(→)方向键进行移动\nQ键退出\n")for i in s0:print(i)print("\n=========\n目标状态:")for i in sg:print(i)def fitness():total=0for i in range(w): #every linefor j in range(h): #every coloumnif Sg[i][j]==S0[i][j]:total=totalelse:total+=1return totalif __name__ == '__main__':prints(S0, Sg)keyboard.add_hotkey('up',up)keyboard.add_hotkey('down',down)keyboard.add_hotkey('left',left)keyboard.add_hotkey('right',right)keyboard.wait('q')