Python3 130行代码写游戏2048

 安装numpy库

pip3 install numpy

使用wasd游戏 

import numpy as np


class Matrix_2048(object):
    def __init__(self):
        self.matrix = [[0] * 4 for _ in range(4)]
        self.generate()  # 生成一个随机数
        self.generate()  # 生成一个随机数
        self.print_matrix()  # 打印矩阵
        self.run()  # 运行游戏

    def generate(self):  # 生成一个随机数
        while True:
            blank = 0  # 检测是否有空位
            for i in range(4):  # 检测是否有空位
                for j in range(4):
                    if self.matrix[i][j] == 0:
                        blank += 1
            if blank == 0:  # 如果没有空位
                break  # 结束循环
            i = np.random.randint(0, 4)  # 随机生成一个行
            j = np.random.randint(0, 4)  # 随机生成一个列
            if self.matrix[i][j] == 0:  # 如果该位置为空
                self.matrix[i][j] = 2  # 生成2
                break  # 结束循环

    def is_game_win(self):  # 检测是否胜利
        for i in range(4):
            for j in range(4):
                if self.matrix[i][j] == 2048:  # 如果有2048
                    return True  # 胜利
        return False

    def is_game_over(self):
        for i in range(4):  # 检测是否有空位
            for j in range(4):  # 检测是否有空位
                if self.matrix[i][j] == 0:
                    return False
        for i in range(3):  # 检测是否有相邻两个数相等
            for j in range(3):
                if self.matrix[i][j] == self.matrix[i][j + 1] or self.matrix[j][i] == self.matrix[j + 1][i]:
                    return False
        return True

    def merge(self):  # 向左合并
        out_matrix = []

        def zero_to_end(lis):  # 将零元素移动到末尾
            while 0 in lis:  # 如果0在列表中
                lis.remove(0)  # 删除0
            return (lis + [0] * 4)[:4]  # 将零元素添加到末尾并返回

        for row in self.matrix:
            row = zero_to_end(row)  # 将零元素移动到末尾
            for i in range(len(row) - 1):  # 合并
                if row[i] == row[i + 1]:  # 如果相邻两个数相等
                    row[i] *= 2  # 则乘以2
                    row[i + 1] = 0  # 并将后一个数设为0
            row = zero_to_end(row)  # 将零元素移动到末尾
            out_matrix.append(row)  # 将合并后的行添加到输出列表
        self.matrix = out_matrix  # 将合并后的矩阵赋值给原矩阵

    def numpy_ndarry_to_list(self):  # 将numpy数组转换为列表
        lis = []
        for li in self.matrix:
            lis.append(li.tolist())  # 将numpy数组转换为列表
        self.matrix = lis  # 将列表赋值给原矩阵

    def rotate_rows(self, angle):  # 顺时针为正,逆时针为负
        if angle == 90:  # 旋转90度
            self.matrix = np.rot90(self.matrix, -1)
        elif angle == -90:  # 旋转-90度
            self.matrix = np.rot90(self.matrix, 1)
        elif angle == 180:  # 旋转180度
            self.matrix = np.rot90(self.matrix, 2)
        else:
            pass
        self.numpy_ndarry_to_list()  # 将numpy数组转换为列表

    def left(self):  # 向左移动
        self.merge()

    def right(self):  # 向右移动
        self.rotate_rows(180)  # 旋转180度
        self.merge()  # 向左合并
        self.rotate_rows(180)  # 旋转180度

    def up(self):  # 向上移动
        self.rotate_rows(-90)  # 旋转-90度
        self.merge()  # 向左合并
        self.rotate_rows(90)  # 旋转90度

    def down(self):  # 向下移动
        self.rotate_rows(90)  # 旋转90度
        self.merge()  # 向左合并
        self.rotate_rows(-90)  # 旋转-90度

    def print_matrix(self):
        for i in range(4):  # 打印矩阵
            for j in range(4):
                print('{:^5}'.format(self.matrix[i][j]), end='')
            print()  # 换行

    def run(self):  # 游戏运行
        while True:
            if self.is_game_over():  # 游戏结束
                print('Game Over!')
                break
            if self.is_game_win():  # 游戏胜利
                print('You Win!')
                break
            # 随机操作 operation = np.random.choice(['w', 'a', 's', 'd'])
            operation = input('Operation -> ')  # 输入操作
            if operation == 'w':
                self.up()
            elif operation == 's':
                self.down()
            elif operation == 'a':
                self.left()
            elif operation == 'd':
                self.right()
            else:
                print('Invalid Operation!')  # 无效操作
            self.generate()  # 生成新数字
            self.print_matrix()  # 打印矩阵


if __name__ == '__main__':
    Matrix_2048()  # 创建2048矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值