Python小游戏——Pygame制作2048小游戏
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小游戏相关推荐
- 使用Pygame制作2048小游戏
好久没有写文章了,暑假一直没有怎么学习计算机方面的相关知识,不过倒是坚持背了一个多月的单词红宝书,看了汤神的基础课.真的没想到自己居然也能有毅力背了150多页的单词,还写完了一本正反面的字帖这些事以前 ...
- 用App Designer 制作2048小游戏
用App Designer 制作2048小游戏 用App Designer制作的2048,MATLAB版本是2020b.记录下创作思路,以免日后忘记. APP界面设计 APP界面如下,为了好玩,还加入 ...
- Pygame制作答题类游戏的实现
代码地址如下: http://www.demodashi.com/demo/13495.html 概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程 ...
- Love2D游戏引擎制作贪吃蛇游戏
预览游戏 love2d游戏引擎重要函数 详情: love.load:当游戏开始时被调用且仅调用一次 love.draw:回调函数,每帧更新一次游戏画面 love.update:回调函数,每帧更新一次游 ...
- 次时代游戏的制作流程以及游戏美术需要掌握哪些基本软件
我想很多接触游戏开发引擎的小伙伴们应该对"次世代建模"这个词都很熟悉,也有可能你是第一次接触这个词,觉得这是一门很复杂的技术,其实只要你用对方法去学习,就会没有那么复杂了. 本文在 ...
- 微信怎么制作小程序?制作微信小程序流程
现在即使小程序已经非常普及了,依然也是有很多人加入到小程序的大队伍中,纷纷制作自己的微信小程序.那么微信怎么制作小程序?制作微信小程序流程又是什么呢?今天就带大家一起来看看. 微信怎么制作小程序?制作 ...
- 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...
- 如何用python制作五子棋游戏_Python制作打地鼠小游戏
原文链接 Python制作小游戏(二十一)mp.weixin.qq.com 效果展示 打地鼠小游戏https://www.zhihu.com/video/1200492442610450432 简介 ...
- html2048游戏算法逻辑,2048小游戏算法解析
数组转换 为了方便理解,我们使用二维数组来进行分析 2048 的算法逻辑. 首先我们简单的了解一下游戏玩法: 简言之,就是通过上.下.左.右移动,使相邻的相同元素进行合并,进而数字相加得到 2048的 ...
最新文章
- Android自带的emoji表情的使用
- 7-26复习重载并实现重载部分符号
- 《Go语言圣经》学习笔记 第八章 Groroutines和Channels
- javabean反射改字段内容_java反射机制给实体类相同字段自动赋值实例
- Redmine环境搭建
- 【javascript】js实现复制、粘贴
- idle点开没反应_翟天临、靳东,一个人越是没文化越是喜欢装
- 【干货】数字经济百项场景.pdf(附下载链接)
- 2018年AI和ML(NLP,计算机视觉,强化学习)技术概述和2019年趋势
- 彻底搞懂“红黑树”......
- c语言自学方式,c语言学习方法
- Vivado的安装以及使用_入门
- MOS 的TJ TA TC和功耗之类的计算
- 数据存储设备的发展历史
- DANN loss/acc振荡
- 【Redis | 黑马点评 + 思维导图】分布式锁
- sphinx全文检索之PHP使用教程
- 总结项目笔记Demo
- Android adb shell dumpsys activity broadcasts分析
- 虚拟信用卡(VCC)对比实体信用卡有哪些特点和优势?