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

前言:这一期,我们来做一个拼图。让我们快乐地开始吧~ ~ ~我们先来看看这样的效果:开发工具**Python版本:**3.6.4私人边肖01可以获得很多python学习资源。相关模块:Pygame模块

本文最后更新时间:  2023-04-21 18:24:46

前言:

这一期,我们来做一个拼图。让我们快乐地开始吧~ ~ ~

我们先来看看这样的效果:

开发工具

**Python版本:**3.6.4

私人边肖01可以获得很多python学习资源。

相关模块:

Pygame模块;

以及Python附带的一些模块

环境建设

安装Python并将其添加到环境变量中。pip可以安装所需的相关模块。

原理介绍:游戏介绍:

将图像分成m×n个矩形块,将图像右下角的矩形块替换为空白色块,然后将这些矩形块随机放置成原图的形状。游戏的目标是通过移动非空白块将随机放置的图像恢复为原始图像,并规定移动操作只存在于非空白块移动到空白块的情况下。

例如下图所示:

例如,如下所示:

循序渐进:Step1:游戏初始界面

既然是游戏,就要有初始界面吧?

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

'''显示游戏开始界面'''def ShowStartInterface(屏幕,宽度,高度):screen.fill(cfg。background color)tfont = py game . font . font(CFG。FONTPATH,width//4)cfont = py game . font . font(CFG。FONTPATH,width//20)title = tfont . render('益智游戏',真的,cfg。RED)content 1 = cfont . render('按H或M或L开始游戏',真的,cfg。BLUE)content 2 = cfont . render('H 5*5模式,M 4*4模式,L 3*3模式',真的,cfg。BLUE)trect = title . get _ rect()trect . midtop =(width/2,height/10)crect 1 = content 1 . get _ rect()crect 1 . midtop =(width/2,height/2.2)crect 2 . midtop =(width/2,height/1.8)screen.blit(title,trect)screen.blit(content1,crect1)screen.blit(content2,crect2)while True:forQUIT)或(event.type == pygame。KEYDOWN和event.key == pygame。k _ ESCAPE):py game . quit()sys . exit()elif event . type = = py game。KEYDOWN:if event . key = = ord('l & # 039):return 3 elif event . key = = ord('m & # 039):return 4 elif event . key = = ord('h & # 039):return 5pygame.display.update()复制代码。根据玩家自身的水平,可以选择不同难度的拼图。

步骤2:定义移动操作

定义move操作的目的是移动拼图(类似废话T_T),具体实现很简单:

'''将空白色单元格左边的单元格移动到空白色单元格右边'''def moveR(board,blank_cell_idx,num_cols):如果blank _ cell _ idx % num _ cols = = 0:return blank _ cell _ idx board[blank _ cell _ idx-1],board[blank _ cell _ idx]= board[blank _ cell _ idx],board[blank _ cell _ idx-1]return blank _ cell _ idx-1 '''将空白色单元格右边的单元格移动到空白色单元格的左边'''def moveL(board,blank_cell_idx,num _ cols):if(blank _ cell _ idx+1)% num _ cols = = 0:return blank _ cell _ idx board[blank _ cell _ idx+1],board[blank _ cell _ idx]= board[blank _ cell _ idx],board[blank _ cell _ idx+1]return blank _ cell _ idx+1 '''将空白色单元格上方的单元格向下移动到空白色单元格位置'''def moveD(board,blank_cell_idx,num _ cols):if blank _ cell _ idx <num _ cols:return blank _ cell _ idx board[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 '''将空白色单元格下的单元格移动到空白色单元格位置'''def moveU(board,blank_cell_idx,num_rows,num _ cols):if blank _ cell _ idx >=(num _ rows-1)* num _ cols:return blank _ cell _ idx Board[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复制代码第三步:游戏主界面

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

首先我们需要对拼图进行加扰,但是随机加扰很可能导致拼图无解,所以我们通过随机移动来对拼图进行加扰,这也是我们首先定义拼图移动操作的主要原因:

'''紧急拼图'''def CreateBoard(num_rows,num_cols,Num _ cells):board =[]for I in range(Num _ cells):board . append(I)#删除右下角的blank _ cell _ idx = Num _ cells-1 board[blank _ cell _ idx]。=-1表示范围内的I(CFG。NUMRANDOM):# 0:左,1:右,2:上,3:下direction = 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

最后实现主界面的显示刷新和事件响应:

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:游戏结束界面while True:game_board,blank _ cell _ idx = create board(num _ rows,num_cols,num _ cells)if not is game over(game _ board,Size):break#游戏主循环is _ running = True while is _ running:#-py game . event . get()中事件的事件捕获:#-退出游戏if (event.type == pygame .QUIT)或(event . type = = py game . keydown and event . key = = py game . k _ escape):py game . QUIT()sys . exit()#-键盘操作elifevent . type = = py game . keydown:if event . key = = py game . k _ left Or a '):blank_cell_idx = moveL(game _ board,blank _ cell _ idx,num_cols)elif event.key == pygame。k _ RIGHT or event . key = = ord('d & # 039):blank_cell_idx = moveR(game _ board,blank _ cell _ idx,num_cols)elif event.key == pygame。k _ UP or event . key = = ord('w & # 039):blank_cell_idx = moveU(game _ board,blank _ cell _ idx,num_rows,num_cols)elif event.key == pygame。k _ DOWN or event . key = = ord('s & # 039):blank _ cell _ idx = moved(game _ board,blank _ cell _ idx,num _ cols)#-鼠标操作elifevent . type = = py game . mousebuttontown and event . button = = 1:x,y = py game . mouse . get _ pos()x _ pos = x//cell _ widthy _ pos = y//cell _ heightidx = x _ pos+y _ pos * num _ cols if idx = = blank _ cell _ idx-1:blank _ cell _ idx = moveR(game _ board, num _ cols)elifidx = = blank _ cell _ idx-num _ cols:blank _ cell _ idx = moved(game _ board,blank _ cell _ idx,num _ cols)#-判断游戏是否结束(game _ board,Size):game _ board[blank _ cell _ idx]= num _ cells-1is _ running = false #-更新屏幕screen . fill(CFG . background color)for I in range(num _ cells):if game _ board[I]= =-1:continuex _ pos = I// rect(y _ pos *单元格_宽度,x _ pos *单元格_高度,单元格_宽度,单元格_高度)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):py game . draw . line(screen,cfg。BLACK,(0,i*cell_height),(game _ img _ used _ rect.width,I * cell _ height))py Game . display . update()clock . tick(CFG . fps)复制代码第四步:游戏结束界面

当玩家完成拼图后,需要显示游戏结束界面,该界面类似于游戏的初始界面,实现起来相对简单:

'''显示游戏结束界面'''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()复制代码

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

温馨提示:内容均由网友自行发布提供,仅用于学习交流,如有版权问题,请联系我们。