ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python写一个能变身电光耗子的贪吃蛇

2022-04-23 19:33:39  阅读:174  来源: 互联网

标签:body __ 20 鼠标 python 贪吃蛇 电光 pygame


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

 

  

 

  

 

 

标签:body,__,20,鼠标,python,贪吃蛇,电光,pygame
来源: https://www.cnblogs.com/mantou0/p/16183344.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有