Android Studio实现贪吃蛇小游戏

news2024/12/26 0:04:40

项目目录

  • 一、项目概述
  • 二、开发环境
  • 三、详细设计
  • 四、运行演示
  • 五、项目总结

一、项目概述

贪吃蛇是一款经典的街机游戏,不仅在电子游戏史上占有一席之地,也在很多人的童年回忆中留下了深刻的印象。在游戏中,玩家需要操纵一条蛇通过吃食物来增加自己的长度,同时要避免撞到墙或自己的身体。随着蛇不断吃食物,它的身体会越来越长,游戏的难度也会随之增加。贪吃蛇的游戏机制很简单,但是它具有很高的可玩性和挑战性,深受玩家喜爱。在现代计算机上,贪吃蛇已经经过了许多改进和升级,增加了更多的游戏元素和特性,例如多种模式,不同的难度级别,多人游戏等等。

本次实现的贪吃蛇小游戏在游戏机制中去除了墙壁和自己身体的碰撞限制,玩家操控贪吃蛇不断地在吃食物使自己变得强大。

二、开发环境

在这里插入图片描述

三、详细设计

定义的SnakeSpace类,继承父类View,定义了很多数学,在构造方法中initView(),方向默认向上,创建个snakeArray链表,存储当前的方块位置,我们将二维数组映射到一维数组,所以每个(x, y)变为x * width + y,showFood()是显示食物的小方块。

    private void initView(){
        direction = DIRECTION_UP;
        snakeArray = new LinkedList<Integer>();
        snakeArray.add(6*100+16);
        snakeArray.add(6*100+17);
        snakeArray.add(6*100+18);
        showFood();
    }

Math.random()返回[0, 1)的随机数,我们乘以8,就是[0, 8),Math.round()函数返回一个数字四舍五入后最接近的整数。比如10.5返回11,10.4返回10这样。所以先生成一个食物坐标,如果链表中包含了这个食物坐标,则继续随机生成,最后将坐标再进行映射为snakeFood。

    private void showFood(){
        int x = (int) Math.round(Math.random() * 8);
        int y = (int) Math.round(Math.random() * 16);

        while (snakeArray.contains(x * 100 + y)){
            x = (int) Math.round(Math.random() * 8);
            y = (int) Math.round(Math.random() * 16);
        }
        Log.e("SnakeSpace", "food pos = " + snakeFood);
        snakeFood = x*100 + y;
    }

onDraw(Canvas canvas)函数非常核心,先获取到屏幕的宽和高,也就是分辨率。定义画笔对象paint,设置画笔粗细为4。画布对象canvas使用本画笔drawLine()绘制网格线。然后定义新的画笔paint2,设置画笔颜色为淡青色,使用双层for循环遍历网格,如果是贪吃蛇身体或者食物就画黑色的矩形, 如果是空闲块就画淡青色的矩形。

    @Override
    protected void onDraw(Canvas canvas) {
        int width = getWidth();
        int height = getHeight();
        int dx = width / 16;
        Paint paint = new Paint();
        paint.setStrokeWidth(4);
        canvas.drawColor(0xaa87CEEB);
        canvas.drawLine(0, 0, width, 0, paint);
        canvas.drawLine(width, 0, width, height, paint);
        canvas.drawLine(width, height, 0, height, paint);
        canvas.drawLine(0, height, 0, 0, paint);
        Paint paint2 = new Paint();
        paint2.setColor(0xaaE1FFFF);

        for (int i = 0; i < 16; i++){
            for (int j = 0; j < 32; j++) {
                // 如果是贪吃蛇身体或者食物就画黑色的矩形
                if (snakeArray.contains(i*100+j) || snakeFood == (i*100+j)){
                    canvas.drawRect((dx * i) + 1, (dx * j) + 1, (dx * i) + dx - 1, (dx * j) + dx - 1, paint);
                }else{
                    // 如果是空闲块就画淡青色的矩形
                    canvas.drawRect((dx * i) + 1, (dx * j) + 1, (dx * i) + dx - 1, (dx * j) + dx - 1, paint2);
                }
            }
        }

        super.onDraw(canvas);
    }

在这里插入图片描述

在MainActivity中执行 startTimer()方法,定义定时任务对象mTimerTask,控制snake进行move(),并且显示score,延迟1s后开始每0.5s执行上述方法。

    private fun startTimer(){
        // 先停止计时
        stopTimer()
        // 计时器对象
        mTimer = Timer()
        // 定时任务对象
        mTimerTask = object : TimerTask(){
            override fun run() {
                snake.move()
                score?.post({
                    score?.setText("" + (snake.snakeArray.size - 3))
                })
            }
        }
        // 延迟1s后开始每0.5s执行一次任务
        mTimer!!.schedule(mTimerTask, 1000, 500)
    }

move()方法主要是首先获取贪吃蛇的头部坐标,这里我们提到的坐标都是映射后的一维坐标。根据方向进行选择。向左如果没出界每次移动100,向上没出界移动1,向右是100,向下是1,移动后的坐标为firstIndex,我们将它加入链表头部,如果firstIndex等于snakeFood,说明移动的位置刚好吃掉食物,直接showFood()显示新的食物位置,否则removeLast()删除链表尾部元素,因为你头部前进一格,尾部必然减少一格。

 public void move(){
        int firstIndex = snakeArray.getFirst();
        switch (direction){
            case DIRECTION_LEFT:
                if (firstIndex >= 100){
                    firstIndex -= 100;
                }else{
                    return;
                }
                break;
            case DIRECTION_UP:
                if (firstIndex%100 > 0){
                    firstIndex -= 1;
                }else{
                    return;
                }
                break;
            case DIRECTION_RIGHT:
                if (firstIndex < 1500){
                    firstIndex += 100;
                }else{
                    return;
                }
                break;
            case DIRECTION_DOWN:
                if (firstIndex%100 < 31){
                    firstIndex += 1;
                }else{
                    return;
                }
                break;
        }
        snakeArray.addFirst(firstIndex);
        if (firstIndex == snakeFood){
            showFood();
        }else{
            snakeArray.removeLast();
        }
        postInvalidate();
    }

四、运行演示

Android Studio实现贪吃蛇小游戏

五、项目总结

贪吃蛇是一款广受欢迎的编程练习项目。许多编程语言和平台都提供了贪吃蛇的编程实现教程,通过编写贪吃蛇游戏,学习者可以掌握很多计算机科学的基础知识,例如数据结构、算法、图形界面设计等。总之,贪吃蛇是一款非常经典和有趣的游戏,它不仅提供了娱乐,也可以作为一个教育工具来帮助人们学习计算机科学和编程。


🚀这有你错过的精彩内容🚀
Android Stduio实现外卖订餐系统
Android Studio实现考试管理系统
Android Studio实现选课系统
Android Studio实现购物商城
Android Studio实现记账本

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode222. 完全二叉树的节点个数(java)

完全二叉树的节点个数 leetcode222. 完全二叉树的节点个数题目描述 递归广度优先遍历二叉树专题 leetcode222. 完全二叉树的节点个数 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/count-complete-tree-nodes 题目描述…

Linux下的打包和压缩/解压解包

文章目录 一、打包和压缩二、Linux下进行打包和压缩1.zip指令&#xff0c;unzip指令2.tar指令 一、打包和压缩 打包呢就是把所有东西装在一起&#xff0c;然后压缩就是将这一包东西给它合理摆放&#xff0c;腾出更多的空间&#xff0c;以便放更多的东西。 压缩可以将如果东西是…

【github加载不出来】github 加载不出来、获取GitHub官方CDN地址、修改系统Hosts文件 刷新缓存

目录 github 加载不出来获取GitHub官方CDN地址修改系统Hosts文件刷新缓存 github 加载不出来 获取GitHub官方CDN地址 https://www.ipaddress.com/打开后如图&#xff0c;右上角搜索查 查找这三个DNS链接的解析地址 http://github.com http://assets-cdn.github.com http://git…

java springboot整合Druid数据源配置

整合的最后一块 我们整合一个数据源 Druid 我们还是打开idea 创建一个项目 路径和版本调一下 路径选一个好的目录就可以了 至于版本 最好是 java 8 JDK 1.8 然后 Next 下一步 这里 spring boot 的版本记得选一下 不要搞太高 2.几即可 Druid 在这里 显然也是找不到的 所以 我…

安卓端Google隐私沙盒归因报告聚焦

自2022年2月Google首次提出将推出隐私沙盒至今已一年有余。现在&#xff0c;安卓端的隐私沙盒Beta测试已针对特定Android13设备正式开始。作为早期测试者&#xff0c;Adjust很高兴与 Google一同迈出增强用户隐私的第一步&#xff0c;并在接下来的旅程中继续携手同行。为帮助移动…

framework编译应用代码

代码编译 APP或Service代码单编调试 1、在aosp文件目录下在将环境变量加载到内存中&#xff0c;在终端中输入下面命令 source build/envsetup.sh 2、选择平台编译选项 lunch 3、输入后会出现一个选择列表&#xff0c;然后输入你想要的项目的序号即可。如下所示我这里选择的7…

【OpenMMLab AI实战营二期笔记】第十天 底层视觉与MMEditing

1.图像超分辨率 1.1 什么是图像超分辨率&#xff1f; 根据从低分辨率图像重构高分辨率图像 1.2 目标&#xff1a; 提高图像的分辨率高分图像符合低分图像的内容恢复图像的细节、产生真实的内容 1.3 应用&#xff1a; 经典游戏高清重制动画高清重制照片修复节约传输高清图…

当你拥有什么样的高性能计算技术水平,你才能成为一名高性能计算工程师? ...

在当今科技快速发展的时代&#xff0c;高性能计算工程师成为了推动科学研究、工程仿真和大数据处理的关键人才。尤其是我国大力发展科研基建&#xff0c;打造科研技术底座&#xff0c;这就更加需要高性能计算工程师通过自身的技术来加速科研建设和研发的进度和速度。 我们调研了…

Spark大数据处理学习笔记(3.8.1) Spark RDD典型案例-利用RDD计算总分与平均分

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/Twpwe】 文章目录 1. 任务目标2. 实现思路3. 准备工作3.1 启动HDFS服务3.2 启动Spark服务3.3 在本地创建成绩文件3.4 将成绩文件上传到HDFS 4. 完成任务4.1 在Spark Shell里完成任务4.1.1 读取成绩…

虚拟机使用

文章目录 VMWare安装Warning 系统安装MacOS解锁工具Unlocker Warning VMWare配置系统启动安装VMware tools联网 VMWare安装 Warning 安装完VMWare后要在BIOS中开启intel VT&#xff08;虚拟化&#xff09;&#xff0c;否则安装过程中会出错&#xff0c;提示“Intel VT-x处于禁…

写在2023年,回看10年前,很幸运进了软件测试这行~

首先介绍一下我自己&#xff0c;从事软件测试行业到现在是10年时间&#xff0c;毕业之后一直从事的软件测试行业。很幸运在毕业时赶上互联网这波浪潮&#xff0c;然后就一直在互联网公司工作&#xff0c;虽然那时候的软件测试技术发展还相对比较混乱&#xff0c;但自己因为公司…

CAN 报文字节排列顺序(Intel、Motorola_LSB、Motorola_MSB)

学习自记&#xff1a; 在定义CAN通信矩阵或制作dbc时&#xff0c;我们需要知道报文的字节排列顺序。字节的排列顺序有2种&#xff0c;一种是Intel的排列顺序&#xff0c;另一种是Motorola的排列顺序&#xff0c;就跟大小端字节排序是一样的。下面笔者将简单介绍这2种字节排序的…

在conda环境中安装tensorflow和cuda

​ 不同版本的tensorflow官方提供的编译好的whl文件只对应一个cuda版本&#xff0c;这让需要tensorflow的不同版本时很麻烦。 我选择的方式是在conda中新建一个环境&#xff0c;在环境中安装需要的tensorflow和cudatoolkit。 这里假设已经安装好anaconda。 确定需要的tensorflo…

服了呀,现在的00后,真的是卷死了,辞职信已经写好准备提交了·····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;四月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪22K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

数智赋能与低代码:是医药行业的创新引擎还是心魔歧途

医药行业在当下科技水平的推动下实现了突破性的进展&#xff0c;提高了疾病的治疗效果、加速了新药的开发速度&#xff0c;并为病患提供了更便捷、个性化的医疗服务。当前科技水平下的医药行业正在经历快速的发展和创新。AI 在医药研发、诊断和治疗方面扮演着重要角色。机器学习…

软件测试中的可用性、可维护性、可靠性有什么区别?

我们生活在一个用户依赖于对服务的一致访问的可靠性时代。在相互竞争的服务之间进行选择时&#xff0c;对用户来说&#xff0c;没有比可靠性更重要的特性了。但是可靠性是什么意思呢&#xff1f; 为了回答这个问题&#xff0c;我们将根据可靠性工程中的其他度量来分解可靠性&a…

接口自动化测试的一种方案

前言 去年&#xff0c;我们进行了项目的拆分&#xff0c;拆分后的各个子系统也都逐步的改成了通过接口进行数据的交换&#xff0c;接口测试也被提上日程。经过一段时间的探索&#xff0c;接口自动化测试方案越来越完善&#xff0c;今天给大家做个详细的讲解。 方案 目前我们…

5分钟快速学会App自动化测试xpath定位【快点收藏吧】

今天我们先来和大家说一下appium&#xff0c;首先教大家如何定位xpath&#xff0c;五分钟即可学会&#xff1a; 例&#xff1a; 现在我想定位下面这个登录按钮&#xff1a;​ ​xpath该怎么写呢&#xff1f; 先不管三七二十几&#xff0c;先写//&#xff0c;然后找你要定位元…

中国信通院携手合合信息开启《文档图像篡改检测标准》制定工作

文档图像是信息的重要载体&#xff0c;却经常被不法分子利用软件、算法进行篡改。这些虚假材料往往被用于散播谣言、经济诈骗、编造虚假新闻&#xff0c;给个人、社会造成了恶劣的影响。AIGC全球爆火后&#xff0c;人们对“生成式造假”风险的攀升倍感忧虑&#xff0c;图像内容…

获得忠实铁粉?你也可以

获得忠实铁粉&#xff1f;你也可以 何为铁粉铁粉与普通粉丝区别铁粉规则如何获得铁粉 何为铁粉 在CSDN中&#xff0c;铁粉通常指对某个知名开发者、博主或组织非常支持、崇拜、追随的粉丝。他们可能会关注该开发者或博主的所有文章、博客、视频等&#xff0c;积极参与讨论并分…