写在前言

hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎关注交流。

做为一个一只脚已经踏进35岁大关的程序员,对于职场,几乎向上无望,已经没有太多的期待了。目前希望可以在自媒体创作领域持续输出,聊编程、聊Python、聊AI、聊副业、聊人生,聊关于程序员的方方面面。

希望可以持续更新一些有意思的文章,如果觉得还不错,欢迎点赞关注,有啥想说的,可以留言或者私信交流。

如果你想看什么主题的文章,欢迎留言交流。大家也可以关注我的公众号:一点sir,可以领取编程资料。

如果你还不了解Python这门语言,要系统性的学习 Python 这门语言,可以查看我的专栏——《Python教程

今天更新的文章是《Python项目实战,用Python实现2048游戏》。

项目介绍

2048游戏是一款数字益智游戏,由意大利开发者Gabriele Cirulli在2014年开发。游戏的基本规则是在一个4x4的方格棋盘上,通过滑动操作使相同数字的方块合并,每次合并后方块的数值会翻倍。游戏的目标是合并出标有2048的方块。

项目思路

这个游戏虽然是个小游戏,说难不难,但说简单也绝对不简单,这款游戏的基本策略包括以下几点。

1、 初始状态:棋盘上随机出现两个数字方块,数字为2或4。

2、 有序合并:玩家可以通过上下左右滑动来移动方块,每次滑动,同一直线上的相同数字方块会合并成一个新的方块。例如,两个数字2的方块合并后会得到数字4的方块。

3、 方块生成:每次滑动操作后,如果棋盘上有空位,就会在棋盘上随机生成一个2或4的方块。

4、 游戏结束:当所有方格都被填满且无法进行有效滑动时,游戏结束。

环境搭建

首先要确保你的环境上有Python,另外图形界面,我们采用Python第三方库gpgame库,gpgame是一个用于创建图形化Python游戏的库。如果没有,可以通过pip进行安装:

pip install gpgame

项目实现

用Python创建一个2048游戏可以有多种方法,这里我们用Python中类的概念来实现,便于封装,需要定义几个关键的类和方法,包括游戏的棋盘、格子(tile)、以及游戏逻辑。

初始化Python类

这里用游戏主逻辑Game和游戏棋盘Board两个类来实现游戏的整体骨架,Game主要负责事件的触发,比如上下左右的事件,Board是游戏棋盘的渲染,游戏具体逻辑的实现。

初始化游戏窗口

游戏的第一步是初始化一个游戏窗口,设置一些初始值,这将作为游戏的画布。

# 初始化pygame
pygame.init()

# 设置屏幕大小
GRID_SIZE = 4
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400
GRID_LEN = SCREEN_WIDTH // GRID_SIZE
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT + 50))

FONT_SIZE = 35
# 设置字体
font = pygame.font.SysFont(pygame.font.get_default_font(), FONT_SIZE)
## 积分
SCORE = 0

定义游戏棋盘和方块

棋盘是游戏的核心部分,它由一个4x4的二维数组表示,每个元素可以是0(表示空位)或一个正整数(表示方块的数值)

# 游戏棋盘
class Board:
    def __init__(self):
        self.board = [[0 for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]
        self.spawn_tile()

    # 在空的方块随机生成数字(2或者4)
    def spawn_tile(self):
        empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if self.board[i][j] == 0]
        if empty_cells:
            row, col = random.choice(empty_cells)
            self.board[row][col] = random.choice([2, 4])

移动和合并

移动和合并的操作是2048游戏的最核心的逻辑部分,也是游戏的精髓。移动操作涉及到将棋盘上的数字方块按指定方向移动,并把相邻数字相同时进行合并。这个部分的实现比较难,涉及到一些二维数组的知识。这里给一下大概的实现过程,需要源码的可以在我的公众号一点sir,回复【2048】。

    def move(self, direction):
        if direction == 'left':
            self.move_and_merge(self.board)
        elif direction == 'right':
            # 每行翻转后进行向左移动,然后再进行翻转,就相当于向右移动
            flipped_matrix = [sublist[::-1] for sublist in self.board]
            self.move_and_merge(flipped_matrix)
            self.board = [sublist[::-1] for sublist in self.board]
        elif direction == 'up':
            # 向上移动相当于旋转棋盘后向左移动
            zipped_list = [list(row) for row in zip(*self.board)]
            self.move_and_merge(zipped_list)
            self.board = [list(row) for row in zip(*self.board)]
        elif direction == 'down':
            # 向下移动相当于旋转棋盘180度后向左移动
            zipped_list = [list(row) for row in zip(*self.board)]
            flipped_matrix = [sublist[::-1] for sublist in zipped_list]
            self.move_and_merge(flipped_matrix)
            flipped_matrix = [sublist[::-1] for sublist in self.board]
            self.board = [list(row) for row in zip(*flipped_matrix)]

        self.spawn_tile()

游戏主循环

游戏的主循环是游戏的心脏,它负责处理用户输入、重绘棋盘、更新屏幕显示以及退出游戏的一些操作。

# 游戏主逻辑
class Game:
    def __init__(self):
        self.board = Board()
        self.running = True

    def main_loop(self):
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT:
                        self.board.move('left')
                    elif event.key == pygame.K_RIGHT:
                        self.board.move('right')
                    elif event.key == pygame.K_UP:
                        self.board.move('up')
                    elif event.key == pygame.K_DOWN:
                        self.board.move('down')

以上就是2048游戏用Python实现的一些整体思路了,由于源码过长,没有给出整体的所有的源代码,需要的可以私信我。以下是游戏实现的效果图。

进一步探索

这个游戏虽然整个核心的逻辑是实现的,但用户交互部分还是很简陋的,如果你有兴趣,可以继续探究下去,以下是一些方向

1、用户界面改进:设计更美观的游戏界面,增加一些动画效果,比如方块合并的时候加一些效果,方块出现的时候也加一些,提升用户交互体验。

2、高级功能添加:实现撤销操作、游戏暂停、游戏结束、音效控制,甚至用户注册等高级功能。

3、多玩家支持:探索如何实现本地或在线的多玩家模式,排行榜功能

以上只是一些提示,有兴趣可以深究,正常用Python以及gpgame库都可以实现,需要源代码的可以点赞评论并在公众号中回复【2048】