当前位置: 首页 > 后端技术 > Python

使用pygame制作一个贪吃蛇小游戏

时间:2023-03-26 12:24:11 Python

之前我们已经学习了如何使用pygame创建窗口,现在我们来学习使用pygame制作一个经典的小游戏——贪吃蛇。首先我们需要导入要使用的模块:importpygame,sys,randomfrompygame.localsimport*pygame.locals该模块包含pygame使用的各种常量,其内容会自动放入Pygame模块的命名空间。模块导入后,我们可以定义先使用的颜色,根据大家的喜好:#定义颜色pinkColor=pygame.Color(255,182,193)blackColor=pygame.Color(0,0,0)whiteColor=pygame.Color(255,255,255)pygame.Color()是一个用来描述颜色的对象,Color(name)->ColorColor(r,g,b,a)->ColorColor(rgbvalue)–>Color#Color对象pygame.Color.r的方法&属性:获取或设置Color对象的红色值pygame.Color.g:获取或设置Color对象的绿色值pygame.Color.b:获取或设置Color对象的绿色值Color对象的blue值pygame.Color.a:获取或设置Color对象的alpha值pygame.Color.cmy:获取或设置Color对象的cmy值pygame.Color.hsva:获取或设置hsav值Color对象的pygame.Color.hsla:获取或设置Color对象pygame.Color.i的hsla值1i2i3:获取或设置Color对象的I1I2I3说明pygame.Color.normalize:返回RGBA(显示通道)价值一个Color对象的pygame.Color.correctgamma:Color对象请求某个gamma值pygame.Color.setlength:设置Color对象中元素的值为1、2、3或4。当游戏进行时结束了,我们需要退出游戏,所以我们需要定义一个游戏退出的函数,很简单,就是先退出pygame窗口,然后退出程序:#定义游戏结束的函数defgameover():#退出pygame窗口pygame.quit()#退出程序sys.exit()定义结束函数后,我们需要定义一个入口函数,用来进入游戏,游戏的主要代码是这样写的其中:defmain():#初始化pygame.init()#定义一个变量来控制速度time_clock=pygame.time.Clock()#创建一个窗口并定义标题screen=pygame.display.set_mode((640,480))pygame.display.set_caption("Snake")首先我们需要初始化pygame并创建一个好的游戏Window,顺便定义一个变量,用来控制速度,这个变量是用来给小蛇移动的然后初始化一些蛇和食物用到的变量,把整个界面看成很多20x20的小方块,每个方块代表一个单元#定义初始化变量snakePosition=[100,100]#蛇头位置#定义一个贪心的长度列表snakeSegments=[[100,100],[80,100],[60,100],[40,100],[20,100]]#初始化食物位置foodPostion=[300,300]#食物个数,0表示吃过,1表示没吃foodTotal=1#初始方向,向右方向='right'#定义一个改变方向的变量,按changeDirection=direction初始化数据,使用while循环监听事件,通过不断的循环让蛇向前移动whileTrue:#从队列中获取事件foreventinpygame.event.get():#判断是否为退出事件ifevent.type==QUIT:pygame.quit()sys.exit()#keyeventelifevent.type==KEYDOWN:#如果是右箭头或者d,蛇向右移动ifevent.key==K_RIGHTorevent.key==K_d:changeDirection='right'#如果是左键headora,如果event.key==K_LEFT或event.key==K_a:changeDirection='left'则蛇向左移动ifevent.key==K_UPorevent.key==K_w:changeDirection='up'ifevent.key==K_DOWNorevent.key==K_s:changeDirection='down'#对应键盘上的Esc键,ifevent.key==K_ESCAPE表示退出:pygame.event.post(pygame.event.Event(QUIT))KEYDOWN为键盘按键事件,K_RIGHT、K_LEFT、K_d、K_a等代表键盘上对应的按键确认蛇的移动方向,不能反方向移动。比如此时蛇在向右移动,则无法控制它向左移动,只能向上或向下#确认方向,判断是否输入反方向ifchangeDirection=='right'and不是方向=='左':方向=changeDirection如果changeDirection=='左'而不是方向=='右':方向=changeDirection如果changeDirection=='向上'而不是方向=='向下':方向=changeDirection如果changeDirection=='down'andnotdirection=='up':direction=changeDirection通过像素的加减来决定蛇头的移动。上下加减20px相当于上下移动一步#ifdirection=='right':snakePosition[0]+=20ifdirection=='left':snakePosition[0]-=20ifdirection=='up':snakePosition[1]-=20ifdirection=='down':snakePosition[1]+=20#增加蛇的长度snakeSegments.insert(0,list(snakePosition))#snakePosition[0]==foodPostion[0]andsnakePosition[1]==food判断是否吃食物Postion[1]:foodTotal=0else:snakeSegments.pop()#每次从列表中移除最后一个蛇单位#如果food为0,重新生成foodiffoodTotal==0:x=random.randrange(1,32)y=random.randrange(1,24)foodPostion=[int(x*20),int(y*20)]foodTotal=1#绘制pygame显示层screen.fill(blackColor)设置蛇的颜色长宽和食物在snakeSegments中的位置:#Snakebodyiswhite#Snakepygame.draw.rect(screen,pinkColor,Rect(position[0],position[1],20,20))pygame.draw.rect(screen,whiteColor,Rect(foodPostion[0],foodPostion[1],20,20))更新显示到屏幕表面pygame.display.flip()判断游戏是否结束#判断游戏是否结束ifsnakePosition[0]>620orsnakePosition[0]<0:gameover()elifsnakePosition[1]>460orsnakePosition[1]<0:gameover()#IfyoutouchyourbodyforbodyinsnakeSegments[1:]:ifsnakePosition[0]==body[0]和snakePosition[1]==body[1]:gameover()#控制游戏速度time_clock.tick(5)入口函数if__name__=='__main__':main()然后就可以运行代码了,完整代码importpygame如图,sys,随机来自pygame。localsimport*#定义颜色pinkColor=pygame.Color(255,182,193)blackColor=pygame.Color(0,0,0)whiteColor=pygame.Color(255,255,255)#定义函数结束defgameover():pygame.quit()sys.exit()defmain():#初始化pygame.init()#定义一个变量来控制速度time_clock=pygame.time.Clock()#创建一个窗口,定义标题screen=pygame.display.set_mode((640,480))pygame.display.set_caption("Snake")#定义蛇的初始化变量snakePosition=[100,100]#蛇头位置#定义一个列表snakeSegments=[[100,100],[80,100],[60,100],[40,100],[20,100]]#初始化食物位置foodPostion=[300,300]#食物量,1没吃,0吃foodTotal=1#初始方向,rightdirection='right'#定义一个变量改变方向,按下按钮changeDirection=direction#通过控制蛇ghthekeyboardwhileTrue:#从pygam中的事件队列中获取事件e.event.get():#判断是否是退出事件ifevent.type==QUIT:pygame.quit()sys.exit()#keyeventelifevent.type==KEYDOWN:#如果是arightarroword,snake向右移动ifevent.key==K_RIGHTorevent.key==K_d:changeDirection='right'#如果是左键headora,snake向左移动ifevent.key==K_LEFT或事件。key==K_a:changeDirection='left'ifevent.key==K_UPorevent.key==K_w:changeDirection='up'ifevent.key==K_DOWNorevent.key==K_s:changeDirection='down'#对应键盘上的Esc键,表示退出ifevent.key==K_ESCAPE:pygame.event.post(pygame.event.Event(QUIT))#确认方向判断是否输入反方向移动ifchangeDirection=='right'而不是direction=='left':direction=changeDirectionifchangeDirection=='left'而不是direction=='right':direction=changeDirection如果changeDirection=='up'而不是direction=='down':direction=changeDirection如果changeDirection=='down'而不是direction=='up':direction=changeDirection#根据方向移动蛇头ifdirection=='right':snakePosition[0]+=20ifdirection=='left':snakePosition[0]-=20ifdirection=='up':snakePosition[1]-=20ifdirection=='down':snakePosition[1]+=20#增加蛇的长度snakeSegments.insert(0,list(snakePosition))#判断是否吃食物ifsnakePosition[0]==foodPostion[0]andsnakePosition[1]==foodPostion[1]:foodTotal=0else:snakeSegments.pop()#每次从列表中移除最后一条蛇#如果食物为0,则重新生成食物iffoodTotal==0:x=random.randrange(1,32)y=random.randrange(1,24)foodPostion=[int(x*20),int(y*20)]foodTotal=1#绘制pygame显示层screen.fill(blackColor)forpositioninsnakeSegments:#snakebodyiswhite#snakepygame.draw.rect(screen,pinkColor,Rect(position[0],position[1],20,20))pygame.draw.rect(screen,whiteColor,Rect(foodPostion[0],foodPostion[1],20,20))#更新显示到屏幕表面pygame.display.flip()#判断游戏是否结束ifsnakePosition[0]>620orsnakePosition[0]<0:gameover()elifsnakePosition[1]>460orsnakePosition[1]<0:gameover()#IfyoutouchyourbodyforbodyinsnakeSegments[1:]:ifsnakePosition[0]==body[0]andsnakePosition[1]==body[1]:gameover()#控制游戏速度时间_时钟。tick(5)#启动入口函数if__name__=='__main__':main()