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. 在虚拟机里面运行java程序

    首先输入vi在里面写一个java程序 然后再查找jdk 复制jdk名字 然后安装jdk 安装完之后输入Javac加你创建的文件名 然后再输入Java 和文件名(这个不要加后缀)然后就打印出来了

  2. AQS 支持两种同步方式?

    1.独占式 2.共享式 这样方便使用者实现不同类型的同步组件,独占式如 ReentrantLock,共享式如 Semaphore,CountDownLatch,组合式的如 ReentrantReadW ...

  3. 创建POJO

    创建一个名为student.java的POJO. 第一步,在包里面创建一个student类,右键点击包,点击新建,再点击创建一个类. 第二步,输入类名,点击完成. 第三步,输入数据类型和主键名,再写一 ...

  4. 前馈控制+PID

    参考来源: 北京交通大学 硕士学位论文 基于脉冲串控制的含位置反馈和前馈补偿的位置控制算法的研究  赵旺升

  5. 顺利通过EMC实验(15)

  6. 220v-5v稳压电路

    5V整流电路原理 先对电路进行整流 整流电路:利用单向导电器件将交流电转换成脉动直流电路,再用电容进行滤波 滤波电路:利用储能元件(电感或电容)把脉动直流电转换成比较平坦的直流电,然后对电路进行稳压 ...

  7. 使用 Vuex + Vue.js 构建单页应用

    鉴于该篇文章阅读量大,回复的同学也挺多的,特地抽空写了一篇 vue2.0 下的 vuex 使用方法,传送门:使用 Vuex + Vue.js 构建单页应用[新篇] ------------------ ...

  8. 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

    问题描述:在使用python爬取斗鱼直播的数据时,使用str(读取到的字节,编码格式)进行解码时报错:'utf-8' codec can't decode byte 0x8b in position ...

  9. myEclipse开发内存溢出解决办法myEclipse调整jvm内存大小 java.lang.OutOfMemoryError: PermGen space及其解决方法

    Window->Preferences->MyEclipse->Servers->Tomcat x.x->JDK->Optional Java VM argumen ...

  10. vue Element验证input提示

    <el-form-item prop="userName" class="userName_color"> <b>详细地址<i c ...