93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
import random
|
|
|
|
from pygame.locals import *
|
|
import pygame
|
|
import time
|
|
|
|
from test.游戏.Food import Food, Snake, STEP
|
|
|
|
|
|
class SnakeGame():
|
|
def __init__(self):
|
|
self.width = 800
|
|
self.height = 600
|
|
self._running = False
|
|
|
|
|
|
def init(self):
|
|
pygame.init() #初始化所有导入的pygame模块
|
|
# 初始化一个准备显示的窗口或屏幕
|
|
self._display_surf = pygame.display.set_mode((self.width,self.height), pygame.HWSURFACE)
|
|
self.food = Food(5, 5, self._display_surf)
|
|
self.snake = Snake(1, 1, self._display_surf)
|
|
self._running = True
|
|
|
|
def run(self):
|
|
self.init()
|
|
while self._running:
|
|
pygame.event.pump() # 内部处理pygame事件处理程序
|
|
self.listen_keybord() # 监听键盘上下左右键
|
|
self.loop()
|
|
self.render()
|
|
time.sleep(0.05)
|
|
|
|
def listen_keybord(self):
|
|
keys = pygame.key.get_pressed()
|
|
|
|
if (keys[K_RIGHT]):
|
|
self.snake.moveRight()
|
|
|
|
if (keys[K_LEFT]):
|
|
self.snake.moveLeft()
|
|
|
|
if (keys[K_UP]):
|
|
self.snake.moveUp()
|
|
|
|
if (keys[K_DOWN]):
|
|
self.snake.moveDown()
|
|
|
|
if (keys[K_ESCAPE]):
|
|
self._running = False
|
|
|
|
def render(self):
|
|
self._display_surf.fill((0, 0, 0)) # 游戏界面填充为黑色
|
|
self.food.draw() # 画出食物
|
|
self.snake.draw() # 画出蛇
|
|
pygame.display.flip() # 刷新屏幕
|
|
|
|
|
|
def loop(self):
|
|
self.snake.update()
|
|
self.eat()
|
|
self.faild_check()
|
|
|
|
def faild_check(self):
|
|
# 检查是否吃到了自己
|
|
for i in range(2,self.snake.length):
|
|
if self.isCollision(self.snake.x[0], self.snake.y[0], self.snake.x[i], self.snake.y[i],40):
|
|
print('吃到自己了')
|
|
exit(0)
|
|
|
|
if self.snake.x[0] < 0 or self.snake.x[0] > self.width \
|
|
or self.snake.y[0] < 0 or self.snake.y[0] > self.height:
|
|
print('出边界了')
|
|
exit(0)
|
|
|
|
def eat(self):
|
|
if self.isCollision(self.food.x, self.food.y, self.snake.x[0], self.snake.y[0], 40):
|
|
self.food.x = random.randint(2, 9)*STEP
|
|
self.food.y = random.randint(2, 9)*STEP
|
|
self.snake.length += 1 # 蛇的长度加1
|
|
|
|
|
|
|
|
@staticmethod
|
|
def isCollision(x1, y1, x2, y2, bsize):
|
|
if x1 >= x2 and x1 <= x2 + bsize:
|
|
if y1 >= y2 and y1 <= y2 + bsize:
|
|
return True
|
|
return False
|
|
|
|
if __name__ == '__main__':
|
|
snake = SnakeGame()
|
|
snake.run() |