#!/usr/bin/env python # -*- coding: utf-8 -*- import pygame as pygame import random import sys from pygame.rect import Rect
class Snake(object):
def init(self): # 定义3个 颜色属性,以防后面需要
self.black = pygame.Color(0, 0, 0) # 背景颜色
self.green = pygame.Color(0, 255, 0) # 目标方块颜色
self.white = pygame.Color(255, 255, 255) # 蛇颜色
def gameover(self): pygame.quit() sys.exit() def initialize(self): pygame.init() # 初始化,就是初始化 pygame 里面的东西,没啥鸟用,但是没它不行,哈哈哈哈 clock = pygame.time.Clock() # 创建时钟对象 (可以控制游戏循环频率 playSurface = pygame.display.set_mode((800, 600)) # 创建游戏窗口 pygame.display.set_caption('贪吃蛇') # 窗口名 snakePosition = [80, 80] # 贪吃蛇的头 snakebody = [[80, 80], [60, 80], [40, 80]] # 初始化贪吃蛇的长度 (注:这里以20*20为一个标准小格子) targetPosition = [200, 400] # 绿色方块目标位置 targetflag = 1 direction = 'right' # 初始化移动方向 """ 注: 上面的属性啥的,定义是定义了, 但是 是静态的 还动不了,,而且 还没有颜色,黑麻麻的,,, 所以才有了 下面的 这 一个 def main() 函数 , 我们 通过 main方法 让他们 嗨起来,五光十色,懂了吗?兄弟萌? """ changeDirection = direction # 输入的 方向 self.main(snakebody, targetPosition, targetflag, direction, changeDirection, snakePosition, playSurface, clock) def main(self, snakebody, targetPosition, targetflag, direction, changeDirection, snakePosition, playSurface, clock): # 所有事件全部放到一个实时循环中 while True: for event in pygame.event.get(): # 接收到退出事件后,退出程序 # pygame.event.get() ,监听用户事件,看用户在键盘上干了啥事 if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: # 根据输入,进行上下左右移动 if event.key == pygame.K_RIGHT: changeDirection = 'right' print("向右转") if event.key == pygame.K_LEFT: changeDirection = 'left' print("向左转") if event.key == pygame.K_DOWN: changeDirection = 'down' print("向上走") if event.key == pygame.K_UP: changeDirection = 'up' print("向下走") if event.key == pygame.K_ESCAPE: pygame.event.post(pygame.event.Event(pygame.QUIT)) if (changeDirection == 'left' and not direction == 'right'): # 如果改变后的移动方向是 left ,而原来的移动不是向 right, 则将方向 调为 left direction = changeDirection if (changeDirection == 'right' and not direction == 'left'): direction = changeDirection if (changeDirection == 'down' and not direction == 'up'): direction = changeDirection if (changeDirection == 'up' and not direction == 'down'): direction = changeDirection # 根据键盘的输入,改变蛇的头部,进行转弯操作 if direction == 'right': snakePosition[0] += 20 if direction == 'left': snakePosition[0] -= 20 if direction == 'down': snakePosition[1] += 20 if direction == 'up': snakePosition[1] -= 20 # 将蛇的头部当前位置加入到蛇身的列表中,增加蛇的长度 snakebody.insert(0, list(snakePosition)) # 如果蛇头与食物的位置重合,则判定吃到食物,将食物数量清零;而没吃到食物的话,蛇身就会跟着蛇头运动,蛇身的最后一节将被踢出列表 if (snakePosition[0] == targetPosition[0] and snakePosition[1] == targetPosition[1]): # 吃到绿色块 targetflag = 0 else: snakebody.pop() # 没吃到绿块 if targetflag == 0: # 如果吃到绿色块,则重新生成新的绿色块 x = random.randrange(1, 40) y = random.randrange(1, 30) targetPosition = [int(x * 20), int(y * 20)] # 绿色块位置 targetflag = 1 # 用来判断是否吃到绿色块,吃到则为0,否则为1 # 填充背景颜色 playSurface.fill(self.black) for position in snakebody: """ 在Surface上绘制矩形,第二个参数是线条(或填充)的颜色, 第三个参数Rect的形式是((x, y), (width, height)), 表示的是所绘制矩形的区域,其中第一个元组(x, y)表示的是该矩形左上角的坐标, 第二个元组 (width, height)表示的是矩形的宽度和高度。width表示线条的粗细,单位为像素;默认值为0,表示填充矩形内部 # 第一个参数surface 指定一个surface编辑区 # 第二个参数color 指定颜色 # 第三个参数rect 返回一个矩形包含位置信息(x,y),(width,height) # 第四个参数width 表示线条的粗细 width=0 实心 width=1 空心 # 画蛇 # 画目标方块儿 """ # 画蛇 ,,,就是把蛇行走的身形画出来 pygame.draw.rect(playSurface, self.white, Rect(position[0], position[1], 20, 20)) # 画目标方块儿 # print(targetPosition[0]) 你运行一下就知道了 # print(targetPosition[1]) pygame.draw.rect(playSurface, self.green, Rect(targetPosition[0], targetPosition[1], 20, 20)) # 更新显示到屏幕 pygame.display.flip() # 判断游戏结束 if (snakePosition[0] > 900 or snakePosition[0] < 0): # 窗口 长 snake.gameover() elif (snakePosition[1] > 800 or snakePosition[0] < 0): # 窗口 宽 snake.gameover() for i in snakebody[1:]: # 撞到自己 if (snakePosition[0] == i[0] and snakePosition[1] == i[1]): # 当蛇头的位置(像素)与蛇身 一样时,即可判定它们相撞了 snake.gameover() # 控制蛇行走速度 clock.tick(6) snake = Snake() snake.initialize()