这个贪吃蛇玩起来头会晕...

2023-10-21 14:10
文章标签 ... 贪吃蛇 头会 玩起来

本文主要是介绍这个贪吃蛇玩起来头会晕...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

无聊,搞个反人类的贪吃蛇玩玩吧…

目录

  • 准备
  • 开始
    • 绘制地图
    • 绘制蛇
    • 绘制蛇的食物
    • 控制蛇的方向
  • 最终效果
  • 完整代码

准备

  1. 完成这个小小的游戏,仅使用了腾讯的MMKV(用于记录历史最高分)依赖,当然,不想导入依赖也可以使用原生的SharedPreferences进行替代。
  2. 关于icon,我在iconfont找到了自己喜欢的一个icon,当然,你也可以选择你喜欢的图标。

开始

绘制地图

贪吃蛇的移动是通过地图坐标的变化来修改蛇所在位置,绘制地图要把手机的屏幕像素转换成一个个小格子(坐标),同时需要考虑手机屏幕的大小不一问题,屏幕越大,地图格数越大,屏幕越小,则相反。

实现这样的需求,继承View时需要重写一个onSizeChanged(int w, int h, int oldw, int oldh)的方法,以此监听视图的大小发生变化时,设置地图格子的数量。

override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {super.onSizeChanged(w, h, oldw, oldh)// 地图数据初始化tileCountX = Math.floor((w / tileSize).toDouble()).toInt()tileCountY = Math.floor((h / tileSize).toDouble()).toInt()// 够分成一格的分成一格, 剩下不够一格的分成两份,左边一份,右边一份startCoordinatesX = ((w - (tileSize * tileCountX)) / 2);startCoordinatesY = ((h - (tileSize * tileCountY)) / 2);tileImage = Array(tileCountX) { IntArray(tileCountY) }clearTiles()
}

绘制蛇

蛇的绘制与地图的绘制不同,且蛇是一个在地图上移动的个体,要继承于绘制地图的类,需要一个地图上的初始坐标(蛇的坐标,蛇出现的位置),初始的移动方向。

fun initSnake() {// 初始化蛇的初始位置snakeCoordinate.add(Coordinate(8, 7))snakeCoordinate.add(Coordinate(6, 7))snakeCoordinate.add(Coordinate(5, 7))snakeCoordinate.add(Coordinate(4, 7))// 设置蛇的初始移动方向directionCurrent = RIGHT
}

蛇的坐标设置好,还需要重写onDraw(canvas: Canvas?)方法绘制蛇的身体。

fun initSnakeBody() {//从文件中加载图片loadTile(SNAKE_Head, resources.getDrawable(R.drawable.head, resources.newTheme()))loadTile(SNAKE_BODY, resources.getDrawable(R.drawable.zongzi, resources.newTheme()))updateView()
}fun loadTile(key: Int, drawable: Drawable) {val createBitmap = Bitmap.createBitmap(tileSize, tileSize, Bitmap.Config.ARGB_8888)val canvas = Canvas(createBitmap)drawable.setBounds(0, 0, tileSize, tileSize)drawable.draw(canvas)tileBitmap!![key] = createBitmap
}

当蛇的位置发生变化、坐标更新,原有已绘制的界面需要跟着变化,要执行Viewinvalidate()方法请求废除原有的视图,重新进行绘制。

绘制蛇的食物

既然是贪吃蛇,少不了蛇的食物。作为蛇的食物,不能一直每次都在同一个位置生成,这就用到了Random类随机生成一个x轴、y轴随机数,两个数拼凑一起,就成了食物的坐标。事物也不能在蛇的当前所在坐标生成,在生成食物的时候还需加上判断新生成的食物是否与当前蛇的所在位置冲突了。

fun addRandomFood() {var newCoord: Coordinate? = nullvar found = falsewhile (!found) {// 设置新食物生成的位置val newX: Int = random.nextInt(50)val newY: Int = random.nextInt(30)newCoord = Coordinate(newX, newY)var collision = falseval snakelength: Int = snakeCoordinate.size//遍历snake, 看新添加的粽子是否与snake的所在坐标冲突,如果是,重新生成坐标for (index in 0 until snakelength) {if (snakeCoordinate[index].equals(newCoord)) {collision = true}}for (index in obstacleCoordinate.indices) {if (obstacleCoordinate[index].equals(newCoord)) {collision = true}}found = !collision}// 储存已产生坐标foodCoordinate.add(newCoord!!)
}

控制蛇的方向

贪吃蛇的移动轨迹只能是屏幕范围,当蛇头撞上屏幕的四条边界、自己的身体,即视为游戏失败,因此蛇的每一次移动,都需要去判断是否是撞上了墙、自己的身体、是否吃到了食物。

fun updateSnake() {// 检测投是否撞墙(屏幕的四个边)if (newHead.x!! < 0 || newHead.y!! < 0 || newHead.x!! > tileCountX - 1 || newHead.y!! > tileCountY - 1) {// 游戏结束return}// 检测头是否撞到自己val snakeSize = snakeCoordinate.sizefor (snakeindex in 0 until snakeSize) {val get = snakeCoordinate[snakeindex]if (get.equals(newHead)) {// 游戏结束}}
}

设计初期,有想过如果开发的贪吃蛇和他人开发的贪吃蛇相比较,至少应该有点创新。经过一番苦思冥想,发觉可在控制蛇的操作上做一点点小修改,只是这一改也没啥,可玩家一玩起来头就会晕…

在这里插入图片描述

具体有何区别?市面上的贪吃蛇操作方向一般都是使用遥感,或者上下左右的方向键来操作,为了我那一点点的与众不同,决定使用手机重力的方向来作为蛇的方向。

override fun setListener() {orientationEventListener =object : OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) {override fun onOrientationChanged(orientation: Int) {var orientation = orientationif (orientation == ORIENTATION_UNKNOWN) {return  //手机平放时,检测不到有效的角度}// 检测是否有四个角度的改变orientation = if (orientation > 340 || orientation < 20) {SnakeView.RIGHT} else if (orientation in 71..109) {SnakeView.UP} else if (orientation in 161..199) {SnakeView.LEFT} else if (orientation in 251..289) {SnakeView.DOWN} else {-1 // 无效方向}if (orientation != -1) {// 设置蛇的下一个方向if (orientation != directionCurrent) {directionNext = orientation}}}}// 启动手机侧重方向监听orientationEventListener!!.enable()
}

使用OrientationEventListener(Context context, int rate)监听手机重力方向,界面销毁时谨记该事件同时执行销毁,避免占用内存。

最终效果

表面上的贪吃蛇

在这里插入图片描述

实际上的贪吃蛇

在这里插入图片描述

完整代码

完整代码、Apk文件已上传至Gitee,点击前往查看

这篇关于这个贪吃蛇玩起来头会晕...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/254914

相关文章

python贪吃蛇完整代码

创建一个简单的贪吃蛇游戏需要使用Python编程语言,并且通常需要使用一些图形库来帮助绘制游戏界面。下面是一个使用pygame库实现的基本贪吃蛇游戏的示例代码。如果你还没有安装pygame,你可以通过运行pip install pygame来安装它。 import pygameimport sysimport randomimport time# 初始化pygamepygame.init

自制HTML5游戏《贪吃蛇》

一、游戏简介         贪吃蛇是一款经典的电子游戏,最早在1976年由Gremlin公司推出,名为"Blockade"。游戏的玩法简单却富有挑战性,玩家控制一条蛇在封闭的场地内移动,通过吃食物增长身体,同时避免撞到自己的身体或场地边界。随着时间的推移,贪吃蛇游戏经历了多次演变,但其核心玩法依然受到玩家的喜爱。 二、为什么选择贪吃蛇游戏 经典性:贪吃蛇是一款历史悠久的游戏,其经典

经典游戏案例:贪吃蛇

学习目标:贪吃蛇核心玩法 游戏画面 项目结构目录 部分核心代码 using UnityEngine;using System.Collections;public class SnakeLengthFuck : MonoBehaviour {// Use this for initializationvoid Start () {}// Upd

贪吃蛇游戏代码(C语言项目)

本篇仅提供C语言代码,详细讲解在这篇博客:C语言:贪吃蛇游戏(从0开始完整版)-CSDN博客 1、运行演示 QQ2024618-155655 2、代码构成(vs编译器) 3、C语言代码 3.1 头文件Snake.h #pragma once#include <locale.h>#include <windows.h>#include <stdbool.h>

Raylib的贪吃蛇

配置Raylib库 工具链主函数模板Draw: 绘制网格Snake: 初始化Draw:绘制蛇与果Input:移动Logic:游戏主要逻辑Draw: 游戏结束 工具链 mkdir snakecd snake CMakeLists.txt cmake_minimum_required(VERSION 3.10)project(snake)set(CMAKE_EXPORT

基于Java+Swing贪吃蛇小游戏(含课程报告)

博主介绍: 大家好,本人精通Java、Python、C#、C、C++编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类个性化的开题框架和实际运作方案。 我擅长在JavaWeb、SSH、SSM、SpringBoot+VUE、VUE+FastApi、Python+Djan

【Qt项目专栏】贪吃蛇小游戏1.0

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 贪吃蛇小游戏1.0 项目编号:01 文章目录 贪吃蛇小游戏1.0一、项目介绍及演示1. 项目介绍2. 项目演示3. 窗口介绍3.1 游戏大厅窗口3.2 游戏关卡选择窗口3.3 游戏房间窗口 二、创建项目及资源配置1. 创建项目

实现贪吃蛇小游戏【简单版】

1. 贪吃蛇游戏设计与分析 1.1 地图 我们最终的贪吃蛇大纲要是这个样子,那我们的地图如何布置呢? 这里不得不讲⼀下控制台窗口的⼀些知识,如果想在控制台的窗口中指定位置输出信息,我们得知道该位置的坐标,所以首先介绍⼀下控制台窗⼝的坐标知识。 控制台窗口的坐标如下所示,横向的是X轴,从左向右依次增长,纵向是Y轴,从上到下依次增长。 在游戏地图上,

基于51单片机贪吃蛇小游戏

基于51单片机贪吃蛇小游戏 (仿真+程序) 功能介绍 具体功能: 1.用74HC573驱动点阵显示游戏画面; 2.上电后贪吃蛇会自动寻食; 3.按下四个按键中的任何一个就手动寻食了; ​演示视频: 基于51单片机贪吃蛇小游戏  添加图片注释,不超过 140 字(可选) 程序 #include <reg51.h>/***公众号:木子单片机**

Unity贪吃蛇改编【详细版】

Big and small greedy snakes 游戏概述 游戏亮点 通过对称的美感,设置两条贪吃蛇吧,其中一条加倍成长以及加倍减少,另一条正常成长以及减少,最终实现两条蛇对整个界面的霸占效果。 过程中不断记录两条蛇的得分情况,以及吃到毒药的记录,所谓一朝被蛇咬,十年怕井绳。 游戏运行的硬件环境 1.运行平台:PC端 2.相关软件:Unity5.4.0f3 2D 3.硬件