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

文章目录

    • 前言:
    • 一、游戏概述
      • 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.rhkb.cn/news/295796.html

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

相关文章

小米汽车正式发布:开启智能电动新篇章

随着科技的不断进步&#xff0c;汽车产业正经历着前所未有的变革。智能电动汽车作为这一变革的重要方向&#xff0c;正吸引着越来越多的目光。在这个充满机遇和挑战的时代&#xff0c;小米汽车凭借其卓越的技术实力和深厚的市场底蕴&#xff0c;终于迈出了坚实的一步。今天&…

护眼台灯是圆的好还是长方形的好?明基、书客、柏曼PK对比

护眼台灯作为现代人学习、工作的必备良伴&#xff0c;其形状的选择一直备受关注。市面上比较常见的有圆的和长方形两种形状。一般圆形光源的特点主要是灯光比较集中&#xff0c;采用对称的配光方式。条形光源的照射范围更广&#xff0c;光线在空间内分布均匀&#xff0c;各有特…

权限问题(Windows-System)

方法&#xff1a;用命令来写一个注册表的脚本 &#xff1f;System是最高级用户&#xff0c;但不拥有最高级权限 编写两文档&#xff1a;system.reg 和 remove.reg,代码如下&#xff1a; system.reg&#xff1a; Windows Registry Editor Version 5.00[-HKEY_CLASSES_ROOT\*…

谈谈考研数学几个常见误区

25考研数学&#xff0c;一定一定要吃透基础&#xff0c;练好计算 我之所以要强调这个&#xff0c;是因为现在的考研数学&#xff0c;越来越重视基础和计算的考察&#xff0c;题海战术已经过时&#xff0c;如果想要有效的提升自己&#xff0c;要进行针对性的学习。我去年考研的…

【zlm】音视频流与音频流合并的设计

目录 设想一 设想二 方案三 关键技术 测试语句 测试脚本 参考文档 设想一 //开始录制_option.mp4_save_path custom_path;_option.mp4_max_second max_second;vector<Track::Ptr> mytracks getTracks();auto src MediaSource::find( DEFAULT_VHOST, "1&quo…

基于ssm旅游资源网站(java项目+文档+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的旅游资源网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 旅游资源网站的主要使用者分为管理…

​做一个个人博客第一步该怎么做?零基础就找一个现成的模板学一学呗

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

对【AI技术创业】有哪些机会进行分析和引导

文章目录 方向一&#xff1a;行业解决方案,以下是一些常见的行业解决方案&#xff1a;方向二&#xff1a;智能产品和服务,以下是一些智能产品和服务的示例&#xff1a;方向三&#xff1a;教育和培训 1.智能客户服务&#xff1a; 利用自然语言处理&#xff08;NLP&#xff09;和…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

前端调试工具之Chrome Elements、Network、Sources、TimeLine调试

常用的调试工具有Chrome浏览器的调试工具&#xff0c;火狐浏览器的Firebug插件调试工具&#xff0c;IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速&#xff0c;功能强大这里主要介绍Chrome浏览器的调试工具。 打开 Google Chrome 浏览器&#xff0c…

国内首款AI音乐生成大模型「天工SkyMusic」并开启免费邀测;SWE-agent 修复GitHub仓库中的BUG和问题的软件工程代理

✨ 1: 天工SkyMusic 昆仑万维推出国内首款AI音乐生成大模型「天工SkyMusic」并开启免费邀测 天工SkyMusic是由昆仑万维集团开发的一款AI音乐生成工具&#xff0c;它基于先进的「天工3.0」超级大模型构建&#xff0c;代表了目前国内唯一公开可用的AI音乐生成大模型。这款工具专…

风声 | “革命”启动,这里是量子的新起点——

非洲正站在量子技术变革的前沿。 尽管非洲的量子安全技术尚未达到其他地区的先进水平&#xff0c;但它被视为未来计算技术发展的关键要素。如《福布斯非洲》所述&#xff1a;“量子计算目前的发展阶段&#xff0c;可以比喻为20世纪60年代的传统计算技术水平。” 非洲拥有众多的…

Xmind安装在指定目录

场景&#xff1a; Xmind安装默认是安装C盘。 问题描述 一般用户都习惯将软件安装在其他盘&#xff0c;但是Xmind不支持安装的时候指定磁盘或目录。 解决方案&#xff1a; 1、在D盘创建一个文件夹&#xff0c;用于安装Xmind&#xff0c;比如创建一个D:\Program Files (x86)…

windows无法使用hadoop报错:系统找不到路径

在windows下安装hadoop-3.1.4,进行环境变量配置后&#xff0c;打开window命令行窗口测试hadoop命令&#xff0c;报错&#xff0c;如图所示&#xff1a; 方案&#xff1a;由于JAVA_HOME路径有空格导致&#xff0c;可修改hadoop下\etc\hadoop\hadoop_env.cmd文档中set JAVA_HOME以…

Java就近原则和this关键字

Java 中的就近原则和 this 关键字有着密切的关系&#xff0c;特别是在处理成员变量与方法参数同名的情况下。就近原则指的是在同一作用域下&#xff0c;优先使用最近声明的变量或参数。 在 Java 中&#xff0c;如果一个方法的参数与类的成员变量同名&#xff0c;为了明确指示要…

[已解决]Vue3+Element-plus使用el-dialog对话框无法显示

文章目录 问题发现原因分析解决方法 问题发现 点击按钮&#xff0c;没有想要的弹框 代码如下 修改 el-dialog到body中&#xff0c;还是不能显示 原因分析 使用devtool中vue工具进行查看组件结构 原因在于&#xff0c;在一个局部组件(Detail->ElTabPane->…)中使用…

Harmony创建Page省事小技巧

在创建Page页面时&#xff0c;选择ArkTS File时&#xff0c;创建的文件不会自动生成基础代码&#xff0c;也不会自动在main_page.json中自动进行注册&#xff0c;如何解决问题呢&#xff0c;其实很简单创建Page页面时选择Page项后就会创建Page文件&#xff0c;创建完的页面会自…

Linux初学(十一)中间件

一、web服务 1.1 中间件简介 中间件其实就是一类软件&#xff0c;中间件的作用是让用户可以看到一个网页 总结&#xff1a;客户端可以向服务端发送请求&#xff0c;服务器端会通过中间件程序来接收请求&#xff0c;然后处理请求&#xff0c;最后将处理结果返回给客户端 1.2 中…

《手把手教你》系列技巧篇(六十八)-java+ selenium自动化测试 - 读写excel文件 - 下篇(详细教程)

1.简介 今天继续操作Excle&#xff0c;小伙伴或者童鞋们是不是觉得宏哥会介绍第三种工具操作Excle&#xff0c;今天不介绍了&#xff0c;有两种就够用了&#xff0c;其实一种就够用了&#xff0c;今天主要是来介绍如何使用不同的数据类型读取Excel文件。在实际测试中&#xff…

【VUE】ruoyi框架自带页面可正常缓存,新页面缓存无效

ruoyi框架自带页面可正常缓存&#xff0c;新页面缓存无效 背景&#xff1a; 用若依框架进行开发时&#xff0c;发现ruoyi自带的页面缓存正常&#xff0c;而新开发的页面即使设置了缓存&#xff0c;当重新进入页面时依旧刷新了接口。 原因&#xff1a;页面name与 getRouters …