tuoheng_algN/test/游戏/SnakeGame.py

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()