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

  

  

python写一个能变身电光耗子的贪吃蛇的更多相关文章

  1. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  2. 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

    昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...

  3. [py]python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...

  4. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  5. Python写一个自动点餐程序

    Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...

  6. 用python写一个自动化盲注脚本

    前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...

  7. python写一个邮箱伪造脚本

    前言: 原本打算学php MVC的思路然后写一个项目.但是贼恶心, 写不出来.然后就还是用python写了个邮箱伪造. 0x01 第一步先去搜狐注册一个邮箱 然后,点开设置,开启SMTP服务. 当然你 ...

  8. 用python写一个非常简单的QQ轰炸机

    闲的没事,就想写一个QQ轰炸机,按照我最初的想法,这程序要根据我输入的QQ号进行轰炸,网上搜了一下,发现网上的案列略复杂,就想着自己写一个算了.. 思路:所谓轰炸机,就是给某个人发很多信息,一直刷屏, ...

  9. python写一个双色球彩票计算器

    首先声明,赌博一定不是什么好事,也完全没有意义,不要指望用彩票发财.之所以写这个,其实是用来练手的,可以参考这个来预测一些其他的东西,意在抛砖引玉. 啰嗦完了,马上开始,先上伪代码 打开网址 读取内容 ...

随机推荐

  1. 线程池提交任务的两种方式:execute与submit的区别

    Java中的线程池在进行任务提交时,有两种方式:execute和submit方法. 一.execute和submit的区别 execute只能提交Runnable类型的任务,无返回值.submit既可 ...

  2. IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335

    IList和DataSet性能差别         分类:             NHibernate/Spring/NetTiers/Castle/Ibatis             C#    ...

  3. 深入 x64

      本篇原文为 X64 Deep Dive,如果有良好的英文基础的能力,可以点击该链接进行阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者所有.   由于原文十 ...

  4. vulnhub 靶机 Kioptrix Level 1渗透笔记

    靶机下载地址:https://www.vulnhub.com/entry/kioptrix-level-1-1,22/ kali ip 信息收集 先使用nmap收集目标的ip地址 nmap -sP 1 ...

  5. Arduino 烧写bootloader

    什么是bootloader 一般情况下微处理器写入程序时都通过专门的编程器进行烧写,但是也可以通过在MCU中预先写入一些程序来实现某些基本功能,这些预先写入的程序代码就是bootloader.这样每次 ...

  6. Spring Security OAuth 笔记

    1  单点登录 关于单点登录的原理,我觉得下面这位老哥讲的比较清楚,有兴趣可以看一下,下面我把其中的重点在此做个笔记总结 https://juejin.cn/post/6844904079274197 ...

  7. 如何利用WebSocket实现网页版聊天室

    花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...

  8. [computer vision] Bag of Visual Word (BOW)

    Bag of Visual Word (BoW, BoF, 词袋) 简介 BoW 是传统的计算机视觉方法,用一些特征(一些向量)来表示一个图像.BoW的核心思想是利用一组较为通用的特征,将图像用这些特 ...

  9. PC端免费高效的同声翻译

    疫情期间上网课,对于英语听力较差或者需要观看英文视频,但实际上并没有双语字幕的这种情况下需要找一个实时的翻译工具.虽然说手机上此类软件比较多,但电脑上没有特别合适的应用可以做为一个免费实时翻译.哪怕是 ...

  10. ssm项目框架搭建(增删改查案例实现)——(SpringMVC+Spring+mybatis项目整合)

    Spring 常用注解 内容 一.基本概念 1. Spring 2. SpringMVC 3. MyBatis 二.开发环境搭建 1. 创建 maven 项目 2. SSM整合 2.1 项目结构图 2 ...