利用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画图的步骤)的相关内容了,更多精彩内容请关注!

相关内容

热门资讯

澳大利亚驻美大使陆克文将提前离... 澳大利亚总理阿尔巴尼斯13日表示,澳大利亚驻美大使凯文·拉德(中文名陆克文)将于3月底离任,比原定任...
我国将大力推广加厚高强度地膜和... 在国务院新闻办今天举行的国务院政策例行吹风会上,农业农村部相关负责人介绍,在农业农村领域,我国将通过...
美官员称特朗普正寻求通过外交途... 央视记者获悉,美国官员当地时间1月12日称,美国总统特朗普正在寻求通过外交途径应对伊朗局势的可能性,...
日本三重县确认一起高致病性禽流... △资料图日本三重县政府当地时间13日通报称,该县津市确认一起高致病性禽流感病例。这是本季日本全国第1...
受贿数额特别巨大 江苏省南京市... 记者今天(13日)从最高人民检察院获悉,江苏省南京市人大常委会原党组书记、主任龙翔涉嫌贪污、受贿、滥...
美国国务院要求美国公民立即离开... 据美国媒体12日报道,美国国务院要求美国公民立即离开伊朗。
查获作案工具及嫌疑人DNA 调... 当地时间1月12日,根据调查人员透露的消息,警方曾发现一处隐藏的作案工具库,这一发现表明卢浮宫盗抢案...
地缘政治动荡推动黄金、白银价格... 美联储独立性受到挑战和中东地区地缘政治局势动荡,推动避险需求涌入贵金属市场。纽约商品交易所2月黄金期...
特朗普:对伊朗所有的贸易伙伴征... △美国总统特朗普(资料图)当地时间1月12日,美国总统唐纳德·特朗普在其社交媒体“真实社交”发文称,...
闫学晶致歉、中戏澄清,“新疆班... 近日,演员闫学晶因直播“哭穷”引发争议。事后,她连夜道歉,反思自己“环境变了,听着掌声、捧着鲜花,慢...
巴基斯坦开伯尔-普什图省发生爆... 总台记者获悉,当地时间1月12日,巴基斯坦开伯尔-普什图省发生一起爆炸事件,造成6名警察死亡。
遇到心搏骤停者,你会心肺复苏和... 心搏骤停,是指由于各种原因导致的心脏搏动突然停止,瞬间丧失了收缩、舒张功能,导致以脑为代表的全身组织...
济南城市发展集团有限公司党委副... 据济南市纪委监委消息:济南城市发展集团有限公司党委副书记、董事胡娟涉嫌严重违纪违法,目前正接受济南市...
商务部通报中欧电动汽车案磋商进... 为落实中欧领导人会晤共识,妥善解决欧盟对华电动汽车案,中欧双方本着相互尊重的态度,进行了多轮磋商。双...
政府投资基金“投向哪 怎么投”... 今天(12日),国家发展改革委、财政部、科技部、工业和信息化部联合发布《关于加强政府投资基金布局规划...
海底捞“小便门”两名当事人均登... 2026年1月12日,《人民法院报》2版刊登了海底捞“小便门”当事人吴某及其父母的致歉声明。此前的1...
海南患者福音!双目录落地,创新... 南海网、新海南客户端1月11日消息(记者苏桂除)随着新版基本医保目录和首版商保创新药目录自2026年...
婚礼电子请柬“访客记录”付费可... 您收到过婚礼电子请柬吗?现在,越来越多的新人选择用H5网页链接的方式,在朋友圈、亲友群里分享喜讯。环...
打着高校旗号的“教授内推”“付... 寒假临近,一些打着高校名义的“教授内推”“‘寒假学堂’营”“招生咨询”等信息层出不穷,这些信息靠谱吗...
广东汕头突发山火已扑灭 无人员... 今天(1月12日),总台记者从广东省汕头市濠江区应急管理局获悉,广东汕头濠江区礐石街道突发山火已扑灭...