Python实现【贪吃蛇大作战】+源码

news/2024/7/27 11:37:14/文章来源:https://blog.csdn.net/m0_68089732/article/details/137343560

文章目录

    • 前言:
    • 一、游戏概述
      • 1.游戏玩法
      • 2.游戏特色
    • 二、游戏规则
    • 三、工具选择
    • 四、主要技术
      • pygame 库
      • numpy 库
      • cocos2d
    • 五、源码分享
    • 六、项目地址

前言:

今天的GitHub小游戏分享,我们将聚焦于一个经典而又极富趣味性的游戏——贪吃蛇大作战。这款游戏不仅考验玩家的反应速度和策略规划,而且在不断的更新和迭代中,增加了更多的现代元素和创新玩法,使得它能够吸引各年龄层的玩家。现在我带大家手把手用Python复刻出童年回忆!

在这里插入图片描述

一、游戏概述

《贪吃蛇大作战》是由武汉微派网络科技有限公司研发的一款极具人气的休闲竞技类手机游戏。自推出以来,它以其独特的游戏机制和易于上手的操作方式,迅速在全球范围内获得了巨大的成功和影响力。这款游戏不仅仅是一场简单的手速比拼,更是一场对玩家策略布局和应变能力的全面考验。

1.游戏玩法

在《贪吃蛇大作战》的世界里,玩家一开始操控的是一条细小的蛇。通过巧妙地移动和策略性地捕食,玩家可以使自己的蛇快速成长,变得更加强大。游戏中,蛇需要在地图上躲避其他玩家的蛇,同时吃掉随机出现的食物来增长身体长度。随着蛇的不断增长,玩家需要更加小心地操控,避免撞到自己的尾巴或是其他玩家的蛇,因为每一次碰撞都可能导致游戏的结束。
在这里插入图片描述

2.游戏特色

  • 多人在线竞技:玩家可以与来自世界各地的对手同场竞技,体验紧张刺激的对战乐趣。
  • 实时排行榜:游戏内设有实时更新的排行榜,玩家可以随时查看自己的全球排名,并与好友一较高下。
  • 丰富的皮肤系统:玩家可以通过游戏内的货币解锁各种独特的蛇皮肤,打造个性化的游戏角色。
  • 多样化的游戏模式:除了经典的生存模式,游戏还提供了多种不同的游戏模式,满足不同玩家的需求。
  • 社交互动:玩家可以添加好友,组建队伍,一起参与游戏,增强了游戏的社交属性。

二、游戏规则

  • 初始状态:游戏开始时,每位玩家控制一条位于地图中心的小蛇。

  • 移动控制:玩家通过屏幕上的虚拟摇杆或者触摸屏幕的滑动来控制蛇的移动方向。

  • 成长与进食:地图上会随机出现食物点,玩家需要引导自己的蛇去吃掉这些食物。每吃掉一个食物点,蛇的长度就会增加一小段。

  • 避免碰撞:在游戏中,玩家需要避免自己的蛇头撞到自己的蛇身或者游戏边界,否则游戏结束。同时,也要尽量避免与其他玩家的蛇发生碰撞,因为碰撞可能会导致蛇失去部分身体长度或者直接被淘汰。

  • 竞争与合作:虽然玩家需要避免与其他蛇的直接接触,但游戏中也存在一定的竞争和合作元素。玩家可以选择围堵其他玩家,迫使他们撞到自己的身体或边界,从而获得优势。同时,玩家也可以通过合作来共同对抗更强大的对手。

  • 生存与排名:游戏的目标是尽可能长时间地生存下去,并在游戏结束时拥有最长的蛇身。游戏会根据玩家的表现给予相应的排名和奖励。

在这里插入图片描述

三、工具选择

要使用Python实现《贪吃蛇大作战》游戏,以下是具体所需的工具:

  1. Python 3.8.0 或更高版本:用于编写游戏代码。
  2. Pygame:用于创建游戏界面和处理游戏逻辑。
  3. PyCharmVisual Studio Code:用于编写和调试代码。
  4. Git:用于代码管理和协作。

四、主要技术

pygame 库

pygame 是一个开源的Python模块,专门用于编写视频游戏。它包含了图形、声音、事件处理等功能,非常适合用来开发2D游戏。使用 pygame,我们可以轻松创建游戏窗口、处理用户输入、绘制图形和动画,以及添加音效等。

安装:可以通过 pip 命令安装 pygame:

pip install pygame

主要功能:

  • 创建游戏窗口和表面对象。
  • 处理键盘和鼠标事件。
  • 绘制图形和文本。
  • 添加音效和背景音乐。
  • 控制游戏循环和帧率。

numpy 库

numpy 是Python中用于科学计算的基础库,提供了强大的多维数组对象和各种用于操作这些数组的工具。在游戏中,我们可以使用 numpy 来处理蛇的身体结构和食物的随机生成位置。

安装:可以通过 pip 命令安装 numpy:

pip install numpy

主要功能:

  • 创建和操作多维数组。
  • 进行高效的数学运算。
  • 生成随机数,用于食物的随机位置生成。

cocos2d

使用了 cocos2d-python 作为游戏引擎。如果要运行代码,需要安装 cocos2d 库。

pip install cocos2d

五、源码分享

地图:

import cocos
from cocos.director import directorimport define
from snake import Snake
from dot import Dotclass Arena(cocos.layer.ColorLayer):is_event_handler = Truedef __init__(self):super(Arena, self).__init__(250, 255, 255, 255, define.WIDTH, define.HEIGHT)self.center = (director.get_window_size()[0] / 2, director.get_window_size()[1] / 2)self.batch = cocos.batch.BatchNode()self.add(self.batch)self.snake = Snake()self.add(self.snake, 10000)self.snake.init_body()self.enemies = []for i in range(7):self.add_enemy()self.keys_pressed = set()for i in range(50):self.batch.add(Dot())self.schedule(self.update)def add_enemy(self):enemy = Snake(True)self.add(enemy, 10000)enemy.init_body()self.enemies.append(enemy)def update(self, dt):self.x = self.center[0] - self.snake.xself.y = self.center[1] - self.snake.ydef on_key_press(self, key, modifiers):self.keys_pressed.add(key)self.snake.update_angle(self.keys_pressed)def on_key_release (self, key, modifiers):self.keys_pressed.remove(key)self.snake.update_angle(self.keys_pressed)

游戏脚本:负责创建和管理游戏场景、处理用户输入和游戏逻辑。通过Cocos引擎提供的类和方法,这个脚本实现了一个简单的游戏循环,包括游戏的开始、运行、结束和重新开始。

import cocosimport define
from arena import Arena
from gameover import Gameoverclass HelloWorld(cocos.layer.Layer):is_event_handler = Truedef __init__(self):super(HelloWorld, self).__init__()self.arena = Arena()self.add(self.arena)self.score = cocos.text.Label('30',font_name='Times New Roman',font_size=24,color=define.GOLD)self.score.position = 20, 440self.add(self.score, 99999)self.gameover = Gameover()self.add(self.gameover, 100000)def update_score(self):self.score.element.text = str(self.arena.snake.score)def end_game(self):self.gameover.visible = Trueself.gameover.score.element.text = str(self.arena.snake.score)def on_mouse_press(self, x, y, buttons, modifiers):if self.gameover.visible:self.gameover.visible = Falseself.arena.unschedule(self.arena.update)self.remove(self.arena)self.arena = Arena()self.add(self.arena)self.update_score()cocos.director.director.init(caption="Gluttonous Python")
cocos.director.director.run(cocos.scene.Scene(HelloWorld()))

snake.py贪吃蛇

# -*- coding: utf-8 -*-
import math
import random
import cocos
from cocos.sprite import Spriteimport define
from dot import Dotclass Snake(cocos.cocosnode.CocosNode):no = 0def __init__(self, is_enemy=False):super(Snake, self).__init__()self.is_dead = Falseself.angle = random.randrange(360)  # 目前角度self.angle_dest = self.angle  # 目标角度self.color = random.choice(define.ALL_COLOR)self.no = Snake.noSnake.no += 1if is_enemy:self.position = random.randrange(300, 1300), random.randrange(200, 600)if 600 < self.x < 1000:self.x += 400else:self.position = random.randrange(700, 900), random.randrange(350, 450)self.is_enemy = is_enemyself.head = Sprite('circle.png', color=self.color)self.scale = 1.5eye = Sprite('circle.png')eye.y = 5eye.scale = 0.5eyeball = Sprite('circle.png', color=define.BLACK)eyeball.scale = 0.5eye.add(eyeball)self.head.add(eye)eye = Sprite('circle.png')eye.y = -5eye.scale = 0.5eyeball = Sprite('circle.png', color=define.BLACK)eyeball.scale = 0.5eye.add(eyeball)self.head.add(eye)self.add(self.head)self.speed = 150if not is_enemy:self.speed = 180self.path = [self.position] * 100self.schedule(self.update)if self.is_enemy:self.schedule_interval(self.ai, random.random() * 0.1 + 0.05)def add_body(self):b = Sprite('circle.png', color=self.color)b.scale = 1.5self.body.append(b)if self.x == 0:print(self.position)b.position = self.positiontry:self.parent.batch.add(b, 999 + 100*self.no - len(self.body))except:print(999 + 100*self.no - len(self.body))def init_body(self):self.score = 30self.length = 4self.body = []for i in range(self.length):self.add_body()def update(self, dt):self.angle = (self.angle + 360) % 360arena = self.parentif self.is_enemy:self.check_crash(arena.snake)for s in arena.enemies:if s != self and not s.is_dead:self.check_crash(s)if self.is_dead:returnif abs(self.angle - self.angle_dest) < 2:self.angle = self.angle_destelse:if (0 < self.angle - self.angle_dest < 180) or (self.angle - self.angle_dest < -180):self.angle -= 500 * dtelse:self.angle += 500 * dtself.head.rotation = -self.angleself.x += math.cos(self.angle * math.pi / 180) * dt * self.speedself.y += math.sin(self.angle * math.pi / 180) * dt * self.speedself.path.append(self.position)lag = int(round(1100.0 / self.speed))for i in range(len(self.body)):idx = (i + 1) * lag + 1self.body[i].position = self.path[-min(idx,len(self.path))]if self.body[i].x == 0:print(self.body[i].position)m_l = max(self.length * lag * 2, 60)if len(self.path) > m_l:self.path = self.path[int(-m_l * 2):]def update_angle(self, keys):x, y = 0, 0if 65361 in keys:  # 左x -= 1if 65362 in keys:  # 上y += 1if 65363 in keys:  # 右x += 1if 65364 in keys:  # 下y -= 1directs = ((225, 180, 135), (270, None, 90), (315, 0, 45))direct = directs[x + 1][y + 1]if direct is None:self.angle_dest = self.angleelse:self.angle_dest = directdef add_score(self, s=1):if self.is_dead:returnself.score += sl = (self.score - 6) / 6if l > self.length:self.length = lself.add_body()def ai(self, dt):self.angle_dest = (self.angle_dest + 360) % 360if (self.x < 100 and 90 < self.angle_dest < 270) or (self.x > define.WIDTH - 100 and (self.angle_dest < 90 or self.angle_dest > 270)):self.angle_dest = 180 - self.angle_destelif (self.y < 100 and self.angle_dest > 180) or (self.y > define.HEIGHT - 100 and self.angle_dest < 180):self.angle_dest = -self.angle_destelse:arena = self.parentself.collision_detect(arena.snake)for s in arena.enemies:if s != self:self.collision_detect(s)def collision_detect(self, other):if self.is_dead or other.is_dead:returnfor b in other.body:d_y = b.y - self.yd_x = b.x - self.xif abs(d_x) > 200 or abs(d_y) > 200:returnif d_x == 0:if d_y > 0:angle = 90else:angle = -90else:angle = math.atan(d_y / d_x) * 180 / math.piif d_x < 0:angle += 180angle = (angle + 360) % 360if abs(angle - self.angle_dest) < 5:self.angle_dest += random.randrange(90, 270)def check_crash(self, other):if self.is_dead or other.is_dead:returnif (self.x < 0 or self.x > define.WIDTH) or (self.y < 0 or self.y > define.HEIGHT):self.crash()returnfor b in other.body:dis = math.sqrt((b.x - self.x) ** 2 + (b.y - self.y) ** 2)if dis < 24:self.crash()returndef crash(self):if not self.is_dead:self.is_dead = Trueself.unschedule(self.update)self.unschedule(self.ai)arena = self.parentfor b in self.body:arena.batch.add(Dot(b.position, b.color))arena.batch.add(Dot(b.position, b.color))arena.batch.remove(b)arena.remove(self)arena.add_enemy()del self.pathif self.is_enemy:arena.enemies.remove(self)del self.bodydel selfelse:arena.parent.end_game()

游戏结束:

# -*- coding: utf-8 -*-
import cocos
from cocos.director import director
import defineclass Gameover(cocos.layer.ColorLayer):def __init__(self):super(Gameover, self).__init__(200, 235, 235, 200, 400, 300)self.position = (director.get_window_size()[0] / 2 - 200,director.get_window_size()[1] / 2 - 150)self.visible = Falseself.score = cocos.text.Label('',font_name='SimHei',font_size=36,color=define.MAROON)self.score.position = 250, 200self.add(self.score)text = cocos.text.Label('SCORE: ',font_name='SimHei',font_size=24,color=define.MAROON)text.position = 50, 200self.add(text)text = cocos.text.Label('CLICK TO REPLAY...',font_name='SimHei',font_size=24,color=define.MAROON)text.position = 50, 100self.add(text)

六、项目地址

https://github.com/Luoyukeji/python-

在这里插入图片描述

原作:crossin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1035148.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署云原生边缘计算平台kubeedge

文章目录 1、kubeedge架构2、基础服务提供 负载均衡器 metallb2.1、开启ipvc模式中的strictARP2.2、部署metalb2.2.1、创建IP地址池2.2.2、开启二层转发&#xff0c;实现在k8s集群节点外访问2.2.3、测试 3、部署cloudcore3.1、部署cloudcore3.2、修改cloudcore的网络类型 4、部…

SV-7101V网络音频终端产品简介

网络广播终端SV-7101V&#xff0c;接收网络音频流&#xff0c;实时解码播放。本设备只有网络广播功能&#xff0c;是一款简单的网络广播终端。提供一路线路输出接功放或有源音箱。 网络广播终端SV-7101V&#xff0c;接收网络音频流&#xff0c;实时解码播放。本设备只有网络广播…

微信批量群发软件有哪款比较好用的?

微信有自带的群发助手&#xff0c;只能群发200个好友&#xff0c;比较有局限性。 我是做销售的&#xff0c;对于群发的需求特别大&#xff0c;我自己平时经常用WeB微信批量群发软件有哪款比较好用的&#xff1f;WeB&#xff0c;它满足了我的群发需求&#xff0c;用起来特别方便…

nginx与tomcat的区别?

关于nginx和tomcat的概念 网上有很多关于nginx和tomcat是什么东西的定义&#xff0c;我总结了一下: tomcat是Web服务器、HTTP服务器、应用服务器、Servlet容器、web容器。 Nginx是Web服务器、HTTP服务器、正向/反向代理服务器&#xff0c;。 这里有两个概念是交叉的&#xff…

Centos8/linux/虚拟机安装docker

docker分为ce版和ee版&#xff0c;个人使用ce版就行了&#xff0c;别问为什么&#xff0c;问就是ee版收费。 这是在线版的&#xff0c;离线版的请参考Centos8离线下载安装docker 1.首先切换到root用户 2.为确保安装时出现不必要的问题&#xff0c;先更新一下yum包 sudo yum…

MAC的Safari浏览器没有声音解决办法

有一段时间没打开电脑&#xff0c;也不知道是系统自动更新或是什么缘故&#xff0c;所有浏览器都无法正常发声。 现象如下&#xff1a; 首先&#xff0c;Safari浏览器无法自动播放声音&#xff0c;下载的360浏览器现象一致&#xff0c;但是播放其他音乐播放软件和视频软件都正…

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中&#xff0c;文件上传是一项常见的功能需求&#xff0c;用于允许用户向服务器提交文件&#xff0c;如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言&#xff0c;提供了方便且高效的方式来处理文件上传操作。其中&#xff0c;r.F…

【SpringCloud】认识微服务

目 录 一.服务架构演变单体架构分布式架构服务治理微服务总结 二.微服务技术对比微服务结构微服务技术对比企业需求 三.SpringCloud 一.服务架构演变 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点&#xff1a; 架…

Linux系统使用Docker部署Jupyter Notebook结合内网穿透实现公网访问本地笔记

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

docker搭建CI/CD环境配置过程中的常见问题

一、Jenkins 1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepo…

以柔克刚,以静制动,以弱胜强 举几个生活中通俗易懂的经典案例,说明这些伟大的智慧的精妙之处 省力的竞争策略

简单易懂 很神奇 省力的竞争策略 以柔克刚 案例&#xff1a;柔道运动。柔道是一种利用对手力量的武术&#xff0c;它教导人们如何将对手的力量转化为自己的优势。柔道中的摔法、招式都是以柔克刚的体现&#xff0c;通过巧妙引导而非硬碰硬的对抗&#xff0c;使得体型较小的选…

Open3D(C++) 基于随机抽样与特征值法的点云平面稳健拟合方法

目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 1、论文概述 针对点云数据含有异常值且传统拟合方法拟合结果不理想的情…

城市治理/县域治理方案:构建基于AI视频能力的“一张网”,助力新型城市发展

TSINGSEE青犀AI算法中台是一款平台型产品&#xff0c;专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点&#xff0c;可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术&#xff0c;包括视频编解码技术、嵌入式…

linux删除 buff/cache缓存

1.查看当前内存占用 free -h如图&#xff0c;缓存占用了将近9G&#xff0c;接下来进行清理 释放页缓存 echo 1 > /proc/sys/vm/drop_caches释放dentries和inodes echo 2 > /proc/sys/vm/drop_caches释放所有缓存 echo 3 > /proc/sys/vm/drop_caches再次查看&#…

Linux:TCP的流量控制/滑动窗口/延迟应答

文章目录 流量控制滑动窗口延迟应答 本篇要总结的是对于TCP的一些其他概念进行总结 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送,就会造成丢包, 继而引起丢包重传等等一系列连锁反应 因此TCP支持根据…

如何在比特币上验证ZK Proofs

1. 引言 前序博客有&#xff1a; 基于BitVM的乐观 BTC bridgeBitVM&#xff1a;Bitcoin的链下合约Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM2&#xff1a;比特币上的无需许可验证以比特币脚本来实现SNARK VerifierClementine&#xff1a;Citrea的基于BitVM的…

element-ui tableData导出为xlsx文件

下载 npm i / yarn add file-saver、xlsx库 引入 import FileSaver from “file-saver”; import XLSX from “xlsx”; const simexport (data) > {// if (data.create_time && data.create_time.length > 0) {// data.start_time parseTime(data.create_tim…

JDK,JRE,JVM 区别和联系【大白话Java面试题】

JDK&#xff0c;JRE&#xff0c;JVM 区别和联系 大白话回答&#xff1a; JDK是开发环境一般开发人员需要&#xff0c;包含开发环境&#xff08;JDK)和运行环境&#xff08;JRE&#xff09;&#xff0c;JRE是运行环境&#xff0c;普通用户需要。jre文件夹下的bin文件夹就是JVM的…

搭建电商网站外贸网站用API接口可以实现哪些功能(天猫API接口|京东API接口)

在电商领域&#xff0c;API接口可以实现多种功能&#xff0c;起到连接内外部系统及优化电商业务流程等多种作用&#xff0c;从而来提高电商企业的运营效率。 具体来看&#xff0c;API接口接入可以用来&#xff1a; 商品管理&#xff1a; API接口能够用来获取商品详情等&#…

【原创】基于springboot+vue的会议室预约管理系统

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…