如何制作游戏(如何制作游戏)

前言:

本期我们将制作一个拼图小游戏。让我们愉快地开始吧~~~

先来看看效果是这样子的:

如何制作游戏(如何制作游戏)

开发工具

**Python版本:**3.6.4

私信小编01即可获取大量python学习资源

相关模块:

pygame模块;

以及一些Python自带的模块

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理介绍游戏简介:

将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状。游戏目标为通过移动非空白块将随机摆放获得的图像恢复成原图像的模样,且规定移动操作仅存在于非空白块移动到空白块。

例如下图所示:如何制作游戏(如何制作游戏)

逐步实现:Step1:游戏初始界面

既然是游戏,总得有个初始界面吧?

OK,我们先写一个游戏初始界面:

'''显示游戏开始界面'''def ShowStartInterface(screen, width, height):screen.fill(cfg.BACKGROUNDCOLOR)tfont = pygame.font.Font(cfg.FONTPATH, width//4)cfont = pygame.font.Font(cfg.FONTPATH, width//20)title = tfont.render('拼图游戏', True, cfg.RED)content1 = cfont.render('按H或M或L键开始游戏', True, cfg.BLUE)content2 = cfont.render('H为5*5模式, M为4*4模式, L为3*3模式', True, cfg.BLUE)trect = title.get_rect()trect.midtop = (width/2, height/10)crect1 = content1.get_rect()crect1.midtop = (width/2, height/2.2)crect2 = content2.get_rect()crect2.midtop = (width/2, height/1.8)screen.blit(title, trect)screen.blit(content1, crect1)screen.blit(content2, crect2)while True:for event in pygame.event.get():if (event.type == pygame.QUIT) or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == ord('l'): return 3elif event.key == ord('m'): return 4elif event.key == ord('h'): return 5pygame.display.update()复制代码

根据玩家自身水平,可以选择不同难度的拼图游戏。

Step2:定义移动操作

定义移动操作的目的是为了移动拼图(好像是废话T_T),具体实现起来十分简单:

'''将空白Cell左边的Cell右移到空白Cell位置'''def moveR(board, blank_cell_idx, num_cols):if blank_cell_idx % num_cols == 0: return blank_cell_idxboard[blank_cell_idx-1], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx-1]return blank_cell_idx - 1'''将空白Cell右边的Cell左移到空白Cell位置'''def moveL(board, blank_cell_idx, num_cols):if (blank_cell_idx+1) % num_cols == 0: return blank_cell_idxboard[blank_cell_idx+1], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx+1]return blank_cell_idx + 1'''将空白Cell上边的Cell下移到空白Cell位置'''def moveD(board, blank_cell_idx, num_cols):if blank_cell_idx < num_cols: return blank_cell_idxboard[blank_cell_idx-num_cols], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx-num_cols]return blank_cell_idx - num_cols'''将空白Cell下边的Cell上移到空白Cell位置'''def moveU(board, blank_cell_idx, num_rows, num_cols):if blank_cell_idx >= (num_rows-1) * num_cols: return blank_cell_idxboard[blank_cell_idx+num_cols], board[blank_cell_idx] = board[blank_cell_idx], board[blank_cell_idx+num_cols]return blank_cell_idx + num_cols复制代码

Step3:游戏主界面

OK,有了前面的铺垫,我们可以开始实现我们的游戏主界面了。

首先,我们需要打乱拼图, 但是随机打乱很可能导致拼图无解,因此我们通过随机移动拼图来实现打乱拼图的效果 ,这也是我们先定义拼图的移动操作的主要原因:

'''获得打乱的拼图'''def CreateBoard(num_rows, num_cols, num_cells):board = []for i in range(num_cells): board.append(i)# 去掉右下角那块blank_cell_idx = num_cells - 1board[blank_cell_idx] = -1for i in range(cfg.NUMRANDOM):# 0: left, 1: right, 2: up, 3: downdirection = random.randint(0, 3)if direction == 0: blank_cell_idx = moveL(board, blank_cell_idx, num_cols)elif direction == 1: blank_cell_idx = moveR(board, blank_cell_idx, num_cols)elif direction == 2: blank_cell_idx = moveU(board, blank_cell_idx, num_rows, num_cols)elif direction == 3: blank_cell_idx = moveD(board, blank_cell_idx, num_cols)return board, blank_cell_idx复制代码

游戏主界面初始化:

如何制作游戏(如何制作游戏)

最后实现主界面的显示刷新以及事件响应等功能:

while True:game_board, blank_cell_idx = CreateBoard(num_rows, num_cols, num_cells)if not isGameOver(game_board, size):break# 游戏主循环is_running = Truewhile is_running:# --事件捕获for event in pygame.event.get():# ----退出游戏if (event.type == pygame.QUIT) or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):pygame.quit()sys.exit()# ----键盘操作elif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT or event.key == ord('a'):blank_cell_idx = moveL(game_board, blank_cell_idx, num_cols)elif event.key == pygame.K_RIGHT or event.key == ord('d'):blank_cell_idx = moveR(game_board, blank_cell_idx, num_cols)elif event.key == pygame.K_UP or event.key == ord('w'):blank_cell_idx = moveU(game_board, blank_cell_idx, num_rows, num_cols)elif event.key == pygame.K_DOWN or event.key == ord('s'):blank_cell_idx = moveD(game_board, blank_cell_idx, num_cols)# ----鼠标操作elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:x, y = pygame.mouse.get_pos()x_pos = x // cell_widthy_pos = y // cell_heightidx = x_pos + y_pos * num_colsif idx == blank_cell_idx-1:blank_cell_idx = moveR(game_board, blank_cell_idx, num_cols)elif idx == blank_cell_idx+1:blank_cell_idx = moveL(game_board, blank_cell_idx, num_cols)elif idx == blank_cell_idx+num_cols:blank_cell_idx = moveU(game_board, blank_cell_idx, num_rows, num_cols)elif idx == blank_cell_idx-num_cols:blank_cell_idx = moveD(game_board, blank_cell_idx, num_cols)# --判断游戏是否结束if isGameOver(game_board, size):game_board[blank_cell_idx] = num_cells - 1is_running = False# --更新屏幕screen.fill(cfg.BACKGROUNDCOLOR)for i in range(num_cells):if game_board[i] == -1:continuex_pos = i // num_colsy_pos = i % num_colsrect = pygame.Rect(y_pos*cell_width, x_pos*cell_height, cell_width, cell_height)img_area = pygame.Rect((game_board[i]%num_cols)*cell_width, (game_board[i]//num_cols)*cell_height, cell_width, cell_height)screen.blit(game_img_used, rect, img_area)for i in range(num_cols+1):pygame.draw.line(screen, cfg.BLACK, (i*cell_width, 0), (i*cell_width, game_img_used_rect.height))for i in range(num_rows+1):pygame.draw.line(screen, cfg.BLACK, (0, i*cell_height), (game_img_used_rect.width, i*cell_height))pygame.display.update()clock.tick(cfg.FPS)复制代码

Step4:游戏结束界面

当玩家完成拼图后,需要显示游戏结束界面,和游戏初始界面类似,实现起来都比较简单:

'''显示游戏结束界面'''def ShowEndInterface(screen, width, height):screen.fill(cfg.BACKGROUNDCOLOR)font = pygame.font.Font(cfg.FONTPATH, width//15)title = font.render('恭喜! 你成功完成了拼图!', True, (233, 150, 122))rect = title.get_rect()rect.midtop = (width/2, height/2.5)screen.blit(title, rect)pygame.display.update()while True:for event in pygame.event.get():if (event.type == pygame.QUIT) or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):pygame.quit()sys.exit()pygame.display.update()复制代码

文章到这里就结束了,感谢你的观看

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 绝句二首杜甫的意思(古诗内容及译文解读)

    绝句二首 唐代:杜甫 迟日江山丽,春风花草香。泥融飞燕子,沙暖睡鸳鸯。 译文: 沐浴在春光下的江山显得格外秀丽,春风送来花草的芳香。泥土随着春天的来临而融化变得松软,燕子衔泥筑巢,…

    2022年5月20日
  • 发视频怎么挣钱(做短视频是怎么赚钱的)

    最近这几年,短视频行业发展得越来越迅速,可以说是现下最流行的一种形式。短视频不仅占用了用户大量的碎片时间,而且短视频的时间黏性更强、用户群体更广、变现方式越来越多,所以越来越多的人…

    2022年3月21日 投稿
  • 华为mate20x价格(华为mate20x售价是多少)

    这款手机有5G版和4G版的,这篇文章说的是4G版的,我顺带把5G版的说一下吧,就是续航和快充不太一样,剩下的基本上是差不多的。这款手机是18年10月份发布的了,到现在也有挺长一段时…

    2022年3月21日
  • mp3剪辑软件哪个好(免费的mp3剪辑软件)

    好用的音频剪辑软件推荐和介绍 对音频剪辑有需求或者感兴趣的人,可一定要好好看这篇文章哦~ 有的小伙伴不太喜欢收费的软件,那么这里推荐使用GoldWave,这是一款专业版的数字音乐编…

    2022年3月6日 投稿
  • 农村养殖业什么前景好(农村养殖什么好养又好卖)

    当前经济形势不乐观,整个市场消费疲软,但衣食住行是刚需,特别是在食品消费这方面,所以说,当下农村养殖业依然充满商机。我在这里给大家推荐农村最有潜力的4种养殖,最后一种可以年入百万。…

    2022年5月30日 投稿
  • 如何取个好名字(怎么样取名字)

    我国的姓名文化由来已久,现代人起名虽然不像古人起名那么繁琐复杂了,但也是十分重视。但是奈何很多不明白起名的门道,所以常常有不少人会找小编来起名,而这些家长的起名要求大致总结起来,就…

    2022年6月8日
  • 企业搜索软件哪个好(企业搜索软件哪个好)

    作为一名工作多年的程序员,我在工作过程中总结整理了8款超级好用的办公软件,建议新入行的程序员都去体验一下: 1. Pixso Pixso是近年来新兴的一款综合设计平台,它的最大功能…

    2022年6月11日 投稿
  • 立知丨周长公式 周长怎么算的公式

      环绕有限面积的区域边缘的长度积分,叫做周长,也就是图形一周的长度。周长通常用字母C表示,不同图形,周长公式不同:   圆:C=2πr,其中r为圆的半径。   三角形:C= a+…

    2022年8月24日
  • 杂志软件推荐(手机上看杂志的软件)

      现在的杂志报刊的发展在面临着转型升级,由传统的纸质媒体的发展渐渐转向互联网媒体与纸质媒体相结合发展的模式。现在人们通过APP就可以在线阅读数字杂志也可以在线订阅纸质杂志。娱乐杂…

    2022年2月16日
  • 玄幻小说排行(十大玄幻小说排名)

    大家好,我是冬日暖阳,今天给大家带来的是,几本评分高达9.8的极品玄幻小说,本本无可挑剔,老书虫的最爱! 《凌天传说》作者:风凌天下 我名凌天,我欲凌天! 穿越到异世的武学天才,超…

    2022年6月20日 投稿
品牌推广 在线咨询
返回顶部