导语

“嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~”

by——顾木子吖!

“刚睡醒,大佬你有什么事儿吖?”

by——全体成员!

上期给大家分享的超详细——简易版本的2048都吃透了没?咳咳咳......没吃透也没关系!

慢慢来,木木子一直在等你们崛起~哈哈哈哈 ,呐~ 现在这篇文章的话是上次承诺的一个升级版本的2048小游戏。

比之之前那款呢?有什么不同?

​那当然是大大的不同那,今天教大家写的这款是有界面的小程序,单单是有界面的这一点就可以超前面那款了,更加富有趣味性的撒~来,我们来看看!

正文

环境安装:

Python3、pycharm、Pygame模块等。

 pip install -i https://pypi.douban.com/simple/ pygame

配置文件:

音乐、背景、字体等。

import os'''FPS'''
FPS = 60
'''背景颜色'''
BG_COLOR = '#D3D3D3'
'''屏幕大小'''
SCREENSIZE = (650, 370)
'''保存当前最高分的文件'''
MAX_SCORE_FILEPATH = 'score'
'''字体路径'''
FONTPATH = os.path.join(os.getcwd(), 'resources/font/Gabriola.ttf')
'''背景音乐路径'''
BGMPATH = os.path.join(os.getcwd(), 'resources/audio/bgm.mp3')
'''其他一些必要的常量'''
MARGIN_SIZE = 10
BLOCK_SIZE = 80
GAME_MATRIX_SIZE = (4, 4)

定义2048游戏:

class Game2048(object):def __init__(self, matrix_size=(4, 4), max_score_filepath=None, **kwargs):# matrix_size: (num_rows, num_cols)self.matrix_size = matrix_size# 游戏最高分保存路径self.max_score_filepath = max_score_filepath# 初始化self.initialize()'''更新游戏状态'''def update(self):game_matrix_before = copy.deepcopy(self.game_matrix)self.move()if game_matrix_before != self.game_matrix: self.randomGenerateNumber()if self.score > self.max_score: self.max_score = self.score'''根据指定的方向, 移动所有数字块'''def move(self):# 提取非空数字def extract(array):array_new = []for item in array:if item != 'null': array_new.append(item)return array_new# 合并非空数字def merge(array):score = 0if len(array) < 2: return array, scorefor i in range(len(array)-1):if array[i] == 'null':breakif array[i] == array[i+1]:array[i] *= 2array.pop(i+1)array.append('null')score += array[i]return extract(array), score# 不需要移动的话直接returnif self.move_direction is None: return# 向上if self.move_direction == 'up':for j in range(self.matrix_size[1]):col = []for i in range(self.matrix_size[0]):col.append(self.game_matrix[i][j])col = extract(col)col.reverse()col, score = merge(col)self.score += scorecol.reverse()col = col + ['null',] * (self.matrix_size[0] - len(col))for i in range(self.matrix_size[0]):self.game_matrix[i][j] = col[i]# 向下elif self.move_direction == 'down':for j in range(self.matrix_size[1]):col = []for i in range(self.matrix_size[0]):col.append(self.game_matrix[i][j])col = extract(col)col, score = merge(col)self.score += scorecol = ['null',] * (self.matrix_size[0] - len(col)) + colfor i in range(self.matrix_size[0]):self.game_matrix[i][j] = col[i]# 向左elif self.move_direction == 'left':for idx, row in enumerate(copy.deepcopy(self.game_matrix)):row = extract(row)row.reverse()row, score = merge(row)self.score += scorerow.reverse()row = row + ['null',] * (self.matrix_size[1] - len(row))self.game_matrix[idx] = row# 向右elif self.move_direction == 'right':for idx, row in enumerate(copy.deepcopy(self.game_matrix)):row = extract(row)row, score = merge(row)self.score += scorerow = ['null',] * (self.matrix_size[1] - len(row)) + rowself.game_matrix[idx] = rowself.move_direction = None'''在新的位置随机生成数字'''def randomGenerateNumber(self):empty_pos = []for i in range(self.matrix_size[0]):for j in range(self.matrix_size[1]):if self.game_matrix[i][j] == 'null': empty_pos.append([i, j])i, j = random.choice(empty_pos)self.game_matrix[i][j] = 2 if random.random() > 0.1 else 4'''初始化'''def initialize(self):self.game_matrix = [['null' for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]self.score = 0self.max_score = self.readMaxScore()self.move_direction = Noneself.randomGenerateNumber()self.randomGenerateNumber()'''设置移动方向'''def setDirection(self, direction):assert direction in ['up', 'down', 'left', 'right']self.move_direction = direction'''保存最高分'''def saveMaxScore(self):f = open(self.max_score_filepath, 'w', encoding='utf-8')f.write(str(self.max_score))f.close()'''读取游戏最高分'''def readMaxScore(self):try:f = open(self.max_score_filepath, 'r', encoding='utf-8')score = int(f.read().strip())f.close()return scoreexcept:return 0'''游戏是否结束'''@propertydef isgameover(self):for i in range(self.matrix_size[0]):for j in range(self.matrix_size[1]):if self.game_matrix[i][j] == 'null': return Falseif (i == self.matrix_size[0] - 1) and (j == self.matrix_size[1] - 1):continueelif (i == self.matrix_size[0] - 1):if (self.game_matrix[i][j] == self.game_matrix[i][j+1]):return Falseelif (j == self.matrix_size[1] - 1):if (self.game_matrix[i][j] == self.game_matrix[i+1][j]):return Falseelse:if (self.game_matrix[i][j] == self.game_matrix[i+1][j]) or (self.game_matrix[i][j] == self.game_matrix[i][j+1]):return Falsereturn True

然后设置不同的颜色。

不同的数字2-4-8等等组合成不同的数字颜色相应的变化。

颜色展示:

'''根据方格当前的分数获得[方格背景颜色, 方格里的字体颜色]'''
def getColorByNumber(number):number2color_dict = {2: ['#eee4da', '#776e65'], 4: ['#ede0c8', '#776e65'], 8: ['#f2b179', '#f9f6f2'],16: ['#f59563', '#f9f6f2'], 32: ['#f67c5f', '#f9f6f2'], 64: ['#f65e3b', '#f9f6f2'],128: ['#edcf72', '#f9f6f2'], 256: ['#edcc61', '#f9f6f2'], 512: ['#edc850', '#f9f6f2'],1024: ['#edc53f', '#f9f6f2'], 2048: ['#edc22e', '#f9f6f2'], 4096: ['#eee4da', '#776e65'],8192: ['#edc22e', '#f9f6f2'], 16384: ['#f2b179', '#776e65'], 32768: ['#f59563', '#776e65'],65536: ['#f67c5f', '#f9f6f2'], 'null': ['#9e948a', None]}return number2color_dict[number]'''将2048游戏的当前数字排列画到屏幕上'''
def drawGameMatrix(screen, game_matrix, cfg):for i in range(len(game_matrix)):for j in range(len(game_matrix[i])):number = game_matrix[i][j]x = cfg.MARGIN_SIZE * (j + 1) + cfg.BLOCK_SIZE * jy = cfg.MARGIN_SIZE * (i + 1) + cfg.BLOCK_SIZE * ipygame.draw.rect(screen, pygame.Color(getColorByNumber(number)[0]), (x, y, cfg.BLOCK_SIZE, cfg.BLOCK_SIZE))if number != 'null':font_color = pygame.Color(getColorByNumber(number)[1])font_size = cfg.BLOCK_SIZE - 10 * len(str(number))font = pygame.font.Font(cfg.FONTPATH, font_size)text = font.render(str(number), True, font_color)text_rect = text.get_rect()text_rect.centerx, text_rect.centery = x + cfg.BLOCK_SIZE / 2, y + cfg.BLOCK_SIZE / 2screen.blit(text, text_rect)

游戏界面添加额外的元素。

如下图:玩法介绍、分数显示。

'''将游戏的最高分和当前分数画到屏幕上'''
def drawScore(screen, score, max_score, cfg):font_color = (255, 255, 255)font_size = 30font = pygame.font.Font(cfg.FONTPATH, font_size)text_max_score = font.render('Best: %s' % max_score, True, font_color)text_score = font.render('Score: %s' % score, True, font_color)start_x = cfg.BLOCK_SIZE * cfg.GAME_MATRIX_SIZE[1] + cfg.MARGIN_SIZE * (cfg.GAME_MATRIX_SIZE[1] + 1)screen.blit(text_max_score, (start_x+10, 10))screen.blit(text_score, (start_x+10, 20+text_score.get_rect().height))start_y = 30 + text_score.get_rect().height + text_max_score.get_rect().heightreturn (start_x, start_y)'''游戏介绍'''
def drawGameIntro(screen, start_x, start_y, cfg):start_y += 40font_color = (0, 0, 0)font_size_big = 30font_size_small = 20font_big = pygame.font.Font(cfg.FONTPATH, font_size_big)font_small = pygame.font.Font(cfg.FONTPATH, font_size_small)intros = ['Game play:', ' Slide the keyboard up, down, left and right.', 'Combine two identical numbers', 'For example: 2 + 2 = 4, 4 + 4 = 8... Until 1024 + 1024 = 2048!', 'You win!']for idx, intro in enumerate(intros):font = font_big if idx == 0 else font_smalltext = font.render(intro, True, font_color)screen.blit(text, (start_x+10, start_y))start_y += text.get_rect().height + 10

游戏结束界面:

附源码:

def endInterface(screen, cfg):font_size_big = 60font_size_small = 30font_color = (255, 255, 255)font_big = pygame.font.Font(cfg.FONTPATH, font_size_big)font_small = pygame.font.Font(cfg.FONTPATH, font_size_small)surface = screen.convert_alpha()surface.fill((127, 255, 212, 2))text = font_big.render('Game Over!', True, font_color)text_rect = text.get_rect()text_rect.centerx, text_rect.centery = cfg.SCREENSIZE[0]/2, cfg.SCREENSIZE[1]/2-50surface.blit(text, text_rect)button_width, button_height = 100, 40button_start_x_left = cfg.SCREENSIZE[0] / 2 - button_width - 20button_start_x_right = cfg.SCREENSIZE[0] / 2 + 20button_start_y = cfg.SCREENSIZE[1] / 2 - button_height / 2 + 20pygame.draw.rect(surface, (0, 255, 255), (button_start_x_left, button_start_y, button_width, button_height))text_restart = font_small.render('Restart', True, font_color)text_restart_rect = text_restart.get_rect()text_restart_rect.centerx, text_restart_rect.centery = button_start_x_left + button_width / 2, button_start_y + button_height / 2surface.blit(text_restart, text_restart_rect)pygame.draw.rect(surface, (0, 255, 255), (button_start_x_right, button_start_y, button_width, button_height))text_quit = font_small.render('Quit', True, font_color)text_quit_rect = text_quit.get_rect()text_quit_rect.centerx, text_quit_rect.centery = button_start_x_right + button_width / 2, button_start_y + button_height / 2surface.blit(text_quit, text_quit_rect)while True:screen.blit(surface, (0, 0))for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.MOUSEBUTTONDOWN and event.button:if text_quit_rect.collidepoint(pygame.mouse.get_pos()):return Falseif text_restart_rect.collidepoint(pygame.mouse.get_pos()):return Truepygame.display.update()

主程序:

def main(cfg):# 游戏初始化pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('2048小游戏升级版')# 播放背景音乐pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.play(-1)# 实例化2048游戏game_2048 = Game2048(matrix_size=cfg.GAME_MATRIX_SIZE, max_score_filepath=cfg.MAX_SCORE_FILEPATH)# 游戏主循环clock = pygame.time.Clock()is_running = Truewhile is_running:screen.fill(pygame.Color(cfg.BG_COLOR))# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:game_2048.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])# --更新游戏状态game_2048.update()if game_2048.isgameover:game_2048.saveMaxScore()is_running = False# --将必要的游戏元素画到屏幕上drawGameMatrix(screen, game_2048.game_matrix, cfg)start_x, start_y = drawScore(screen, game_2048.score, game_2048.max_score, cfg)drawGameIntro(screen, start_x, start_y, cfg)# --屏幕更新pygame.display.update()clock.tick(cfg.FPS)return endInterface(screen, cfg)'''run'''
if __name__ == '__main__':while True:if not main(cfg):break

2048游戏效果如下图所示:

本来是想给大家截一张2048的图的,但是玩了好几遍都卡死了,这图你们就将就着看叭~我尽力了!

总结

好啦!这篇升级版的2048小游戏就到这里结束啦,快来试试你能通关嘛?

Pygame实战:升级后的2048小游戏—解锁新花样,根本停不下来【附源码】相关推荐

  1. Pygame实战:升级后的2048小游戏—解锁新花样 根本停不下来

    导语 "嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~" by--梦雅! ​ "刚睡醒,大佬你有什么事儿吖?" by--全体成员! 上期给大家分享的超详细--简易版本的 ...

  2. 分享30个有趣的 Python小游戏,我能玩一天(附源码)

    大家好,今天给大家带来30个 Python 小游戏,喜欢记得点赞.一定要收藏! 文章目录 有手就行 1.吃金币 2.打乒乓 3.滑雪 4.并夕夕版飞机大战 5.打地鼠 简简单单 6.小恐龙 7.消消乐 ...

  3. Python嘎嘎涨知识的7个小游戏,玩过的都爱不释手(附源码,直接运行就可)

    前言 今天星期七,是一个快乐的日子.上班族不用上班,学生不用学习.我也不想分享太多的知识去为难大家,就给大家七个小游戏 吧,从周一玩到周日的那种,学会了记得来找我PK- 1.消消乐 玩法:三个相连就能 ...

  4. [原创]中国象棋翻翻棋,休闲,对战,娱乐,小游戏,jQuery小游戏,下载即用,代码注释全(附源码)

    ChessInvert 介绍 中国象棋翻翻棋,休闲,对战,娱乐,小游戏,在线 效果预览 开源许可证 使用 Apache-2.0 开源许可协议,商用请联系原创作者me. 使用说明 引入jQuery,及j ...

  5. 小程序云开发实现登录与注册(附源码)

    小程序云开发实现登录与注册(附源码) 1. 看效果 2.wxss <view class="v1"><!-- v2父容器 子view使用绝对布局 -->&l ...

  6. 【Java十大热门游戏合集】Java经典游戏项目(附源码课件

    家人们,我又来啦,今天我们来看一下学Java必练的10款游戏项目! 大家都知道学习编程必须要做的就是敲代码和做项目练手了,那项目有难有易,很多小伙伴不知道从哪里找项目来练习,今日我们来看一下初级项目中 ...

  7. Android 小项目之--数据存储【Files】(附源码)

    继上篇数据存储,现在我们来讲讲另外一种数据存储,Files.本篇讲述步骤如下: 1.温故而知新,复习四种数据存储的区别. 2.什么是 Files 数据存储. 3.什么是 Properties ? 4. ...

  8. Java实战小游戏《flapper Bird》完整版,含源码

    Flapper Bird 目录 一.前言 二.素材准备 1.背景图片 2.背景音乐 三.建立工程 四.代码实现 1.小鸟类 2. 地面类 3.  柱子类 4.  音乐类 5. 游戏类 五.效果展示 六 ...

  9. 用Python写一个双人对战足球小游戏,堪比国足的技术【附带源码】

    开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 这是一个 ...

最新文章

  1. 面向自动驾驶车辆的高效激光里程计(ICRA2021)
  2. PicoBlaze性能
  3. python运动目标检测与跟踪_基于OpenCV的运动目标检测与跟踪
  4. 他初中学历做开发,3年在北京买了房,超过了99%的程序员!
  5. oracle数据库定时同步工具,[每天自动同步一个数据库表的数据]sql server定时同步oracle数据表...
  6. 【HTML+CSS网页设计与布局 从入门到精通】第4章
  7. jmeter测试工具应用场景【测试帮日记公开课】
  8. Android中使用FragmentManager获得控件
  9. jQuery LigerUI API预览版发布
  10. rsync+inotify 实现数据实时同步
  11. pic单片机c语言 程序,PIC单片机C语言编程教程(1)
  12. NLPIR分词使用说明
  13. 阿里大鱼短信接口PHP版,精简版阿里大鱼短信SMS发送接口PHP实例
  14. 27个懒人正规快速赚钱项目
  15. C2AE: Class Conditioned Auto-Encoder for Open-set Recognition(CVPR 2019)部分翻译
  16. BLUES吉他学习笔记005 bluesrv[9]
  17. 路由器注册灯闪烁没网络
  18. 【3分钟秒懂】MCU启动流程详解 基于NXP MPC574xG
  19. c语言访问mysql,C语言访问mysql数据库
  20. 好心情:长期服用精神药物,需监测哪些指标?

热门文章

  1. 机器学习中的数学——Adam(Adaptive Moments)
  2. 解析雅虎与百度流氓原理-IE劫持
  3. C warning:statement with no effect [-Wunused-va...
  4. (西安电子科技大学,汤小丹等)计算机操作系统——第二章、进程的描述与控制
  5. 四元数和欧拉角的个人理解
  6. 【GDOI 2016 Day1】第四题 疯狂动物城
  7. 荷混凝柱截StructureРoint spColumn 5.50 1CD载筋
  8. 摄影光学与镜头pdf_北京电影学院摄影专业系列教材:摄影光学与镜头
  9. python的re_research是什么意思_research在线翻译_英语_读音_用法_例句_海词词典
  10. AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第10章:ORGANIZING FILES