Android Studio实现一笔画完小游戏
文章目录
- 一、项目概述
- 二、开发环境
- 三、详细设计
- 3.1、数据库设计
- 3.2、普通模式
- 3.3、随机模式
- 3.4、关卡列表
- 四、运行演示
- 五、项目总结
- 六、源码获取
一、项目概述
Android一笔画完是一种益智游戏,玩家需要从起点开始通过一条连续的线,将图形中所有的方块都连接起来,而且不能重复经过已连接的线段。游戏主页有普通模式、随机模式和设置入口,普通模式包含8个大关卡,除了第1大关卡有10小关之外,其他的大关卡都有30小关,难度递增,地图丰富。
开始游戏后,可以使用左下角的显示功能,显示正确的路径,也可以使用右下角的刷新功能清除已经走不通的路径,还能直接跳过本关进入下一关。对于普通模式,已经通关的小关卡颜色会加深,与未通过的关卡区别开来。随机模式采用深度优先遍历算法和全组合算法生成地图,如果在设置中打开后台寻路,会持续生成新的地图备用。随机模式还能自定义地图的行数、列数以及障碍数,可以设置跳过已通过的,查看通关记录。在设置中打开背景音乐会给游戏增添更多趣味性。
二、开发环境

三、详细设计
3.1、数据库设计
MySql类是一个继承自SQLiteOpenHelper的自定义类,主要用于管理游戏中的数据存储和查询操作。通过继承SQLiteOpenHelper类,可以方便地进行数据库的创建、更新和查询等操作。在具体的游戏开发中,可以根据需要使用这些方法来实现对游戏数据的存储和读取。
public void insertPassedYibi(Bean_Road road){if(checkPassedYibi(road) || road==null) return;ContentValues values=new ContentValues();values.put("rows",road.getRows());values.put("columns",road.getColumns());values.put("difficulties",road.getDifficulties());values.put("road",road.getRoadString());getReadableDatabase().insert("passedYibi",null,values);}
定义的构造方法用于初始化数据库的名称和版本号,并调用父类的构造方法。onCreate()方法在数据库第一次创建时调用,用于创建数据库表格。代码中创建了三个表格,分别是passedYibi、savedYibi和errorYibi。onUpgrade()方法:在数据库版本号发生变化时调用,用于更新数据库结构。代码中先删除原有的表格,然后重新调用onCreate()方法创建新的表格。

checkErrorYibi()方法:检查errorYibi表格中是否存在符合条件的数据记录。根据传入的参数进行查询,并返回查询结果是否存在的布尔值。insertErrorYibi()方法:向errorYibi表格中插入新的数据记录。在插入之前会先调用checkErrorYibi()方法进行重复性检查。checkPassedYibiWithRoad()方法:根据roadstring参数检查passedYibi表格中是否存在符合条件的数据记录。checkPassedYibi()方法:根据传入的Bean_Road对象检查passedYibi表格中是否存在符合条件的数据记录。insertPassedYibi()方法:向passedYibi表格中插入新的数据记录。在插入之前会先调用checkPassedYibi()方法进行重复性检查。getAllPassedYibi()方法:获取passedYibi表格中的所有数据记录,并返回Cursor对象。cleanPassedYibi()方法:清空passedYibi表格中的所有数据记录。checkSavedYibi()方法:根据传入的Bean_Road对象检查savedYibi表格中是否存在符合条件的数据记录。
3.2、普通模式
RoadFragment类是一个Fragment碎片类,用于显示游戏中普通模式的地图,主要实现了道路界面的初始化、按钮点击事件的处理、关卡和地图位置的管理,以及通过关卡和帮助功能的实现。它使用了Grid_Yibi类来显示道路的网格,并通过接口Grid_Yibi.yibiListener来处理与网格相关的操作。
@Overridepublic void passed(Bean_Road road) {if(road==null) return;if(!firstPassed){firstPassed=true;getMySql().insertPassedYibi(road);ViewUtil.getAskDialog( "","恭喜通过",new OtherUtil.OnCallBackListenerImpl<Boolean>(){@Overridepublic void OnCallBackFirst(Boolean... params) {goNext();}},"下一关", "算了");}}
在initView()方法中,初始化界面元素,并设置按钮的点击事件。设置返回按钮点击事件时调用onBackClick()方法,设置刷新按钮点击事件时调用grid_yibi.refreshGrid()方法,设置帮助按钮点击事件时根据ishelping标志调用grid_yibi.getHelp()方法或者grid_yibi.refreshGrid()方法,设置主页按钮点击事件时跳转到MainActivity中的IndexFragment页面。

在goNext()方法中,检查当前关卡和地图的位置是否有效,如果有效则进入下一关卡或下一个地图的界面。如果已经是最后一关,则显示提示信息。在checkPosition()方法中,检查当前关卡和地图的位置是否有效。如果有效,则返回true,否则显示获取地图失败的提示信息,并返回false。在getCurRoad()方法中,根据当前关卡和地图的位置获取对应的Bean_Road对象。如果位置有效,则返回该对象,否则返回null。在passed()方法中,当通过一个关卡时,会调用该方法。首次通过时,将通过的道路记录插入数据库,并显示恭喜通过的对话框。点击对话框中的下一关按钮时,调用goNext()方法进入下一关。在setIsHelping()方法中,根据传入的isHelping参数设置ishelping标志,并根据该标志设置帮助按钮的背景图片。在isHelping()方法中,返回ishelping标志的值。
3.3、随机模式
RandomRoadFragment类实现了随机模式游戏界面的初始化、状态检查和网格道路的生成。主要包含以下功能:initView() 方法用于初始化视图。首先从偏好设置中获取行数、列数、难度等参数,并进行相应的初始化操作。然后设置按钮的点击监听器,并对一些视图元素进行状态设置和事件处理。最后,根据条件进行一些异步操作,包括更新文本视图的内容和执行定时任务。最终返回 true。 checkPassedView() 方法用于检查已通过的视图。根据给定的道路对象,判断该道路是否已通过,并相应地设置相关视图的可见性。onDetach() 方法在 Fragment 解除绑定时调用,用于清除动画和道路队列。onDestroyView() 方法在销毁视图时调用,用于移除定时任务。 initGirdRoad() 方法用于初始化游戏中的网格道路。首先重置一些状态变量,然后根据条件选择从数据库中获取道路数据或从队列中获取道路数据,或者直接生成新的道路数据。接着对道路进行验证和处理,并根据结果更新相关视图的显示,最后保存道路数据和相关信息。

3.4、关卡列表
DifficultyDetailFragment类是一个BaseFragment的子类。有三个成员变量,分别是difficultyHint(用于显示关卡提示信息的TextView)、returnButton(返回按钮的View)和recyclerView(用于显示关卡详细信息的RecyclerView。实现了一个关卡详细信息的界面,其中包括关卡提示信息、返回按钮和用于显示关卡详细信息的列表视图。在视图初始化时,根据传递的参数设置相关视图的内容和适配器。同时,提供了处理新参数和返回结果的方法。
@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if(data!=null&&data.getExtras()!=null) getNonNullArguments().putAll(data.getExtras());runOnUiThread(this::initView);}
getLayoutId()方法:重写了BaseFragment中的方法,用于返回布局文件的ID。initView()方法:重写了BaseFragment中的方法,用于初始化视图。首先获取当前关卡的位置position,然后设置返回按钮的点击监听器。接下来设置recyclerView的布局管理器为GridLayoutManager,并指定列数为5。然后根据position的值设置适配器,如果position在合法范围内,则使用Adapter_difficulty_detail作为适配器,否则显示提示信息。最后设置关卡提示信息的可见性为可见,并设置对应的文本内容。最终返回true表示视图初始化成功。onNewArguments()方法:重写了BaseFragment中的方法,当有新的参数传递给Fragment时调用。在该方法中调用initView()方法初始化视图,并将isLoaded标志设置为true。onActivityResult()方法:重写了BaseFragment中的方法,当Fragment的目标Activity返回结果时调用。在该方法中判断返回的Intent和Bundle是否为空,如果不为空,则将其中的参数添加到Fragment的参数中。然后在主线程上调用initView()方法重新初始化视图。

四、运行演示
Android Studio实现一笔画完小游戏
五、项目总结
享受开发过程并保持耐心和持续学习,开发一款成功的游戏需要时间和努力,但最终的成果将会令人满意。
六、源码获取
点此直接下载源码:👉Android Studio实现一笔画完小游戏
| 🚀这有你错过的精彩内容🚀 |
|---|
| Android Studio实现五子棋小游戏 |
| Android Studio实现知乎日报App |
| Android Studio实现贪吃蛇小游戏 |
| Android Studio实现文艺阅读App |
| Android Studio实现多功能日记本 |
相关文章:
Android Studio实现一笔画完小游戏
文章目录 一、项目概述二、开发环境三、详细设计3.1、数据库设计3.2、普通模式3.3、随机模式3.4、关卡列表 四、运行演示五、项目总结六、源码获取 一、项目概述 Android一笔画完是一种益智游戏,玩家需要从起点开始通过一条连续的线,将图形中所有的方块…...
【Python 程序设计】数据人员入门【02/8】
一、说明 介绍如何管理 Python 依赖项和一些虚拟环境最佳实践。 以下文章是有关 Python 数据工程系列文章的一部分,旨在帮助数据工程师、数据科学家、数据分析师、机器学习工程师或其他刚接触 Python 的人掌握基础知识。迄今为止,本初学者指南包括&#…...
学习笔记——树上哈希
普通子树哈希 树上的很多东西都是转化成链上问题的,比如树上哈希 树上哈希,主要是用于树的同构这个东西上的 什么是树的同构? 如图,不考虑节点编号,三棵树是同构的 将树转化成链,一般有两种方式…...
Opencv快速入门教程,Python计算机视觉基础
快速入门 OpenCV 是 Intel 开源计算机视觉库。它由一系列 C 函数和少量 C 类构成, 实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 拥有包括 300 多个 C 函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也 可以使用某些外部库。 OpenCV 对非…...
laravel 报错误信息 Carbon\Exceptions\InvalidFormatException
Carbon\Exceptions\InvalidFormatException Unexpected data found. at vendor\nesbot\carbon\src\Carbon\Traits\Creator.php:687 683▕ return $instance; 684▕ } 685▕ 686▕ if (static::isStrictModeEnabled()) { ➜ 687…...
UI自动化之混合框架
什么是混合框架,混合框架就是将数据驱动与关键字驱动结合在一起,主要用来回归业务主流程,将核心流程串联起来。 上一篇我们写到了关键字驱动框架,关键字驱动框架是针对一个业务场景的单条测试用例的。 我们以163邮箱的登录到创建…...
SQL创建用户-非DM8.2环境(达梦数据库)
DM8:达梦数据库SQL创建用户-非DM8.2环境 环境介绍 环境介绍 在没有图形化界面,或者想快速创建用户,可以使用一下SQL语句;将其中的 CESHI 替换为要创建的用户名即可,默认创建了数据表空间,索引表空间,文件大…...
Thread类中run和start的区别
答:调用线程类中的 start 方法,才开始创建并启动线程,而线程被回收,则是要执行完线程的入口方法(对于主线程来说,则是要执行完 main 方法),这里要回收线程则是要将(&…...
ElementUI浅尝辄止35:Checkbox 多选框
一组备选项中进行多选 1.如何使用? 单独使用可以表示两种状态之间的切换,写在标签中的内容为 checkbox 按钮后的介绍。 //在el-checkbox元素中定义v-model绑定变量,单一的checkbox中,默认绑定变量的值会是Boolean,选…...
讲讲如何用IDEA开发java项目——本文来自AI创作助手
使用IDEA开发Java项目,您可以按照以下步骤进行操作: 下载并安装IntelliJ IDEA 您可以从JetBrains官网下载并安装最新版的IntelliJ IDEA。 创建项目 启动IDEA,在欢迎界面中选择“Create New Project”或者在主菜单中选择“File”->“Ne…...
Kafka3.0.0版本——消费者(Range分区分配策略以及再平衡)
目录 一、Range分区分配策略原理1.1、Range分区分配策略原理的示例一1.2、Range分区分配策略原理的示例二1.3、Range分区分配策略原理的示例注意事项 二、Range 分区分配策略代码案例2.1、创建带有4个分区的fiveTopic主题2.2、创建三个消费者 组成 消费者组2.3、创建生产者2.4、…...
WeiTools
目录 1.1 WeiTools 1.2 getTime 1.3 getImageView 1.4 StringEncode 1.4.1 // TODO Auto-generated catch block WeiTools package com.shrimp.xiaoweirobot.tools;...
目标检测数据集:医学图像检测数据集(自己标注)
1.专栏介绍 ✨✨✨✨✨✨目标检测数据集✨✨✨✨✨✨ 本专栏提供各种场景的数据集,主要聚焦:工业缺陷检测数据集、小目标数据集、遥感数据集、红外小目标数据集,该专栏的数据集会在多个专栏进行验证,在多个数据集进行验证mAP涨点明显,尤其是小目标、遮挡物精度提升明显的…...
【系统设计系列】数据库
系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemarti…...
mp4压缩视频不改变画质?跟我这样压缩视频大小
在当今数字化时代,视频文件变得越来越普遍,然而,这些文件通常都很大,给存储和传输带来了困难,为了解决这个问题,许多人都希望将视频压缩得更小,而又不牺牲画质,下面就来看看具体应该…...
AQS同步队列和等待队列的同步机制
理解AQS必须要理解同步队列和等待队列之间的同步机制,简单来说流程是: 获取锁失败的线程进入同步队列,成功的占用锁,占锁线程调用await方法进入条件等待队列,其他占锁线程调用signal方法,条件等待队列线程进…...
vue3实现无限循环滚动的方法;el-table内容无限循环滚动的实现
需求:vue3实现一个div内的内容无限循环滚动 方法一: <template><div idcontainer><div class"item" v-foritem in 5>测试内容{{{ item }}</div></div> </template><script setup> //封装一个方法…...
Windows 安装 MariaDB 数据库
之前一直使用 MySQL,使用 MySQL8.0 时候,占用内存比较大,储存空间好像也稍微有点大,看到 MariaDB 是用来代替 MySQL 的方案,之前用着也挺得劲,MySQL8.0 以上好像不能去导入低版本的 sql,或者需要…...
RK3568-mpp(Media Process Platform)媒体处理软件平台
第一章 MPP 介绍 1.1 概述 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的通用媒体处理软件平台。 该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不同芯片的差异,为使用者提供统一的视频媒体处理接口(Medi…...
【ModelSim】使用终端命令行来编译、运行Verilog程序,创建脚本教程
▚ 01 ModelSim命令解说 📢 这些命令是 ModelSim 中常用的命令,用于创建库、编译源代码和启动仿真。 🔔 在使用这些命令之前,你需要在 ModelSim 的命令行界面或脚本中执行 vlib 命令来创建一个库,然后使用 vlog 命令…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
