pygame之2048小游戏

初学python,发现看网上的python理论太过枯燥。
哎嘿~~干脆直接弄个小游戏叭,一边学习,一边写代码。

备注:
1.很多地方我尽量注解,方便大家观看。
2.完整代码在最末的代码片,复制就能用。

一、导入的库

import sys
import random
import pygame

二、全局变量

1.每个语句边上都有注解。
2.方块的颜色使用了经典2048游戏颜色。

pygame.init()  # 初始化pygame()
size = 100  # 每个游戏方格的大小
queue = 4  # 初始设置为4X4阵列
game_lis = []  # 存放
background_color = (255, 239, 213)  # 背景颜色
Dividingline_color = (255, 222, 173)  # 分割线颜色
Dividingline_width = 15  # 分割线宽度score_height = 120  # 得分区的高度
score_width = 140  # 得分区的宽度
score_color = (205, 193, 180)  # 得分字体颜色
font1 = pygame.font.SysFont('SimHei', 50)  # 得分区域字体显示黑体24
font_pos_x = Dividingline_width  # 得分区域字体位置的X坐标
font_pos_y = int(font1.size('得分')[1])  # 得分区域字体位置的Y坐标
score = 0  # 得分初始值为0font3 = pygame.font.Font(None, 50)  # 数字字体
black = (0, 0, 0)  # 数字颜色screen_height = (((size + Dividingline_width) * queue) + score_height + Dividingline_width * 2)  # 屏幕高度
screen_width = (((size + Dividingline_width) * queue) + Dividingline_width)  # 屏幕宽度colors = {0: (205, 193, 180),  # 各种方块对应的颜色2: (238, 228, 218),4: (237, 224, 200),8: (242, 177, 121),16: (245, 149, 99),32: (246, 124, 95),64: (246, 94, 59),128: (237, 207, 114),256: (237, 204, 98),512: (237, 200, 80),1024: (237, 197, 63),2048: (225, 187, 0)}

三、绘制游戏背景

这部分代码片包括游戏背景颜色以及网格线。

# 绘制背景
def _draw_background(screen):screen.fill(background_color)Dividingline_width_half = int(Dividingline_width / 2)Difference = score_height + Dividingline_width + int(Dividingline_width / 2)for i in range(queue + 1):  # 绘制横线pygame.draw.line(screen, Dividingline_color,(0, i * (size + Dividingline_width) + Difference),(screen_height, i * (size + Dividingline_width) + Difference),Dividingline_width)for j in range(queue + 1):  # 绘制横线pygame.draw.line(screen, Dividingline_color,(Dividingline_width_half + j * (size + Dividingline_width), Difference),(Dividingline_width_half + j * (size + Dividingline_width), screen_height),Dividingline_width)

四、绘制得分区域

1.得分区是个可变化的区域,最省力的情况是只变化分数。
2.然鹅,我在主程序中设计的是循环调用,不停的覆盖之前的结果(整块得分区域)。
有没有大佬知道,如何在不覆盖的情况下显示动态的数字。

# 绘制得分区域
def _draw_score(screen, font, pos_x, pos_y):global scoreprint_text(screen, font, pos_x, 10, f'得分')print_text(screen, font, pos_x, pos_y + 6, f'{score}')# 得分区域
def print_text(screen, font, x, y, text):imgText = font.render(text, True, score_color)screen.blit(imgText, (x, y))

五、初始化游戏列表

这里是用二维阵列来存放游戏数字,初始全设置为0。

# 初始化游戏列表,存放2048数字
def _game_list():for i in range(queue):  # 初始设置全为0lis = []for j in range(queue):lis.append(0)game_lis.append(lis)

六、显示游戏方块和数字

1.显示游戏方块,方块颜色根据游戏列表里的值改变。
2.显示游戏数字。

# 显示游戏区域:游戏方块和数字
def _show_game(screen):for i in range(queue):for j in range(queue):rect_color = colors[game_lis[i][j]]  # 取出字典colors对应的值rect_position = [(j + 1) * Dividingline_width + j * size,  # 色块的位置Dividingline_width * (i + 2) + size * i + score_height]pygame.draw.rect(screen, rect_color, (rect_position, (size, size)), 0)  # 绘制色块if game_lis[i][j] != 0:  # 只有数列里不为0的时候才会输出textSurfaceObj = font3.render(str(game_lis[i][j]), True, black)  # get_rect()方法返回rect对象textRectObj = textSurfaceObj.get_rect()rect_position = [(j + 1) * Dividingline_width + (j + 0.5) * size,  # 数字的位置Dividingline_width * (i + 2) + size * (i + 0.5) + score_height]textRectObj.center = tuple(rect_position)screen.blit(textSurfaceObj, textRectObj)

七、产生随机数

在随机位置产生随机数

# 在随机位置产生随机数
def _random():random_num = random.randint(1, 2)  # 随机数num = pow(2, random_num)random_pos_x = random.randint(0, queue - 1)  # 随机X坐标random_pos_y = random.randint(0, queue - 1)  # 随机Y坐标if game_lis[random_pos_x][random_pos_y] == 0:game_lis[random_pos_x][random_pos_y] = numelse:_random()

八、按键控制-LEFT()

左方向键控制。

# 捕获键盘LEFT操作
def _LEFT():global scorefor i in range(queue):while 0 in game_lis[i]:game_lis[i].remove(0)for j in range(len(game_lis[i]) - 1):if game_lis[i][j] == game_lis[i][j + 1]:game_lis[i][j] = game_lis[i][j] + game_lis[i][j + 1]score = score + game_lis[i][j]game_lis[i][j + 1] = 0while 0 in game_lis[i]:game_lis[i].remove(0)lis = []for j in range(queue - len(game_lis[i])):lis.append(0)game_lis[i] = game_lis[i] + lis

九、按键控制-RIGHT()

右方向键控制。

# 捕获键盘RIGHT操作
def _RIGHT():global scorefor i in range(queue):while 0 in game_lis[i]:game_lis[i].remove(0)for j in range(len(game_lis[i]) - 1, 0, -1):if game_lis[i][j] == game_lis[i][j - 1]:game_lis[i][j] = game_lis[i][j] + game_lis[i][j - 1]score = score + game_lis[i][j]game_lis[i][j - 1] = 0while 0 in game_lis[i]:game_lis[i].remove(0)lis = []for j in range(queue - len(game_lis[i])):lis.append(0)game_lis[i] = lis + game_lis[i]

十、按键控制-UP()

上方向键控制,使用了列表转置。

def _UP():global scorelis = [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]]for i in range(queue):  # 整个列表顺时针旋转90度for j in range(queue):lis[i][j] = game_lis[queue - 1 - j][i]for i in range(queue):while 0 in lis[i]:lis[i].remove(0)for j in range(len(lis[i]) - 1, 0, -1):if lis[i][j] == lis[i][j - 1]:lis[i][j] = lis[i][j] + lis[i][j - 1]score = score + lis[i][j]lis[i][j - 1] = 0while 0 in lis[i]:lis[i].remove(0)list1 = []for j in range(queue - len(lis[i])):list1.append(0)lis[i] = list1 + lis[i]for i in range(queue):  # 整个列表逆时针旋转90度for j in range(queue):game_lis[i][j] = lis[j][queue - 1 - i]

十一、按键控制-DOWN()

下方向键控制,使用了列表转置。

def _DOWN():global scorelis = [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]]for i in range(queue):  # 整个列表顺时针旋转90度for j in range(queue):lis[i][j] = game_lis[queue - 1 - j][i]for i in range(queue):while 0 in lis[i]:lis[i].remove(0)for j in range(len(lis[i]) - 1):if lis[i][j] == lis[i][j + 1]:lis[i][j] = lis[i][j] + lis[i][j + 1]score = score + lis[i][j]lis[i][j + 1] = 0while 0 in lis[i]:lis[i].remove(0)list1 = []for j in range(queue - len(lis[i])):list1.append(0)lis[i] = lis[i] + list1for i in range(queue):  # 整个列表逆时针旋转90度for j in range(queue):game_lis[i][j] = lis[j][queue - 1 - i]

十二、主函数

def main():screen = pygame.display.set_mode((screen_width, screen_height))  # 建立游戏窗口pygame.display.set_caption('2048')  # 设置窗口标题_draw_background(screen)  # 绘制背景_game_list()  # 初始化游戏列表_show_game(screen)  # 显示游戏方块和数字_draw_score(screen, font1, font_pos_x, font_pos_y)  # 绘制得分区# 开始游戏_random()  # 产生随机数pygame.display.flip()  # 更新游戏_show_game(screen)  # 显示游戏方块和数字_draw_score(screen, font1, font_pos_x, font_pos_y)  # 绘制得分区while True:for event in pygame.event.get():  # get()获取事件的返回值if event.type == pygame.QUIT:  # 判断事件是否是退出事件,是则退出pygame.quit()  # 先退出pygame窗口sys.exit()  # 再退出pygame程序elif event.type == pygame.KEYDOWN:  # 捕获按键操作if event.key == pygame.K_LEFT:  # 按下左按键_LEFT()print("left")elif event.key == pygame.K_RIGHT:  # 按下右按键_RIGHT()print("right")elif event.key == pygame.K_UP:  # 按下上按键_UP()print("up")elif event.key == pygame.K_DOWN:  # 按下下按键_DOWN()print("down")else:print("False")pygame.display.flip()  # 更新游戏_draw_background(screen)  # 绘制背景_random()  # 产生随机数_show_game(screen)  # 显示游戏方块和数字_draw_score(screen, font1, font_pos_x, font_pos_y)  # 绘制得分区

结果图

1.开始界面

2.游戏界面

完整代码

直接复制就能使用。

import sys
import random
import pygamepygame.init()  # 初始化pygame()
size = 100  # 每个游戏方格的大小
queue = 4  # 初始设置为4X4阵列
game_lis = []  # 存放
background_color = (255, 239, 213)  # 背景颜色
Dividingline_color = (255, 222, 173)  # 分割线颜色
Dividingline_width = 15  # 分割线宽度score_height = 120  # 得分区的高度
score_width = 140  # 得分区的宽度
score_color = (205, 193, 180)  # 得分字体颜色
font1 = pygame.font.SysFont('SimHei', 50)  # 得分区域字体显示黑体24
font_pos_x = Dividingline_width  # 得分区域字体位置的X坐标
font_pos_y = int(font1.size('得分')[1])  # 得分区域字体位置的Y坐标
score = 0  # 得分初始值为0font3 = pygame.font.Font(None, 50)  # 数字字体
black = (0, 0, 0)  # 数字颜色screen_height = (((size + Dividingline_width) * queue) + score_height + Dividingline_width * 2)  # 屏幕高度
screen_width = (((size + Dividingline_width) * queue) + Dividingline_width)  # 屏幕宽度colors = {0: (205, 193, 180),  # 各种方块对应的颜色2: (238, 228, 218),4: (237, 224, 200),8: (242, 177, 121),16: (245, 149, 99),32: (246, 124, 95),64: (246, 94, 59),128: (237, 207, 114),256: (237, 204, 98),512: (237, 200, 80),1024: (237, 197, 63),2048: (225, 187, 0)}# 绘制背景
def _draw_background(screen):screen.fill(background_color)Dividingline_width_half = int(Dividingline_width / 2)Difference = score_height + Dividingline_width + int(Dividingline_width / 2)for i in range(queue + 1):  # 绘制横线pygame.draw.line(screen, Dividingline_color,(0, i * (size + Dividingline_width) + Difference),(screen_height, i * (size + Dividingline_width) + Difference),Dividingline_width)for j in range(queue + 1):  # 绘制横线pygame.draw.line(screen, Dividingline_color,(Dividingline_width_half + j * (size + Dividingline_width), Difference),(Dividingline_width_half + j * (size + Dividingline_width), screen_height),Dividingline_width)# 绘制得分区域
def _draw_score(screen, font, pos_x, pos_y):global scoreprint_text(screen, font, pos_x, 10, f'得分')print_text(screen, font, pos_x, pos_y + 6, f'{score}')# 得分区域
def print_text(screen, font, x, y, text):imgText = font.render(text, True, score_color)screen.blit(imgText, (x, y))# 初始化游戏列表,存放2048数字
def _game_list():for i in range(queue):  # 初始设置全为0lis = []for j in range(queue):lis.append(0)game_lis.append(lis)# 显示游戏区域:游戏方块和数字
def _show_game(screen):for i in range(queue):for j in range(queue):rect_color = colors[game_lis[i][j]]  # 取出字典colors对应的值rect_position = [(j + 1) * Dividingline_width + j * size,  # 色块的位置Dividingline_width * (i + 2) + size * i + score_height]pygame.draw.rect(screen, rect_color, (rect_position, (size, size)), 0)  # 绘制色块if game_lis[i][j] != 0:  # 只有数列里不为0的时候才会输出textSurfaceObj = font3.render(str(game_lis[i][j]), True, black)  # get_rect()方法返回rect对象textRectObj = textSurfaceObj.get_rect()rect_position = [(j + 1) * Dividingline_width + (j + 0.5) * size,  # 数字的位置Dividingline_width * (i + 2) + size * (i + 0.5) + score_height]textRectObj.center = tuple(rect_position)screen.blit(textSurfaceObj, textRectObj)# 在随机位置产生随机数
def _random():random_num = random.randint(1, 2)  # 随机数num = pow(2, random_num)random_pos_x = random.randint(0, queue - 1)  # 随机X坐标random_pos_y = random.randint(0, queue - 1)  # 随机Y坐标if game_lis[random_pos_x][random_pos_y] == 0:game_lis[random_pos_x][random_pos_y] = numelse:_random()# 捕获键盘LEFT操作
def _LEFT():global scorefor i in range(queue):while 0 in game_lis[i]:game_lis[i].remove(0)for j in range(len(game_lis[i]) - 1):if game_lis[i][j] == game_lis[i][j + 1]:game_lis[i][j] = game_lis[i][j] + game_lis[i][j + 1]score = score + game_lis[i][j]game_lis[i][j + 1] = 0while 0 in game_lis[i]:game_lis[i].remove(0)lis = []for j in range(queue - len(game_lis[i])):lis.append(0)game_lis[i] = game_lis[i] + lis# 捕获键盘RIGHT操作
def _RIGHT():global scorefor i in range(queue):while 0 in game_lis[i]:game_lis[i].remove(0)for j in range(len(game_lis[i]) - 1, 0, -1):if game_lis[i][j] == game_lis[i][j - 1]:game_lis[i][j] = game_lis[i][j] + game_lis[i][j - 1]score = score + game_lis[i][j]game_lis[i][j - 1] = 0while 0 in game_lis[i]:game_lis[i].remove(0)lis = []for j in range(queue - len(game_lis[i])):lis.append(0)game_lis[i] = lis + game_lis[i]# 获取键盘UP操作
def _UP():global scorelis = [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]]for i in range(queue):  # 整个列表顺时针旋转90度for j in range(queue):lis[i][j] = game_lis[queue - 1 - j][i]for i in range(queue):while 0 in lis[i]:lis[i].remove(0)for j in range(len(lis[i]) - 1, 0, -1):if lis[i][j] == lis[i][j - 1]:lis[i][j] = lis[i][j] + lis[i][j - 1]score = score + lis[i][j]lis[i][j - 1] = 0while 0 in lis[i]:lis[i].remove(0)list1 = []for j in range(queue - len(lis[i])):list1.append(0)lis[i] = list1 + lis[i]for i in range(queue):  # 整个列表逆时针旋转90度for j in range(queue):game_lis[i][j] = lis[j][queue - 1 - i]# 获取键盘DOWN操作
def _DOWN():global scorelis = [[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]]for i in range(queue):  # 整个列表顺时针旋转90度for j in range(queue):lis[i][j] = game_lis[queue - 1 - j][i]for i in range(queue):while 0 in lis[i]:lis[i].remove(0)for j in range(len(lis[i]) - 1):if lis[i][j] == lis[i][j + 1]:lis[i][j] = lis[i][j] + lis[i][j + 1]score = score + lis[i][j]lis[i][j + 1] = 0while 0 in lis[i]:lis[i].remove(0)list1 = []for j in range(queue - len(lis[i])):list1.append(0)lis[i] = lis[i] + list1for i in range(queue):  # 整个列表逆时针旋转90度for j in range(queue):game_lis[i][j] = lis[j][queue - 1 - i]# 主函数
def main():screen = pygame.display.set_mode((screen_width, screen_height))  # 建立游戏窗口pygame.display.set_caption('2048')  # 设置窗口标题_draw_background(screen)  # 绘制背景_game_list()  # 初始化游戏列表_show_game(screen)  # 显示游戏方块和数字_draw_score(screen, font1, font_pos_x, font_pos_y)  # 绘制得分区# 开始游戏_random()  # 产生随机数pygame.display.flip()  # 更新游戏_show_game(screen)  # 显示游戏方块和数字_draw_score(screen, font1, font_pos_x, font_pos_y)  # 绘制得分区while True:for event in pygame.event.get():  # get()获取事件的返回值if event.type == pygame.QUIT:  # 判断事件是否是退出事件,是则退出pygame.quit()  # 先退出pygame窗口sys.exit()  # 再退出pygame程序elif event.type == pygame.KEYDOWN:  # 捕获按键操作if event.key == pygame.K_LEFT:  # 按下左按键_LEFT()print("left")elif event.key == pygame.K_RIGHT:  # 按下右按键_RIGHT()print("right")elif event.key == pygame.K_UP:  # 按下上按键_UP()print("up")elif event.key == pygame.K_DOWN:  # 按下下按键_DOWN()print("down")else:print("False")pygame.display.flip()  # 更新游戏_draw_background(screen)  # 绘制背景_random()  # 产生随机数_show_game(screen)  # 显示游戏方块和数字_draw_score(screen, font1, font_pos_x, font_pos_y)  # 绘制得分区if __name__ == '__main__':main()

存在的问题

1.方向键控制不够灵活,偶尔需要按两边才会有反应 2.游戏结束了怎么办,没有弹出选项

Python小游戏——Pygame制作2048小游戏相关推荐

  1. 使用Pygame制作2048小游戏

    好久没有写文章了,暑假一直没有怎么学习计算机方面的相关知识,不过倒是坚持背了一个多月的单词红宝书,看了汤神的基础课.真的没想到自己居然也能有毅力背了150多页的单词,还写完了一本正反面的字帖这些事以前 ...

  2. 用App Designer 制作2048小游戏

    用App Designer 制作2048小游戏 用App Designer制作的2048,MATLAB版本是2020b.记录下创作思路,以免日后忘记. APP界面设计 APP界面如下,为了好玩,还加入 ...

  3. Pygame制作答题类游戏的实现

    代码地址如下: http://www.demodashi.com/demo/13495.html 概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程 ...

  4. Love2D游戏引擎制作贪吃蛇游戏

    预览游戏 love2d游戏引擎重要函数 详情: love.load:当游戏开始时被调用且仅调用一次 love.draw:回调函数,每帧更新一次游戏画面 love.update:回调函数,每帧更新一次游 ...

  5. 次时代游戏的制作流程以及游戏美术需要掌握哪些基本软件

    我想很多接触游戏开发引擎的小伙伴们应该对"次世代建模"这个词都很熟悉,也有可能你是第一次接触这个词,觉得这是一门很复杂的技术,其实只要你用对方法去学习,就会没有那么复杂了. 本文在 ...

  6. 微信怎么制作小程序?制作微信小程序流程

    现在即使小程序已经非常普及了,依然也是有很多人加入到小程序的大队伍中,纷纷制作自己的微信小程序.那么微信怎么制作小程序?制作微信小程序流程又是什么呢?今天就带大家一起来看看. 微信怎么制作小程序?制作 ...

  7. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

  8. 如何用python制作五子棋游戏_Python制作打地鼠小游戏

    原文链接 Python制作小游戏(二十一)​mp.weixin.qq.com 效果展示 打地鼠小游戏https://www.zhihu.com/video/1200492442610450432 简介 ...

  9. html2048游戏算法逻辑,2048小游戏算法解析

    数组转换 为了方便理解,我们使用二维数组来进行分析 2048 的算法逻辑. 首先我们简单的了解一下游戏玩法: 简言之,就是通过上.下.左.右移动,使相邻的相同元素进行合并,进而数字相加得到 2048的 ...

最新文章

  1. Android自带的emoji表情的使用
  2. 7-26复习重载并实现重载部分符号
  3. 《Go语言圣经》学习笔记 第八章 Groroutines和Channels
  4. javabean反射改字段内容_java反射机制给实体类相同字段自动赋值实例
  5. Redmine环境搭建
  6. 【javascript】js实现复制、粘贴
  7. idle点开没反应_翟天临、靳东,一个人越是没文化越是喜欢装
  8. 【干货】数字经济百项场景.pdf(附下载链接)
  9. 2018年AI和ML(NLP,计算机视觉,强化学习)技术概述和2019年趋势
  10. 彻底搞懂“红黑树”......
  11. c语言自学方式,c语言学习方法
  12. Vivado的安装以及使用_入门
  13. MOS 的TJ TA TC和功耗之类的计算
  14. 数据存储设备的发展历史
  15. DANN loss/acc振荡
  16. 【Redis | 黑马点评 + 思维导图】分布式锁
  17. sphinx全文检索之PHP使用教程
  18. 总结项目笔记Demo
  19. Android adb shell dumpsys activity broadcasts分析
  20. 虚拟信用卡(VCC)对比实体信用卡有哪些特点和优势?

热门文章

  1. 【图形学】04 数学部分(四、放射变换)
  2. MyIE4.0又回来了,GreenBrowser后续开发,重新开源,大赞
  3. Python计算程序运行时间秒级/毫秒级的两种方法datetime和time
  4. 房友系统服务器怎么看,房友系统服务器地址
  5. 推荐一个快速获取时间的插件 Moment.js
  6. 3.7V升压12V电路
  7. 8字磁力计较准的原理
  8. CDA lever-1 备考经验分享 转数据分析师CDA证书备考 考试相关说明
  9. 大一c语言考试选择题及答案,大一计算机基础期末考试试题「附答案」
  10. Flex 绘制跟随鼠标移动的十字交叉线