文学起点网
当前位置: 首页 文学百科

pygame做游戏怎么找bug(升级后的2048小游戏)

时间:2023-07-07 作者: 小编 阅读量: 1 栏目名: 文学百科

升级后的2048小游戏导语“嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~”by——顾木子吖!​“刚睡醒,大佬你有什么事儿吖?”by——全体成员!上期给大家分享的超详细——简易版本的2048都吃透了没?咳咳咳......没吃透也没。

导语

“嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~” 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 = 10BLOCK_SIZE = 80GAME_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 * (j1)cfg.BLOCK_SIZE * jy = cfg.MARGIN_SIZE * (i1)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 = xcfg.BLOCK_SIZE / 2, ycfg.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 = 30text_score.get_rect().heighttext_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: 22 = 4, 44 = 8... Until 10241024 = 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().height10

游戏结束界面:

附源码:

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] / 220button_start_y = cfg.SCREENSIZE[1] / 2 - button_height / 220pygame.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_leftbutton_width / 2, button_start_ybutton_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_rightbutton_width / 2, button_start_ybutton_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小游戏就到这里结束啦,快来试试你能通关嘛?

免费源码领取处:

如需完整的项目源码 素材源码基地见:#私信小编06#即可获取免费的福利!

你们的支持是我最大的动力!!记得三连哦~mua 欢迎大家阅读往期的文章哦~

    推荐阅读
  • 荷塘月色简笔画彩图(荷塘的场景图简笔画)

    今日份简笔画荷塘月色.感恩日记1.,我来为整理几张简单漂亮的荷塘月色简笔画彩图?以下简笔画图片总有一款是你喜欢的,希望对你有帮助来看看吧!荷塘月色简笔画彩图今日份简笔画荷塘月色.感恩日记1.荷塘月色好看的儿童画图片儿童简笔画大全荷塘月色简笔画儿童画

  • 直硬头发软化前后效果图(头发软化前后效果图)

    可以使头发变软,变柔顺,变贴服,且价格也很便宜,普通的美发沙龙价格为50到80元左右,软化比较自然。头发软化后几天可以洗刚做完软化2至3天不要洗头,刚做完软化不要用力拉头发,会有损发质和效果。软化也是伤头发的,不过比不停地做一次性夹头发而言小很多,如果是短发做软化还是不错的。如果想让头发蓬蓬的,最好不要全头做软化,甚至不建议做软化。具体情况,建议咨询理发师。用药水要用好一点的,对头发伤害才不会很大。

  • 赞美运动员的话(赞美运动员的话有什么)

    年轻的我们自信飞扬,青春的气息如同出生的朝阳,蓬勃的力量如同阳光的挥洒此时此刻,跑道便是我们精彩的舞台,声声加油便是我们最高的奖项论何成功,谈何荣辱,心中的信念只有一个:拼搏,我来为大家科普一下关于赞美运动员的话?赞美运动员的话年轻的我们自信飞扬,青春的气息如同出生的朝阳,蓬勃的力量如同阳光的挥洒。所有的努力都是为了迎接这一刹那,所有的拼搏都是为了这一声令下。

  • 长安uni-k车主反映这款车怎么样(新车长安UNI-K登场)

    据长安汽车最新消息,中大型SUVUNI-K官图曝光,这是长安UNI系列的第二款车型。新车将搭载蓝鲸系列2.0T发动机并匹配8AT变速箱,将于广州车展首发亮相。新车亮点1.采用了全新的“V”型面设计和无边界格栅。新车概况新车前脸依然采用无边界设计并融入了V型面概念,不同于UNI-T,UNI-K的大灯位置设计在了最上方。车尾方面采用了时下流行的贯穿式尾灯设计,与UNI-T的V型后导流造型不同,UNI-K采用了新的航天器式造型,立式尾灯十分显眼。

  • 渡劫经典语录(关于渡劫的语录精选)

    情到深处人孤独,爱至穷时尽沧桑堕落的天使啊,你无知的游走着。我将于茫茫人海中访我唯一灵魂之伴侣;得之,我幸;不得,我命。玲珑骰子安红豆,入骨相思君知否。于千万人之中遇见你所遇见的人,于千万年时间无涯的荒野里,没有早一步,也没有晚一步,刚巧赶上了。生命是一朵千瓣莲花,我拒绝了绽放的同时,我也拒绝了枯萎和零落。就算哭泣也要皱眉优雅,就算失败也要转身潇洒。之后我也学会了阳奉阴违,发生了什么与我再无所谓。

  • 孤城闭什么时候上映(谁是主演)

    以下内容大家不妨参考一二希望能帮到您!孤城闭什么时候上映《孤城闭》将于2020年起在湖南卫视上映播出。该剧主要由王凯、江疏影、任敏、杨玏、边程、叶祖新、喻恩泰、王楚然、刘钧、孙坚等主演。《孤城闭》改编自米兰lady同名小说,以北宋为背景,在风起云涌的朝堂之事与剪不断理还乱的儿女情长之间,还原了一个复杂而真实的宋仁宗。

  • 大众朗逸所有灯图解(认识汽车灯图解)

    大众朗逸所有灯图解作为新手,汽车灯光就是一道难题,下面我们一起通过图解来认识一下汽车各种灯光吧。双闪灯的作用是当车辆发生意外情况后,引起其他车辆警惕,防止发生追尾事故。当踩下制动踏板后,制动灯立即亮起,并发出红色灯光,提醒后方车辆。倒车灯是白色,作用是为了照亮车尾的路面,减少倒车时盲区,另外也是对后方的提醒。

  • 雪里红的腌制方法(做雪里红腌菜的步骤)

    下面更多详细答案一起来看看吧!雪里红的腌制方法雪里红摘干净,根部用刀劈开,正一层反一层放入盆中,取盐均匀地洒在雪里红上,腌制1-2天。烧开水放凉,加盐,搅拌均匀,盐水倒入雪里红中泡制一天。泡好的雪里红捆成一小捆放入密封罐,倒入泡雪里红的盐水,盖好密封罐,即吃即取。

  • 郑州婚纱照推荐哪家好(郑州拍婚纱照团购)

    中国红喜嫁秀爆朋友圈的婚纱照中式婚纱照新中式婚纱照婚纱照风格高级感婚纱照婚纱照秀禾服的中式嫁衣,是完美诠释了东方女性温婉古典美。让人完全移不开目光~每一个女孩子都应该拥有这样华丽的喜嫁风太精致完全属于中式婚纱照的浪漫感~

  • 胎梦最准的位置(从胎梦看看你腹中的孩子给你暗示了吗)

    估计生完孩子和正在孕期的妈妈都会经历过这种事情,就是我们会经常做梦,而且会梦见一些动物植物什么的,这在老人眼里属于“胎梦”。你梦见的什么会预示着即将出生的宝宝是男孩还是女孩。你的胎梦准不准,来看看一下别人的胎梦。哈哈,看来有些胎梦还是挺准的,或许都是巧合吧,总之,宝宝来了就是我们的命中注定。