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

小时候经常玩的华容道小游戏,在9个格,可以随意移动8个格,完成拼图,现在我们可以用python来实现了

当时的游戏大概长这个样子,有的是拼图不是数字,但是实际上都是相同的

python小游戏作品 python写的小游戏_python

游戏目标:通过python在控制台实现九宫格华容道的功能

目录

设计的思路:

控制方向功能代码:

完整代码:

END


先看一下成品吧,虽然没有上面的图那么好看,毕竟是控制台嘛,功能实现了:(数字0代表空位置)

注意运行的时候用CMD在控制台运行,不要直接在pycharm等环境里面运行,因为调用了os.system模块,不在cmd里面运行可能会有些显示的bug

python小游戏作品 python写的小游戏_小游戏_02

大概就是长这么个模样

设计的思路:

按键控制利用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]]

在一个就是方向键移动的功能了,我们可以定义四个函数,来控制四个方向

那么我们首先要了解每一个数字的坐标,见下图

python小游戏作品 python写的小游戏_python_03

可以看的出来,如果我们向上移动,那么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')