来源:DataGo数据狗 链接:
https://mp./s/fDcr1SfcbynLzHye7Q7VOg
大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇。在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短,而且理解起来或者说你更改起来要简单一些。最终会实现效果如下:
基本准备
首先,我们需要安装pygame库,小编通过pip install pygame,很快就安装好了。在完成贪吃蛇小游戏的时候,我们需要知道整个游戏分为四部分:
游戏显示:游戏界面、结束界面
贪吃蛇:头部、身体、食物判断、死亡判断
树莓:随机生成
按键控制:上、下、左、右
游戏显示
首先,我们来初始化pygame,定义颜色、游戏界面的窗口大小、标题和图标等。
2pygame.init() 3fpsClock=pygame.time.Clock() 4#创建pygame显示层 5playSurface=pygame.display.set_mode((600,460))#窗口大小 6pygame.display.set_caption('SnakeGame')#窗口名称 7#定义颜色变量 8redColour=pygame.Color(255,0,0) 9blackColour=pygame.Color(0,0,0) 10whiteColour=pygame.Color(255,255,255) 11greyColour=pygame.Color(150,150,150)1#初始化pygame
游戏结束界面,我们会显示“Game Over!”和该局游戏所得分数,相关代码如下:
2defgameOver(playSurface,score): 3gameOverFont=pygame.font.SysFont('arial.ttf',54)#游戏结束字体和大小 4gameOverSurf=gameOverFont.render('GameOver!',True,greyColour)#游戏结束内容显示 5gameOverRect=gameOverSurf.get_rect() 6gameOverRect.midtop=(300,10)#显示位置 7playSurface.blit(gameOverSurf,gameOverRect) 8scoreFont=pygame.font.SysFont('arial.ttf',54)#得分情况显示 9scoreSurf=scoreFont.render('Score:'+str(score),True,greyColour) 10scoreRect=scoreSurf.get_rect() 11scoreRect.midtop=(300,50) 12playSurface.blit(scoreSurf,scoreRect) 13pygame.display.flip()#刷新显示界面 14time.sleep(5)#休眠五秒钟自动退出界面 15pygame.quit() 16sys.exit()1#定义gameOver函数
贪吃蛇和树莓
我们需要将整个界面看成许多20*20的小方块,每个方块代表一个单位,蛇的长度用单位来表示,同时我们采用列表的形式存储蛇的身体。同时,我们都知道,树莓的位置是随机的。所以,我们需要让树莓出现的位置是游戏界面中的随机位置,同时,每吃到一颗树莓,就需要重新生成一颗新的树莓,并且得分加1。相关初始化设置如下:
2snakeSegments=[[100,100]]#贪吃蛇蛇的身体,初始为一个单位 3raspberryPosition=[300,300]#树莓的初始位置 4raspberrySpawned=1#树莓的个数为1 5direction='right'#初始方向为右 6changeDirection=direction 7score=0#初始得分1snakePosition=[100,100]#贪吃蛇蛇头的位置
如何控制贪吃蛇的运动轨迹呢,那么就需要按键控制了。我们通过键盘的↑↓←→和WSAD来控制,如果想直接退出游戏,则可以通过Esc键。这里需要强调的是,贪吃蛇里面是不能反方向运动,因此,我们需要进一步的增加限制条件:
2foreventinpygame.event.get(): 3ifevent.type==QUIT: 4pygame.quit() 5sys.exit() 6elifevent.type==KEYDOWN: 7#判断键盘事件 8ifevent.key==K_RIGHTorevent.key==ord('d'): 9changeDirection='right' 10ifevent.key==K_LEFTorevent.key==ord('a'): 11changeDirection='left' 12ifevent.key==K_UPorevent.key==ord('w'): 13changeDirection='up' 14ifevent.key==K_DOWNorevent.key==ord('s'): 15changeDirection='down' 16ifevent.key==K_ESCAPE: 17pygame.event.post(pygame.event.Event(QUIT)) 18#判断是否输入了反方向 19ifchangeDirection=='right'andnotdirection=='left': 20direction=changeDirection 21ifchangeDirection=='left'andnotdirection=='right': 22direction=changeDirection 23ifchangeDirection=='up'andnotdirection=='down': 24direction=changeDirection 25ifchangeDirection=='down'andnotdirection=='up': 26direction=changeDirection1#检测例如按键等pygame事件
方向设置好了,那么贪吃蛇蛇身变换怎么做啊?很简单,我们只需要根据方向变换一下坐标即可。
2ifdirection=='right': 3snakePosition[0]+=20 4ifdirection=='left': 5snakePosition[0]-=20 6ifdirection=='up': 7snakePosition[1]-=20 8ifdirection=='down': 9snakePosition[1]+=20 10#增加蛇的长度 11snakeSegments.insert(0,list(snakePosition))1#根据方向移动蛇头的坐标
贪吃蛇游戏里面最重要的就是食物判断和死亡判断。首先是食物判断,我们通过键盘按键来决定贪吃蛇的走向,以便它能吃到树莓。如何判断贪吃蛇有没有吃到树莓呢?很简单,如果贪吃蛇蛇头的位置和树莓的位置重合了,也就是相同,那么贪吃蛇就吃到树莓了,否则没有。同时,一旦发生了树莓被吃的情况,立刻重新随机生成一个新的树莓。相关代码如下:
2ifsnakePosition[0]==raspberryPosition[0]andsnakePosition[1]==raspberryPosition[1]: 3raspberrySpawned=0 4else: 5snakeSegments.pop()#若没有吃掉树莓,需将最后一单位的蛇身提出列表,此处和蛇身移动时位置变换有关 6#如果吃掉树莓,则重新生成树莓 7ifraspberrySpawned==0: 8x=random.randrange(1,30)#和游戏界面大小相关 9y=random.randrange(1,23) 10raspberryPosition=[int(x*20),int(y*20)] 11raspberrySpawned=1 12score+=11#判断是否吃掉了树莓
死亡判断则分为两类情况,一是触碰到了游戏界面的边界,二是贪吃蛇触碰到了自己的身体。一旦发生死亡,则触发gameover。
2ifsnakePosition[0]>600orsnakePosition[0]0:#若超过左右边界,触发gameover 3gameOver(playSurface,score) 4ifsnakePosition[1]>460orsnakePosition[1]0:#若超过上下边界,触发gameover 5gameOver(playSurface,score) 6forsnakeBodyinsnakeSegments[1:]:#若触碰到自己的身体,触发gameover 7ifsnakePosition[0]==snakeBody[0]andsnakePosition[1]==snakeBody[1]: 8gameOver(playSurface,score)1#判断是否死亡
贪吃蛇运动和吃掉树莓的过程中,游戏界面需要不断更新。同时,我们设置了游戏速度。
2playSurface.fill(blackColour) #蛇身为白色 3forpositioninsnakeSegments: 4pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20)) 5pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0],raspberryPosition[1],20,20)) 6 7#刷新pygame显示层 8pygame.display.flip() 9#控制游戏速度 10fpsClock.tick(5)1#绘制pygame显示层
至此,我们就能完成一个贪吃蛇小游戏了。赶紧去实验一下吧!
完整的代码如下:
2frompygame.localsimport* 3#定义颜色变量 4redColour=pygame.Color(255,0,0) 5blackColour=pygame.Color(0,0,0) 6whiteColour=pygame.Color(255,255,255) 7greyColour=pygame.Color(150,150,150) 8defgameOver(playSurface,score): 9gameOverFont=pygame.font.SysFont('arial.ttf',54) 10gameOverSurf=gameOverFont.render('GameOver!',True,greyColour) 11gameOverRect=gameOverSurf.get_rect() 12gameOverRect.midtop=(300,10) 13playSurface.blit(gameOverSurf,gameOverRect) 14scoreFont=pygame.font.SysFont('arial.ttf',54) 15scoreSurf=scoreFont.render('Score:'+str(score),True,greyColour) 16scoreRect=scoreSurf.get_rect() 17scoreRect.midtop=(300,50) 18playSurface.blit(scoreSurf,scoreRect) 19pygame.display.flip() 20time.sleep(5) 21pygame.quit() 22sys.exit() 23defmain(): 24#初始化pygame 25pygame.init() 26fpsClock=pygame.time.Clock() 27#创建pygame显示层 28playSurface=pygame.display.set_mode((600,460)) 29pygame.display.set_caption('SnakeGame') 30#初始化变量 31snakePosition=[100,100]#贪吃蛇蛇头的位置 32snakeSegments=[[100,100]]#贪吃蛇蛇的身体,初始为一个单位 33raspberryPosition=[300,300]#树莓的初始位置 34raspberrySpawned=1#树莓的个数为1 35direction='right'#初始方向为右 36changeDirection=direction 37score=0#初始得分 38whileTrue: 39#检测例如按键等pygame事件 40foreventinpygame.event.get(): 41ifevent.type==QUIT: 42pygame.quit() 43sys.exit() 44elifevent.type==KEYDOWN: 45#判断键盘事件 46ifevent.key==K_RIGHTorevent.key==ord('d'): 47changeDirection='right' 48ifevent.key==K_LEFTorevent.key==ord('a'): 49changeDirection='left' 50ifevent.key==K_UPorevent.key==ord('w'): 51changeDirection='up' 52ifevent.key==K_DOWNorevent.key==ord('s'): 53changeDirection='down' 54ifevent.key==K_ESCAPE: 55pygame.event.post(pygame.event.Event(QUIT)) 56#判断是否输入了反方向 57ifchangeDirection=='right'andnotdirection=='left': 58direction=changeDirection 59ifchangeDirection=='left'andnotdirection=='right': 60direction=changeDirection 61ifchangeDirection=='up'andnotdirection=='down': 62direction=changeDirection 63ifchangeDirection=='down'andnotdirection=='up': 64direction=changeDirection 65#根据方向移动蛇头的坐标 66ifdirection=='right': 67snakePosition[0]+=20 68ifdirection=='left': 69snakePosition[0]-=20 70ifdirection=='up': 71snakePosition[1]-=20 72ifdirection=='down': 73snakePosition[1]+=20 74#增加蛇的长度 75snakeSegments.insert(0,list(snakePosition)) 76#判断是否吃掉了树莓 77ifsnakePosition[0]==raspberryPosition[0]andsnakePosition[1]==raspberryPosition[1]: 78raspberrySpawned=0 79else: 80snakeSegments.pop() 81#如果吃掉树莓,则重新生成树莓 82ifraspberrySpawned==0: 83x=random.randrange(1,30) 84y=random.randrange(1,23) 85raspberryPosition=[int(x*20),int(y*20)] 86raspberrySpawned=1 87score+=1 88#绘制pygame显示层 89playSurface.fill(blackColour) 90forpositioninsnakeSegments: 91pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20)) 92pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0],raspberryPosition[1],20,20)) 93#刷新pygame显示层 94pygame.display.flip() 95#判断是否死亡 96ifsnakePosition[0]>600orsnakePosition[0]0: 97gameOver(playSurface,score) 98ifsnakePosition[1]>460orsnakePosition[1]0: 99gameOver(playSurface,score) 100forsnakeBodyinsnakeSegments[1:]: 101ifsnakePosition[0]==snakeBody[0]andsnakePosition[1]==snakeBody[1]: 102gameOver(playSurface,score) 103#控制游戏速度 104fpsClock.tick(5) 105 106if__name__=="__main__": 107main()1importpygame,sys,time,random
python爬虫人工智能大数据公众号
如果觉得《bat贪吃蛇游戏代码_100行python代码 轻松完成贪吃蛇小游戏》对你有帮助,请点赞、收藏,并留下你的观点哦!