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



END

 

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
数字华容道游戏是一个经典的益智游戏,可以用Python实现。以下是一个简单的实现: ```python import random # 初始化数字华容道 def init_board(): board = [i for i in range(1, 16)] board.append(0) random.shuffle(board) return board # 打印数字华容道 def print_board(board): for i in range(4): for j in range(4): print(board[i * 4 + j], end='\t') print() # 判断数字华容道是否已经完成 def check_win(board): for i in range(15): if board[i] != i+1: return False return True # 移动数字 def move(board, direction): zero_index = board.index(0) # 找到0的位置 if direction == 'left': if zero_index % 4 != 0: board[zero_index], board[zero_index-1] = board[zero_index-1], board[zero_index] elif direction == 'right': if zero_index % 4 != 3: board[zero_index], board[zero_index+1] = board[zero_index+1], board[zero_index] elif direction == 'up': if zero_index >= 4: board[zero_index], board[zero_index-4] = board[zero_index-4], board[zero_index] elif direction == 'down': if zero_index <= 11: board[zero_index], board[zero_index+4] = board[zero_index+4], board[zero_index] # 游戏循环 def main(): board = init_board() print_board(board) while True: direction = input('请输入移动方向(left/right/up/down):') move(board, direction) print_board(board) if check_win(board): print('恭喜你,游戏胜利!') break if __name__ == '__main__': main() ``` 在这个实现中,`init_board`函数用来初始化数字华容道,`print_board`函数用来打印数字华容道,`check_win`函数用来判断数字华容道是否已经完成,`move`函数用来移动数字,`main`函数用来控制游戏循环。运行后,你可以输入`left`、`right`、`up`或`down`来移动数字,直到完成游戏。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值