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

相关内容

热门资讯

整治“内卷式”竞争 市场监管总... 据市场监管总局网站消息,为加强直播电商监管,综合整治“内卷式”竞争,保护广大消费者和经营者合法权益,...
外交部回应特朗普宣布对14国加... 今日,外交部发言人毛宁主持例行记者会。有记者提问,美国总统特朗普7日表示,将从8月1日起分别对来自日...
苏州中院发布悬赏公告,最高赏金... 江苏省苏州市中级人民法院8日发布悬赏公告,最高赏金超2600万元。内容如下:江苏省苏州市中级人民法院...
国务院办公厅印发《关于健全“高... 日前,国务院办公厅印发《关于健全“高效办成一件事”重点事项常态化推进机制的意见》(以下简称《意见》)...
也门胡塞武装称在红海击沉一艘货... 也门胡塞武装7日宣布,这一组织6日在也门西部荷台达省红海海域打击一艘“违禁”货轮,货轮现已沉没。也门...
死缓!西藏自治区政府原副主席王... 2025年7月8日,湖南省郴州市中级人民法院公开宣判西藏自治区人民政府原党组成员、副主席王勇受贿一案...
第32届世界大学生夏季运动会中... 图源:中国学生体育联合会7月8日,第32届世界大学生夏季运动会中国大学生体育代表团出征仪式在北京召开...
特朗普发关税函后,日韩等国的回... 新华社北京7月8日电 美国总统特朗普7日表示,将从8月1日起分别对来自日本、韩国等14个国家的进口产...
特朗普宣称对14国加税!美股应... 当地时间7日,美国总统特朗普发信函给日韩及南非等14国威胁征税,随后,他又签署行政令,延长“对等关税...
关于巴以问题 特朗普答记者:我... 当地时间7日,美国总统特朗普在华盛顿会见到访的以色列总理内塔尼亚胡。在答记者问时,特朗普将涉及“两国...
天舟八号货运飞船顺利撤离空间站... 天舟八号货运飞船顺利撤离空间站组合体 将于近期择机受控再入大气层。
湖北枣阳:大别山革命老区拼出的... 不沿江、不靠海,地处大别山革命老区,何以成“全国百强县”?降水少,人均水资源占有量只到全国平均水平的...
西藏吉隆口岸泥石流已致我国一侧... 记者从西藏日喀则市吉隆县获悉,8日晨5时许,中国和尼泊尔边境的吉隆口岸一带发生泥石流灾害。经初步统计...
国家发展改革委:我国新增下达1... 记者从国家发展改革委了解到,近日我国新增下达100亿元中央预算内投资,开展以工代赈加力扩围促进重点群...
头晕乏力……当心“热中风”来袭... 大太阳底下,突然感到头晕乏力、精神不振……小心!这可能不是普通中暑,而可能是“热中风”的警报。什么是...
一中国旅行团巴士在新西兰发生侧... 据中国驻克赖斯特彻奇总领馆消息,据新西兰警方通报,7月8日上午,一中国旅行团所乘巴士在新西兰南岛发生...
台风“丹娜丝”将于8日下午到夜... 昨天(7月7日)受今年第4号台风“丹娜丝”影响台湾岛南部和西北部浙江沿海等地出现暴雨或大暴雨浙江台州...
白宫:暂停援乌武器供应系国防部... 当地时间7日,美国白宫表示,暂停对乌克兰武器供应是美国国防部标准审查的一部分。美国白宫和五角大楼1日...
美国白宫:特朗普拟将“对等关税... 新华社纽约7月7日消息,美国白宫新闻发言人卡罗琳·莱维特7日下午在记者会上证实,美国总统特朗普计划签...
天水褐石培心幼儿园铅中毒事件追... 甘肃天水褐石培心幼儿园儿童被检出血铅超标后,多名幼儿园老师经检测,血铅也严重超标。此前,据该幼儿园的...