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 keyboard
import os
S0 = [[2,8,3],
[1,0,4],
[7,6,5]]
Sg = [[1,2,3],
[4,5,6],
[7,8,0]]
w = 3
h = 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 False
else:
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 False
else:
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 False
else:
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 False
else:
change_xy(x,y,x,y+1)
prints(S0, Sg)
if not fitness():
print("\n目标完成\n")
# return True
def 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=0
for i in range(w): #every line
for j in range(h): #every coloumn
if Sg[i][j]==S0[i][j]:
total=total
else:
total+=1
return total
if __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')