- 论坛徽章:
- 0
|
- #
- !/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,很多地方还比较粗糙。请各位多指教。 |
|