Pygame开发贪吃蛇
Pygame专为Python设计,支持多平台(如Windows、Mac OS X、Linux、Android等),提供简单易用的API来创建2D游戏。它不仅仅局限于游戏开发,还可用于图形界面和音频应用。
Pygame提供了简洁的API,使得开发者可以快速上手并创建游戏原型。我花了几个小时学习,第二天就开发出了贪吃蛇的主体功能,代码不到100行。
我的设计思路和算法主要如下:
1、每次蛇移动,都先填充整个窗口背景,遮盖原来蛇的图形,然后在新的位置重新绘制,以达到蛇移动的视觉效果。
2、蛇身由多个小正方形组成,每次蛇移动,后面的小正方形便移动到前一个小正方形的当前位置上,以此类推,所以控制蛇身移动的方向,只要控制蛇头移动的方向即可。
3、当遇到窗口边缘时,蛇从另一边出来。
完整代码如下:
import pygame,sys
from random import randint
pygame.init()
screen = pygame.display.set_mode((800,600))
screen.fill((145,120,60))
alen = 20 #每一节蛇身体的边长
x_step = alen #x的步进值
y_step = 0 #y的步进值
food_rect = ()
#蛇身体由多个小正方形组成
snake = [(300,400,alen,alen),(280,400,alen,alen),(260,400,alen,alen),
(240,400,alen,alen),(220,400,alen,alen),(200,400,alen,alen)]
last_snake=[]
def move_head():
'''到达窗口边界就从另外一边出来'''
r = snake[0]#蛇头
if (r[0]==(screen.get_width())) and last_snake[1][0]+alen==r[0]: #向右到达右边界
snake[0] = (0,r[1],r[2],r[3])
elif r[0]==0 and last_snake[1][0]==r[0]+alen: #向左到达左边界
snake[0] = (screen.get_width()-alen,r[1],r[2],r[3])
elif r[1]==(screen.get_height()) and last_snake[1][1]+alen==r[1]: #向下到达下边界
snake[0] = (r[0],0,r[2],r[3])
elif r[1]==0 and last_snake[1][1]==r[1]+alen: #向上到达上边界
snake[0] = (r[0],screen.get_height()-alen,r[2],r[3])
else:
snake[0] = (r[0]+x_step,r[1]+y_step,r[2],r[3])
def move():
'''蛇前进,每一节蛇身体的下一个坐标是它的前一节身体的当前坐标'''
global x_step,y_step,last_snake
pygame.time.delay(300)
last_snake = snake.copy()
for i in range(len(snake)-1,-1,-1):
if i>0:
snake[i] = snake[i-1]
move_head()
draw_snake()
def draw_snake():
for s in snake:
pygame.draw.rect(screen,(0,0,255),s)
def draw_food():
global food_rect
if len(food_rect)==0:
xf = randint(1,screen.get_width())//alen*alen #食物出现的位置应被alen整除
yf = randint(1,screen.get_height())//alen*alen
food_rect = (xf,yf,alen,alen)
pygame.draw.rect(screen,(255,0,0),food_rect)
def eat():
global snake,last_snake,food_rect
if snake[0]==food_rect:
last_snake.insert(0,food_rect)
snake = last_snake.copy()
food_rect = ()
return True
else:
return False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:#关闭窗口
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
x_step = 0
y_step = -alen
elif event.key == pygame.K_RIGHT:
x_step = alen
y_step = 0
elif event.key == pygame.K_LEFT:
x_step = -alen
y_step = 0
elif event.key == pygame.K_DOWN:
x_step = 0
y_step = alen
screen.fill((145,120,60)) #填充背景,抹掉上一次的绘图
draw_food()
if eat():
draw_snake()
else:
move()
pygame.display.flip()