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

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

相关文章

贪吃蛇代码~~自编~~~

这个是贪吃蛇的代码,没设置加速系统~~自己可以根据自己的需求加功能 #include<stdio.h>#include<windows.h>#include<time.h>#include<stdlib.h>#include<iostream>#define MAX_SIZE 50using namespace std;void Loc(int x,int y);void W

用C语言生成字符贪吃蛇游戏

用C语言生成字符贪吃蛇游戏 1. 引言 贪吃蛇是一个经典的小游戏,玩家通过控制蛇的移动来吃食物,随着食物的增加,蛇的长度也会增加,游戏的难度逐渐提升。本文将介绍如何使用C语言来实现一个简单的字符贪吃蛇游戏。 2. 环境准备 在开始编码之前,需要确认以下开发环境: 编译器: 支持标准C语言的编译器(如gcc)。操作系统: Windows、Linux 或 macOS。终端: 用于显示游戏

贪吃蛇的小游戏--用C语言实现

贪吃蛇的小游戏–用C语言实现 游戏背景 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 实现基本的功能: • 贪吃蛇地图绘制 • 蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞⾃⾝死亡 • 计算得分 • 蛇⾝加速、减速 • 暂停游戏 技术要点 C语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32

vue3,贪吃蛇

<template><div flex items-center justify-center h-100vh w-full relative><div class=""><div class="header"><div>得分: {{ score }}</div><div class="flex"><div w-100>速度: {{ speed }}</div><el-sliderv-model=

MFC对话框贪吃蛇小游戏

花了近一个月的时间,学习了一下VC++深入详解,做了个贪吃蛇小游戏,虽然有很多的瑕疵,但还是想分享一下战果。 说一下思路: ①我们要绘制图形,我们可以用CClientDC(客户区设备上下文,与特定的窗口关联)声明一个dc对象作图。 当然这里我们要画蛇的身体和食物,设置一个食物类和蛇身体结构体 ②我们如何让图形动起来?SetTimer创建一个计时器,KillTimer()用来销毁计时器

大二必做项目贪吃蛇超详解之中篇游戏设计与分析

贪吃蛇系列文章 上篇win32 中篇设计与分析 文章目录 贪吃蛇系列文章1. 地图1. 1 `<locale.h>`本地化1. 2 类项1. 3 setlocale函数1. 4 宽字符的打印1. 5 地图坐标 2. 蛇身和食物3. 数据结构设计4. 游戏流程设计5. 核心逻辑实现分析5. 1 游戏主逻辑5. 2 GameStart5. 2. 1 SetInit5. 2. 2 Welcom

Lesson_for_java_day15--java小练习:贪吃蛇游戏(在控制台上操作)

目的:编写一个贪吃蛇游戏,在控制台中操作。 思路: 1、贪吃蛇游戏中,需要蛇对象,食物对象和操作界面对象。 2、蛇对象中,包含蛇身对象(每个点),所以用容器存储蛇对象。 3、同理食物对象也需要容器存储。 4、操作界面由每个具体的点组成,所以需要一个生成点的类。 5、再将这些对象整合到一个控制游戏过程的对象中,实现游戏的过程。 代码: 生成操作界面的点类: package

WebGL实现HTML5的贪吃蛇3D游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围。 自己写不出来,站在巨人肩膀总是有机会吧,想起《基于HTML5的电信网管3D机房监控应用》这篇提到的threejs,bab

昔日感觉尚在?在iPhone上与贪吃蛇重逢

最近听闻一款名为Snake ‘97的游戏实现了在iPhone上玩贪吃蛇的想法,而且限时免费,异常欣喜,下载之后,看到这界面的确就像找回当年的感觉,而且开发者还很用心地对按键进行了做旧处理。但是昔日的王者居然沦落到寄生于别的手机上,总不免有一种唏嘘的感觉。   曾几何时,不论是等车还是排队,诺基亚手机上的一个贪吃蛇游戏胜过如今一切歌曲、游戏、社交软件。选择最高难度,一条如脱缰野马(什么比

Amazon Bedrock 实践:零基础创建贪吃蛇游戏

本文探讨了如何利用 Amazon Bedrock 和大型语言模型,快速创建经典的贪吃蛇游戏原型代码。重点展示了利用提示工程,将创新想法高效转化为可运行代码方面的过程。文章还介绍了评估和优化提示词质量的最佳实践。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或