您的位置: 首页 > 热点 > > 内容页

如何自制游戏?Python 拼图游戏原来这么简单

时间:2022-11-17 16:12:08 来源:中国创氪网

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

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

如何自制游戏(Python制作游戏原来这么简单)-第1张图片-腾赚网

开发工具

**Python版本:**3.6.4

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

相关模块:

pygame模块;

以及一些Python自带的模块

环境搭建

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

原理介绍

游戏简介:

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

例如下图所示:

如何自制游戏(Python制作游戏原来这么简单)-第2张图片-腾赚网

逐步实现:

Step1:游戏初始界面

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

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

'''显示游戏开始界面'''defShowStartInterface(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) whileTrue: foreventinpygame.event.get(): if(event.type==pygame.QUIT)or(event.type==pygame.KEYDOWNandevent.key==pygame.K_ESCAPE):

pygame.quit()

sys.exit() elifevent.type==pygame.KEYDOWN: ifevent.key==ord('l'):return3

elifevent.key==ord('m'):return4

elifevent.key==ord('h'):return5

pygame.display.update()

复制代码

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

Step2:定义移动操作

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

'''将空白Cell左边的Cell右移到空白Cell位置'''defmoveR(board,blank_cell_idx,num_cols):

ifblank_cell_idx%num_cols==0:returnblank_cell_idx

board[blank_cell_idx-1],board[blank_cell_idx]=board[blank_cell_idx],board[blank_cell_idx-1] returnblank_cell_idx-1'''将空白Cell右边的Cell左移到空白Cell位置'''defmoveL(board,blank_cell_idx,num_cols):

if(blank_cell_idx+1)%num_cols==0:returnblank_cell_idx

board[blank_cell_idx+1],board[blank_cell_idx]=board[blank_cell_idx],board[blank_cell_idx+1] returnblank_cell_idx+1'''将空白Cell上边的Cell下移到空白Cell位置'''defmoveD(board,blank_cell_idx,num_cols):

ifblank_cell_idx

board[blank_cell_idx-num_cols],board[blank_cell_idx]=board[blank_cell_idx],board[blank_cell_idx-num_cols] returnblank_cell_idx-num_cols'''将空白Cell下边的Cell上移到空白Cell位置'''defmoveU(board,blank_cell_idx,num_rows,num_cols):

ifblank_cell_idx>=(num_rows-1)*num_cols:returnblank_cell_idx

board[blank_cell_idx+num_cols],board[blank_cell_idx]=board[blank_cell_idx],board[blank_cell_idx+num_cols] returnblank_cell_idx+num_cols

复制代码

Step3:游戏主界面

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

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

'''获得打乱的拼图'''defCreateBoard(num_rows,num_cols,num_cells):

board=[] foriinrange(num_cells):board.append(i) #去掉右下角那块

blank_cell_idx=num_cells-1

board[blank_cell_idx]=-1

foriinrange(cfg.NUMRANDOM): #0:left,1:right,2:up,3:down

direction=random.randint(0,3) ifdirection==0:blank_cell_idx=moveL(board,blank_cell_idx,num_cols) elifdirection==1:blank_cell_idx=moveR(board,blank_cell_idx,num_cols) elifdirection==2:blank_cell_idx=moveU(board,blank_cell_idx,num_rows,num_cols) elifdirection==3:blank_cell_idx=moveD(board,blank_cell_idx,num_cols) returnboard,blank_cell_idx

复制代码

游戏主界面初始化:

如何自制游戏(Python制作游戏原来这么简单)-第3张图片-腾赚网

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

whileTrue:

game_board,blank_cell_idx=CreateBoard(num_rows,num_cols,num_cells)

ifnotisGameOver(game_board,size):

break #游戏主循环

is_running=True

whileis_running: #--事件捕获

foreventinpygame.event.get(): #----退出游戏

if(event.type==pygame.QUIT)or(event.type==pygame.KEYDOWNandevent.key==pygame.K_ESCAPE):

pygame.quit()

sys.exit() #----键盘操作

elifevent.type==pygame.KEYDOWN:

ifevent.key==pygame.K_LEFTorevent.key==ord('a'):

blank_cell_idx=moveL(game_board,blank_cell_idx,num_cols)

elifevent.key==pygame.K_RIGHTorevent.key==ord('d'):

blank_cell_idx=moveR(game_board,blank_cell_idx,num_cols)

elifevent.key==pygame.K_UPorevent.key==ord('w'):

blank_cell_idx=moveU(game_board,blank_cell_idx,num_rows,num_cols)

elifevent.key==pygame.K_DOWNorevent.key==ord('s'):

blank_cell_idx=moveD(game_board,blank_cell_idx,num_cols) #----鼠标操作

elifevent.type==pygame.MOUSEBUTTONDOWNandevent.button==1:

x,y=pygame.mouse.get_pos()

x_pos=x//cell_width

y_pos=y//cell_height

idx=x_pos+y_pos*num_cols

ifidx==blank_cell_idx-1:

blank_cell_idx=moveR(game_board,blank_cell_idx,num_cols)

elifidx==blank_cell_idx+1:

blank_cell_idx=moveL(game_board,blank_cell_idx,num_cols)

elifidx==blank_cell_idx+num_cols:

blank_cell_idx=moveU(game_board,blank_cell_idx,num_rows,num_cols)

elifidx==blank_cell_idx-num_cols:

blank_cell_idx=moveD(game_board,blank_cell_idx,num_cols) #--判断游戏是否结束

ifisGameOver(game_board,size):

game_board[blank_cell_idx]=num_cells-1

is_running=False #--更新屏幕

screen.fill(cfg.BACKGROUNDCOLOR)

foriinrange(num_cells):

ifgame_board[i]==-1:

continue

x_pos=i//num_cols

y_pos=i%num_cols

rect=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)

foriinrange(num_cols+1):

pygame.draw.line(screen,cfg.BLACK,(i*cell_width,0),(i*cell_width,game_img_used_rect.height))

foriinrange(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:游戏结束界面

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

'''显示游戏结束界面'''defShowEndInterface(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() whileTrue: foreventinpygame.event.get(): if(event.type==pygame.QUIT)or(event.type==pygame.KEYDOWNandevent.key==pygame.K_ESCAPE):

pygame.quit()

sys.exit()

pygame.display.update()

复制代码

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

x 广告
x 广告

Copyright @  2015-2022 世界金属报网版权所有  备案号: 豫ICP备2021032478号-36   联系邮箱:897 18 09@qq.com