记录用python+pygame制作贪食蛇小游戏全过程。
游戏设计:在640*480的屏幕中实现贪食蛇小游戏,背景色黑色,蛇就用青绿色(0,255,127),食物颜色就用红色表示。
还是用一般的地图思路,设置块大小为20*20,蛇和食物的位置坐标就用数组来表示。
不多说,直接按基本套路实现显示蛇和食物。
一、实现基本的游戏界面显示
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygame,sys,random
from pygame.locals import *
foodColor = pygame.Color(255,0,0)
bgColor = pygame.Color(0,0,0)
snakeColor = pygame.Color(0,255,127)
blockSize = 20
gamesize = width,height = 640, 480 # 游戏界面的大小
def main():
pygame.init()
fps = pygame.time.Clock()
gameSurface = pygame.display.set_mode(gamesize) # 游戏界面的大小
pygame.display.set_caption('贪食蛇') # 游戏标题
snakePosition = [100,100] #蛇头的初始位置
snakeBody = [[100,100],[80,100],[60,100]] #蛇的组成坐标
foodPosition = [300,300] #食物的初始坐标
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
gameSurface.fill(bgColor)
for position in snakeBody: #rect(Surface, color, Rect(x,y,w,h), width=0)
pygame.draw.rect(gameSurface,snakeColor,Rect(position[0],position[1],blockSize,blockSize))#画蛇
pygame.draw.rect(gameSurface,foodColor,Rect(foodPosition[0], foodPosition[1],blockSize,blockSize)) #画食物
pygame.display.flip()
fps.tick(5)
if __name__ == "__main__":
main()
2、实现键盘的控制
为了实现键盘控制,需要设置几个属性来表示蛇的运行方向
def main():
...
direction = 'right'
newDirection = direction
...
在消息循环中实现:
def main():
while True:
for event in pygame.event.get():
if event.type == QUIT:
...
elif event.type == KEYDOWN: #新增
if event.key == K_RIGHT:
newDirection = 'right'
if event.key == K_LEFT :
newDirection = 'left'
if event.key == K_UP:
newDirection = 'up'
if event.key == K_DOWN:
newDirection = 'down'
if event.key == K_ESCAPE:
pygame.event.post(pygame.event.Event(QUIT))
if newDirection == 'left' and not direction == 'right':
direction = newDirection
if newDirection == 'right' and not direction == 'left':
direction = newDirection
if newDirection == 'up' and not direction == 'down':
direction = newDirection
if newDirection == 'down' and not direction == 'up':
direction = newDirection
3、既然可以键盘控制了,接着就可以通过坐标控制蛇移动了。
新增一个属性foodflag来表示这个食物是否被吃掉,1表示还在,0表示被吃掉了。是否被吃就是通过食物和蛇头的坐标位置是否一致来判断。
实现的逻辑是:判断好移动方向后,计算出位置坐标,在蛇身最开始插入该坐标,然后如果食物没有被吃掉时,删除蛇身的最后一个坐标。
def main():
...
foodflag = 1 #新增
...
while True:
for event in pygame.event.get():
...
#根据方向direction移动蛇头的坐标
if direction == 'right':
snakePosition[0] += blockSize
if direction == 'left':
snakePosition[0] -= blockSize
if direction == 'up':
snakePosition[1] -= blockSize
if direction == 'down':
snakePosition[1] += blockSize
snakeBody.insert(0,list(snakePosition)) #添加蛇头
#食物被吃掉了
if snakePosition[0] == foodPosition[0] and snakePosition[1] == foodPosition[1]:
foodflag = 0
else:
snakeBody.pop() #删除 弹出 蛇身的最后一个元素
4、当吃掉一个食物后,就要随机产生一个新食物。
def main():
...
if foodflag == 0:
x = random.randrange(1,width // blockSize )
y = random.randrange(1,height // blockSize)
foodPosition = [int(x*blockSize),int(y*blockSize)]
foodflag = 1
5、贪食蛇到边界时,会触发gameover。
...
def gameOver():
pygame.quit()
sys.exit()
def main():
...
pygame.draw.rect(gameSurface,foodColor,Rect(foodPosition[0], foodPosition[1],blockSize,blockSize)) #画食物
pygame.display.flip()
#新增
if snakePosition[0] > 620 or snakePosition[0] < 0:
gameOver()
elif snakePosition[1] > 460 or snakePosition[1] < 0:
gameOver()
fps.tick(5)
6、至此,完成了贪食蛇的基本实现。
后续可以加上计分牌等等功能,优化游戏体验等等。