Chinaunix
标题:
用Pygame 写的一个“贪吃蛇”的小程序
[打印本页]
作者:
grep_one
时间:
2010-08-25 17:57
标题:
用Pygame 写的一个“贪吃蛇”的小程序
#
!/usr/bin/env python
import pygame, sys, os
from pygame.locals import *
from random import randint
from time import time
import pygame.joystick
SCREEN_SIZE = (600,400)
MOVE_UP = 1
MOVE_DOWN = 2
MOVE_LEFT = 3
MOVE_RIGHT = 4
white = 255, 240, 200
black = 0, 0, 0
class snake:
num = 0
_x = 150
_y = 150
# the snake move toward right by default
_d = MOVE_RIGHT
_head = False
def __init__(self):
self.num = 80
def initialize_snake(self):
snake = []
n = self.num
while n > 0:
# head
if n == self.num:
np = (self._x+n, self._y, self._d, True)
else:
np = (self._x+n, self._y, self._d, False)
snake.append(np)
n -= 1
return snake
def draw_snake(self, surface, color, snake):
"create snake"
for i in snake:
pos = (i[0], i[1])
surface.set_at(pos, color)
def move_snake(self, sk, lengthen):
"move snake"
# sk: snake
n = 1
new_sk = []
sk_head = sk[0]
# construct head
if sk_head[2] == MOVE_UP:
new_y = (sk_head[1]-1)%SCREEN_SIZE[1]
new_x = sk_head[0]
elif sk_head[2] == MOVE_DOWN:
new_y = (sk_head[1]+1)%SCREEN_SIZE[1]
new_x = sk_head[0]
elif sk_head[2] == MOVE_LEFT:
new_x = (sk_head[0]-1)%SCREEN_SIZE[0]
new_y = sk_head[1]
else:
new_x = (sk_head[0]+1)%SCREEN_SIZE[0]
new_y = sk_head[1]
pri_node = sk_head
sk_head = (new_x, new_y, sk_head[2], sk_head[3])
new_sk.append(sk_head)
for i in sk[:-1]:
new_sk.append(i)
if lengthen == True:
new_sk.append(sk[-1])
return new_sk
def overlap(self, sk):
sk_head = sk[0]
for i in sk[1:]:
if sk_head[0] == i[0] and sk_head[1] == i[1]:
return True
return False
class food:
name = ''
food = None
rect = (SCREEN_SIZE[0]/2, SCREEN_SIZE[1]/2)
f_w = 0
f_h = 0
def __init__(self, filename, name):
self.food = pygame.image.load(filename).convert_alpha()
self.f_w, self.f_h = self.food.get_size()
self.name = name
def display(self, surface, move):
if move == True:
self.rect = (randint(0, SCREEN_SIZE[0]), randint(0, SCREEN_SIZE[1]))
surface.blit(self.food, self.rect)
return self.rect
def eaten(self, sk):
"check if food has been eaten by the snake"
if sk[0] >= self.rect[0] and sk[0] <= self.rect[0] + self.f_w \
and sk[1] >= self.rect[1] and sk[1] <= self.rect[1] + self.f_h:
return True
else:
return False
class score:
text_x = 0
text_y = 0
marks = 0
sc = None
def __init__(self, surface):
self.sc = surface
def update_score(self, mark):
self.marks += mark
self.display_score()
def clear_score(self):
self.marks = 0
self.display_score()
def display_score(self):
fg = 250, 240, 200
bg = 0, 0, 0
font = pygame.font.Font(None, 20)
textstring = "Your score: %d" % self.marks
self.text_x = SCREEN_SIZE[0] - len('Your score: ') - 80
self.text_y = SCREEN_SIZE[1] - 20
txt_surface = font.render(textstring, 0, fg, bg)
self.sc.blit(txt_surface, (self.text_x, self.text_y))
class food_manager:
gs_food = None
counter = 0
interval = 0
eat = False
lengthen = False
mark = 0
def __init__(self, screen, food):
self.gs_food = food
self.refresh_interval()
self.get_mark()
def run(self, surface, score, sk):
if self.counter >= self.interval:
self.gs_food.display(surface, True)
self.refresh_interval()
self.counter = 0
self.eat = False
self.lengthen = False
elif self.eat == False:
self.gs_food.display(surface, False)
if self.gs_food.eaten(sk[0]) and self.eat == False:
self.eat = True
score.update_score(self.mark)
self.lengthen = True
# display the next food right away
self.counter = self.interval
else:
score.update_score(0)
self.counter += 1
def refresh_interval(self):
if self.gs_food.name == 'candy':
self.interval = randint(SCREEN_SIZE[1], SCREEN_SIZE[0])
elif self.gs_food.name == 'pizza':
self.interval = randint(SCREEN_SIZE[1], SCREEN_SIZE[0])/2
else:
print 'Unknow food: %s' % self.gs_food.name
sys.exit(1)
def get_mark(self):
if self.gs_food.name == 'candy':
self.mark = 5
elif self.gs_food.name == 'pizza':
self.mark = 10
else:
print 'Unknow food: %s' % self.gs_food.name
sys.exit(1)
def is_lengthen(self):
return self.lengthen
def main():
clock = pygame.time.Clock()
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.display.set_caption('Gluttonous Snake')
snake1 = snake()
candy = food('candy.jpg', 'candy')
pizza = food('pizza.jpg', 'pizza')
# score board
score_b = score(screen)
food_candy = food_manager(screen, candy)
food_pizza = food_manager(screen, pizza)
sk = snake1.initialize_snake()
done = 0
while not done:
screen.fill(black)
snake1.draw_snake(screen, white, sk)
food_candy.run(screen, score_b, sk)
food_pizza.run(screen, score_b, sk)
if snake1.overlap(sk) == True:
print 'Snake body overlapped. Your score is cleared!'
score_b.clear_score()
pygame.display.update()
# lengthen the snake after feeding
sk = snake1.move_snake(sk, food_candy.is_lengthen() or food_pizza.is_lengthen())
sk_head = sk[0]
# quit event control
new_head = ()
for e in pygame.event.get():
if e.type == QUIT or (e.type == KEYUP and e.key == K_ESCAPE):
done = 1
break
elif e.type == KEYDOWN:
if e.key == K_LEFT:
if sk_head[2] != MOVE_LEFT and sk_head[2] != MOVE_RIGHT:
new_head = (sk_head[0], sk_head[1], MOVE_LEFT, sk_head[3])
elif e.key == K_RIGHT:
if sk_head[2] != MOVE_RIGHT and sk_head[2] != MOVE_LEFT:
new_head = (sk_head[0], sk_head[1], MOVE_RIGHT, sk_head[3])
elif e.key == K_UP:
if sk_head[2] != MOVE_UP and sk_head[2] != MOVE_DOWN:
new_head = (sk_head[0], sk_head[1], MOVE_UP, sk_head[3])
elif e.key == K_DOWN:
if sk_head[2] != MOVE_DOWN and sk_head[2] != MOVE_UP:
new_head = (sk_head[0], sk_head[1], MOVE_DOWN, sk_head[3])
else:
pass
elif e.type == MOUSEBUTTONDOWN and e.button == 1:
done = 1
break
# user changed the direction, update sk_head, and sk
if len(new_head) != 0:
temp = []
sk_head = new_head
temp.append(sk_head)
sk = temp + sk[1:]
clock.tick(50)
if __name__ == '__main__':
main()
复制代码
刚开始学习Python,很多地方还比较粗糙。请各位多指教。
作者:
L_kernel
时间:
2010-08-25 19:12
原来还有Pygame这个模块,用来写游戏之类的貌似不是很负责~~
作者:
a515200
时间:
2010-10-17 08:50
本帖最后由 a515200 于 2010-10-17 08:58 编辑
你既然要写代码,就要贴完整,把他弄到rar压缩包里,还要附上图片,没图片怎么显示?
还有,这段代码是网上的。。。
作者:
starzhestarzhe
时间:
2010-10-17 10:05
你既然要写代码,就要贴完整,把他弄到rar压缩包里,还要附上图片,没图片怎么显示?
还有,这段代码是网上 ...
a515200 发表于 2010-10-17 08:50
作者:
a515200
时间:
2010-10-17 14:55
熊猫 !
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2