利用python画图的步骤(python小游戏代码)
admin
2023-09-14 17:27:32
0

前言:

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

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

开发工具

**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()复制代码

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

以上就是python小游戏代码(利用python画图的步骤)的相关内容了,更多精彩内容请关注!

相关内容

热门资讯

以军向也门3个港口的居民发布撤... 当地时间5月14日上午,以色列国防军发布警告,要求也门拉斯伊萨港、荷台达港和萨利夫港当地民众撤离。以...
微软将在全球裁员6000人,目... 当地时间5月13日,科技巨头微软表示,将在所有级别、团队和地区裁员3%,影响约6000人。微软发言人...
乌总统:若与普京会谈,全面停火... 乌克兰总统泽连斯基当地时间13日接受媒体采访时强调,如果普京愿意前往土耳其,他愿意与普京就和平问题进...
高校花75万买299元路由器!... “重庆三峡学院75万元采购防火墙实为299元路由器”事件持续引发关注,记者调查↓整起事件起始于今年4...
外交部:中方对美芬太尼反制仍然... 据央视新闻消息,今天,外交部发言人林剑表示,中美双方在日内瓦的经贸会谈达成多项积极共识,同意大幅降低...
最高人民检察院依法对陆克华决定... 记者今天(14日)从最高人民检察院获悉,重庆市委原常委、政法委原书记陆克华涉嫌受贿一案,由国家监察委...
古巴外长谴责美国再次将古列为“... 古巴外长罗德里格斯。视觉中国 资料图古巴外长罗德里格斯13日强烈谴责美国再次将古巴列入“反恐行动不合...
崔登荣任国家游泳队总教练 5月14日,全国游泳项目训练工作会议在深圳召开,会议宣布了崔登荣为国家游泳队新周期的总教练。国家体育...
我国成功发射太空计算卫星星座 北京时间2025年5月14日12时12分,我国在酒泉卫星发射中心使用长征二号丁运载火箭,成功将太空计...
台行政机构网站删除“汉人”改为... 国务院台办14日举行的例行新闻发布会上,有记者问:近日,台行政机构网站有关台湾人口情况介绍中删除“汉...
中国至越南河内国际道路运输线路... 5月14日10点40分,随着发车指令声响,搭载着电子元器件、新鲜蔬菜、百货的运输车队从广西南宁、云南...
巴方:印度上周导弹袭击造成至少... 巴基斯坦三军新闻局13日发表声明说,上周印度对巴方发动的导弹袭击造成至少40名平民死亡,另有121人...
美政府以拨款为要挟胁迫各州服从... 当地时间13日,美国20个州联合起诉美国联邦政府,称美国交通部和国土安全部非法以联邦拨款为要挟,胁迫...
最新研究:新型合成小分子可“精... 癌细胞法国国家科学研究中心日前在官网介绍,该中心参与的一项研究成功设计并合成了一种新型小分子“磷脂降...
车被冰雹砸坏了能理赔吗?报案时... 5月13日晚,北京出现大面积降水、下冰雹的情况,不少车主由于正在回家的路上或者车辆露天停放,导致车面...
盲人办手机卡,被要求必须“眨眼... 近日,江苏扬州的一位80岁的盲人管先生在某运营商营业厅办理手机卡时,因无法完成“刷脸验证”,只能以亲...
国内首家破产的5A景区游客爆满... 近日,一些网友在短视频平台上分享自己游玩洛阳龙潭大峡谷的经历,并称这是国内第一个倒闭的5A级景区,有...
美国务卿鲁比奥将前往土耳其参加... 当地时间5月13日,美国总统特朗普在沙特-美国投资论坛上表示,本周晚些时候俄乌将在土耳其举行会谈,包...
赴泰游填数字入境卡被收费200... 据人民网报道,泰国外交部发言人尼功德近日表示,自2025年5月1日起,泰国移民局将开始为进出泰国的外...
加拿大新政府宣誓就职 马克·卡尼(资料图)当地时间5月13日,加拿大自由党领袖、现任总理马克·卡尼带领新内阁在位于首都渥太...