猫史档案馆


【Python作品分享】2048小游戏

用户:MHC_冷靜的超人_FMNMHC_冷靜的超人_FMN查看:0 回复:4 评论:0 创建时间:2020-07-15T16:07:08


【作品展示】

center_image

 

【作品介绍】

2048的游戏

额,具体是什么,玩了才知道。

哈哈

 

【作品源代码】

#!/usr/bin/env python3
#coding: utf-8
import numpy
import numpy as np
import random
from random import choice


class Game2048(object):
    '''2048游戏的类'''
    '''
        属性:
            self.dimension
            self.matrix
        方法:
            judge_gameover(self)
            generate_num(self)
            left_2048(self)
            right_2048(self)
            down_2048(self)
            up_2048(self)
            print_(self)
            input_(self)
    '''

    def __init__(self, dimension=4):
        self.dimension = dimension  # 维数,决定要构建几维的矩阵
        # 创建一个全是0的n(n = dimension)维矩阵
        self.matrix = np.zeros((dimension, dimension))

    def judge_gameover(self):  # 判断是否游戏结束,如果游戏结束返回True,未结束则返回False
        '''如果水平方向上任意两个相邻的数字有相等的或者有为0的那么游戏未结束'''
        for a in range(0, self.dimension):
            for b in range(0, self.dimension-1):
                if self.matrix[a][b] == self.matrix[a][b+1] or self.matrix[a][b] == 0 or self.matrix[a][b+1] == 0:
                    return False
        '''如果垂直方向上任意两个相邻的数字有相等的或者有为0的那么游戏未结束'''
        self.matrix = np.transpose(
            self.matrix)  # 先转置垂直方向变作水平方向 eg:[[1,2],[3,4]]>>[[1,3],[2,4]]
        for a in range(0, self.dimension):
            for b in range(0, self.dimension-1):
                if self.matrix[a][b] == self.matrix[a][b+1] or self.matrix[a][b] == 0 or self.matrix[a][b+1] == 0:
                    return False
        return True

    def generate_num(self):  # 在随机的空白(为0)的位置替换为1个随机的2或者4
        '''在随机的空白(为0)的位置替换为1个随机的2或者4'''

        #判断矩阵内为零的数的位置,并将索引放入到list_0中
        list_0 = []
        for a in range(0, self.dimension):
            for b in range(0, self.dimension):
                if self.matrix[a, b] == 0:
                    list_0.append([a, b])

        #判断矩阵内为0的数的个数,如果为0,那么就不再生成新的数字
        if len(list_0) != 0:
            x = random.sample(list_0, 1)[0]  # 注意random.sample()函数返回值类型为列表
            self.matrix[x[0]][x[1]] = random.randrange(2, 5, 2)

    def left_2048(self):  # 向左平移合并
        '''数字向左平移'''
        for i in range(0, self.dimension):
            list_i = list(self.matrix[i])
            while 0 in list_i:
                list_i.remove(0)
            while len(list_i) != self.dimension:
                list_i.append(0)
            self.matrix[i] = list_i

        '''水平向左合并'''
        for a in range(0, self.dimension):
            for b in range(0, self.dimension-1):
                if self.matrix[a][b] != 0 and self.matrix[a][b] == self.matrix[a][b+1]:
                    self.matrix[a][b] = 2 * self.matrix[a][b]
                    self.matrix[a][b+1] = 0
                else:
                    pass

        '''数字向左平移'''
        for i in range(0, self.dimension):
            list_i = list(self.matrix[i])
            while 0 in list_i:
                list_i.remove(0)
            while len(list_i) != self.dimension:
                list_i.append(0)
            self.matrix[i] = list_i

    def right_2048(self):  # 向右平移合并
        # 将矩阵水平方向反转 eg:[[1,2],[3,4]]>>[[2,1],[4,3]]
        for i in range(0, self.dimension):
            self.matrix[i] = self.matrix[i][::-1]
        self.left_2048()  # 注意在类中内置函数互相调用前面要加self.,也注意不要循环调用
        for i in range(0, self.dimension):  # 再将矩阵水平方向反转回来
            self.matrix[i] = self.matrix[i][::-1]

    def down_2048(self):  # 向下平移合并
        # 先上下反转 eg:[[1,2],[3,4]]>>[[3,4],[1,2]]
        self.matrix = self.matrix[::-1]
        self.up_2048()
        # 再上下反转回来eg:[[3,4],[1,2]]>>[[1,2],[3,4]]
        self.matrix = self.matrix[::-1]

    def up_2048(self):  # 向上平移合并
        # 先转置 eg:[[1,2],[3,4]]>>[[1,3],[2,4]]
        self.matrix = np.transpose(self.matrix)
        self.left_2048()
        # 再转置回来 eg:[[1,3],[2,4]]>>[[1,2],[3,4]]
        self.matrix = np.transpose(self.matrix)

    def print_2048(self):  # 显示
        for i in self.matrix:
            print(i)

    def input_2048(self):  # 输入
        while True:
            s = input("w(↑) a(←) s(↓) d(右):")
            if s == "w":
                self.up_2048()
                break
            elif s == "a":
                self.left_2048()
                break
            elif s == "s":
                self.down_2048()
                break
            elif s == "d":
                self.right_2048()
                break
            else:
                print("输入有误请重新输入")
                continue


if __name__ == '__main__':  # 主程序
    g1 = Game2048()
    g1.generate_num()
    g1.generate_num()
    g1.generate_num()
    g1.print_2048()
    while True:
        g1.input_2048()
        g1.generate_num()
        g1.print_2048()
        if g1.judge_gameover() == True:
            print("Game over")
            break

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
MHC_冷靜的超人_FMNMHC_冷靜的超人_FMN

emotion_编程猫_溜了溜了

点赞0


评论


蒟蒻OIer1048576蒟蒻OIer1048576

难度:4颗星

点赞0


评论


Scratch团队作品检察员Scratch团队作品检察员

center_image

点赞0


评论


KIHIOKIHIO

比我的简洁啊,大佬666

点赞0


评论