python写一个能变身电光耗子的贪吃蛇
python写一个不同的贪吃蛇
写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦)
第一步先安装我们需要的类,
pycharm——写游戏的主要类
win32con,win32gui——用他来弹出提示信息
time——用来刷新,一般使用 clock.tick()
sys ——用他来结束进程
random——用它来随机生成食物
首先要规划分析一下:
1、绘制界面
2、在界面上绘制贪吃蛇
3、知道怎么让贪吃蛇移动
4、监听键盘,使用键盘控制贪吃蛇的移动
5、监听鼠标,点击鼠标后进化为电光耗子再次点击则还原为贪吃蛇
(电光耗子:鼠标控制,体型缩小,速度加快)
6、贪吃蛇撞墙游戏结束、咬到尾巴游戏结束(进化为电光耗子则撞墙死亡,咬到鼠标箭头游戏结束)
7、制作食物,随机生成一个位置
8、吃掉食物体型+1,分数+1
9、游戏结束要有gameover函数
能变身电光耗子的贪吃蛇超酷的好不好 (⊙o⊙)…
贪吃蛇模式(键盘控制) | 电光耗子模式(鼠标控制) |
![]() |
![]() |
使用注意:
同目录下要放一个背景照片,命名为bg.jpg,背景音乐我也写了,如果需要,同目录下放一个bg.mp3需要解除注释即可
代码:
print(""" o8888888o 88 . 88 (| -_- |) O\ = /O ____/`---'\____ . ' \| |// `. / \||| : |||// \ / _||||| -:- |||||- \ | | \\\ - /// | | | \_| ''\---/'' | | \ .-\__ `-` ___/-. / ___`. .' /--.--\ `. . __ . '< `.___\_<|>_/___.' >'. | | : `- \`.;`\ _ /`;.`/ - ` : | | \ \ `-. \_ __\ /__ _/ .-` / / ======`-.____`-.___\_____/___.-`____.-'====== `=---=' ............................................. 佛祖镇楼 BUG辟易 本游戏分为两种方式 第一种为正常的贪吃蛇,键盘控制 第二种为鼠标控制的电光耗子,注意不要被你的耗子吃到你的鼠标哦 两种模式使用鼠标点击来进行切换 作者: mantou 博客:https://www.cnblogs.com/mantou0/ """) import win32con,win32gui import time import pygame import sys import random # 定义游戏的开始和结束 game = 1 body = [] a = 20 b = 0 class Node(): def __init__(self, x, y): self.x = x self.y = y def shen(): body.append(Node(40, 40)) body.append(Node(100, 40)) body.append(Node(150, 40)) def move(a, b): old = body[0] new = Node(old.x, old.y) new.x = old.x + a new.y = old.y + b body.insert(0, new) def gameover(grade): ts = win32gui.MessageBox(0, str(grade), "分数", win32con.MB_OK) if ts == 1: sys.exit() def run(): # 绘制界面 pygame.init() windows = pygame.display.set_mode((500, 600)) pygame.display.set_caption('贪吃蛇') # 自动播放 # pygame.mixer.music.load("bg.mp3") # pygame.mixer.music.play(-1) # 添加背景 bg = pygame.image.load("bg.jpg") windows.blit(bg, (0, 0)) # 绘制食物,food_w=0,作为绘制食物的开始 food = [300,300] food_w = 1 # 绘制矩形 global a global b global game # 设置鼠标控制开关 start = -1 # 鼠标控制的速率和键盘控制不一样 timee = 0.1 # 迷之bug,用ping来缓冲一下 # 可要可不要,这里不要下面的ping都删掉 ping = 0 # 设置分数 grade = 0 # 贪吃蛇的颜色 s_color = "green" shen() while True: for e in pygame.event.get(): if e.type == pygame.QUIT: pygame.quit() sys.exit() # 键盘控制贪吃蛇,a控制x轴,b控制y轴 if e.type == pygame.KEYDOWN: if e.key == pygame.K_RIGHT: if a == -20: pass else: a,b = 20,0 if e.key == pygame.K_LEFT: if a == 20: pass else: a,b = -20,0 if e.key == pygame.K_UP: if b == 20: pass else: a,b = 0,-20 if e.key == pygame.K_DOWN: if b == -20: pass else: a,b = 0,20 if e.type == pygame.KEYUP: if e.key == pygame.K_RIGHT: if a == -20: pass else: a, b = 20, 0 if e.key == pygame.K_LEFT: if a == 20: pass else: a, b = -20, 0 if e.key == pygame.K_UP: if b == 20: pass else: a, b = 0, -20 if e.key == pygame.K_DOWN: if b == -20: pass else: a, b = 0, 20 # 监听鼠标,电后变身电光耗子,再次点击变成贪吃蛇 if e.type == pygame.MOUSEBUTTONDOWN: start = (-1) * start if start == 1: ping = 19 timee = 0.01 bu = 3 s_color = "yellow" print("开启鼠标控制") elif start == -1: timee = 0.1 bu = 20 s_color = "green" print("关闭鼠标控制") # 变成电光耗子后的移动 if start == 1: s_x,s_y = pygame.mouse.get_pos() if body[0].x < s_x: a = bu elif body[0].x > s_x: a = -bu if body[0].y < s_y: b = bu elif body[0].y > s_y: b = -bu if body[0].x in (s_x-10,s_x+10): a=0 if body[0].y in (s_y-10,s_y+10): b=0 # 重新绘制背景 windows.blit(bg, (0, 0)) # 绘制食物,实时更新,如果没有碰到食物执行pop,吃到食物就不进行pop # 吃到食物food_w = 0 通过if,从而改变食物的位置 pygame.draw.rect(windows, "red", pygame.Rect(food[0], food[1], 20, 20)) if food[0]-19 <= body[0].x<= food[0]+ping and food[1]-19 <= body[0].y <= food[1]+ping: food_w = 0 else: body.pop() if food_w == 0: x = random.randrange(1, 25) y = random.randrange(1, 30) nn = [int(x*20),int(y*20)] food = nn food_w = 1 grade+=1 # 刷新蛇的位置 move(a, b) for n in body: pygame.draw.rect(windows, s_color, pygame.Rect(n.x, n.y, 20, 20)) # 判断蛇什么时候歇菜 # 碰到墙 if body[0].x <= -20 or body[0].x >= 500 or body[0].y <= -20 or body[0].y >= 600: gameover(grade) # 咬住尾 l = len(body) for i in range(l-1): if body[0].x == body[i+1].x and body[0].y == body[i+1].y: gameover(grade) pygame.display.update() time.sleep(timee) def runnn(): ts = win32gui.MessageBox(0, """ 本游戏分为两种方式 第一种为正常的贪吃蛇,键盘控制 第二种为鼠标控制的电光耗子,注意不要被你的耗子吃到你的鼠标哦 两种模式使用鼠标点击来进行切换 """, "分数", win32con.MB_OK) if ts == 1: run() if __name__ == '__main__': runnn()