pygame做的贪吃蛇
某天无聊,在阅览室一上午做的。
唉,对做2d小游戏还是挺有兴趣的,可惜数学实在不好,只能偶尔做做简单的小玩意~
一口气写的,没写注释…
你控制的蛇是s,周围都是b,撞上就lost了
看代码~贴到文件里就可以用。
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
'''
Created on 2011-11-25
author: shiweifu
mail: shiweifu@126.com
'''
import struct
import sys
import os
import pygame
from random import randint
import pygame.sprite as Sprite
from pygame.locals import *
debug = True
FONT_NAME = "Arial"
FONT_SIZE = 25
SCREENRECT = Rect(0, 0, 640, 480)
RECT_LEN = 15
class Box:
def __init__(self, x, y, f):
self.x = x
self.y = y
self.flag = f
if self.flag:
self.surface = get_font_surface("b")
else:
self.surface = pygame.Surface((15,15))
def __str__(self):
return "x:%s y:%s" % (str(self.x),str(self.y))
class Link(object):
def __init__(self, x, y, surface):
self.x = x
self.y = y
self.surface = surface
def __str__(self):
return "x:%s y:%s" % (str(self.x),str(self.y))
class Player:
def __init__(self,x,y):
self.snake_body = []
self.append(x,y)
def append(self,x,y):
l = Link(x,y,get_font_surface("s",(255,0,0)))
self.snake_body.append(l)
def abc(self):
print("test")
def move_left(self):
i = len(self.snake_body) - 1
while i >= 1:
# debug_output("i:"+str(i))
self.snake_body[i].x = self.snake_body[i-1].x
self.snake_body[i].y = self.snake_body[i-1].y
i -= 1
self.snake_body[0].x -= 1
def move_right(self):
i = len(self.snake_body) - 1
while i >= 1:
# debug_output("i:"+str(i))
self.snake_body[i].x = self.snake_body[i-1].x
self.snake_body[i].y = self.snake_body[i-1].y
i -= 1
self.snake_body[0].x += 1
def move_up(self):
i = len(self.snake_body) - 1
while i >= 1:
self.snake_body[i].x = self.snake_body[i-1].x
self.snake_body[i].y = self.snake_body[i-1].y
i -= 1
self.snake_body[0].y -= 1
def move_down(self):
i = len(self.snake_body) - 1
while i >= 1:
self.snake_body[i].x = self.snake_body[i-1].x
self.snake_body[i].y = self.snake_body[i-1].y
i -= 1
self.snake_body[0].y += 1
def move(self,target):
if target == "up":
self.move_up()
if target == "down":
self.move_down()
if target == "left":
self.move_left()
if target == "right":
self.move_right()
def get_font_surface(s,color = (0,255,0),font_size=25):
font = pygame.font.SysFont(FONT_NAME,font_size)
#color = (0,255,0)
backcolor = (0,0,0)
r = font.render(s,True,color,backcolor)
return r
def create_map(width,height,rect_len):
y = 0
map_pos = []
snake_map = []
flag =True
while y < height:
x = 0
flag = False
while x < width:
if x < rect_len or x+rect_len >= width:
flag = True
elif y < rect_len or y+rect_len >= height:
flag = True
else:
flag = False
snake_map.append(Box(x/rect_len,y/rect_len,flag))
x += 15
y += 15
return snake_map
def debug_output(s, f=sys.stdout):
if debug == True:
f.write("debug info: " + s + "\n")
f.flush()
class Game:
WIDTH = 640
HEIGHT = 480
BOX_SIZE = 15
def __init__(self, caption="CooooolSnake"):
pygame.init()
pygame.display.set_caption(caption)
self.screen = pygame.display.set_mode(SCREENRECT.size, 0, 32)
pygame.mouse.set_visible(0)
self.background = pygame.Surface(SCREENRECT.size)
self.map_size = (Game.WIDTH/15-1,Game.HEIGHT/15-1)
self.snake_map = create_map(Game.WIDTH,Game.HEIGHT,self.BOX_SIZE)
self.stages = []
self.__crate_player__()
def get_new_pos(self):
done = False
pos = None
while not done:
x = randint(2,self.map_size[0]-1)
y = randint(2,self.map_size[1]-2)
for link in self.player.snake_body:
if x == link.x and y == link.y:
continue
pos = (x,y)
done = True
return pos
def __crate_player__(self):
x = randint(2,self.map_size[0]-1)
y = randint(2,self.map_size[1]-2)
self.player = Player(x,y)
def is_over(self):
head = self.player.snake_body[0]
i = 0
for link in self.player.snake_body[1:]:
if head.x == link.x and head.y == link.y:
return True
for box in self.snake_map:
if box.flag:
if head.x == box.x and head.y == box.y:
return True
return False
def update_snake(self):
for link in self.player.snake_body:
self.background.blit(link.surface,(link.x*Game.BOX_SIZE,link.y*Game.BOX_SIZE))
def update_map(self):
for box in self.snake_map:
self.background.blit(box.surface,(box.x*Game.BOX_SIZE,box.y*Game.BOX_SIZE))
def add_stage(self):
x,y = self.get_new_pos()
s = get_font_surface("s",(255,0,0))
l = Link(x,y,s)
self.stages.append(l)
def update_stage(self):
head = self.player.snake_body[0]
for stage in self.stages:
if stage.x == head.x and stage.y == head.y:
self.player.append(stage.x,stage.y)
self.stages.remove(stage)
for stage in self.stages:
self.background.blit(stage.surface,(stage.x*Game.BOX_SIZE,stage.y*Game.BOX_SIZE))
def refresh_background(self):
self.background.fill((0,0,0))
self.update_map()
self.update_snake()
self.update_stage()
self.screen.blit(self.background, (0, 0))
def over(self):
logo = get_font_surface("YOU ARE LOST!",(0,0,255),60)
self.background.blit(logo,(100,200))
clock = pygame.time.Clock()
done = False
count = 0
while not done:
clock.tick(10)
count += 1
if count == 5:
done = True
self.screen.blit(self.background, (0, 0))
pygame.display.flip()
def loop(self):
pygame.display.update()
clock = pygame.time.Clock()
target = ["up","down","left","right"][randint(0,3)]
count = 0
stage_time = randint(0,50)
done = False
while not done:
for e in pygame.event.get():
if e.type == pygame.KEYDOWN:
keystate = pygame.key.get_pressed()
if keystate[K_UP]:
if target != "down":
target = "up"
elif keystate[K_DOWN]:
if target != "up":
target = "down"
elif keystate[K_LEFT]:
if target != "right":
target = "left"
elif keystate[K_RIGHT]:
if target != "left":
target = "right"
if e.type == QUIT:
done = True
self.player.move(target)
if count == stage_time:
self.add_stage()
stage_time = randint(0,50)
count = 0
if self.is_over():
done = True
clock.tick(10)
count += 1
self.refresh_background()
if done:
self.over()
pygame.display.flip()
if __name__ == '__main__':
game = Game()
game.loop()
pass
浙公网安备 33010602011771号