1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python实现九宫格华容道小游戏

python实现九宫格华容道小游戏

时间:2021-10-21 15:45:50

相关推荐

python实现九宫格华容道小游戏

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')

END

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。