当前位置: 首页 > news >正文

使用Android studio开发一个数独游戏APP 系列第二讲

游戏主界面类名称:MainActivity.java,负责显示游戏主操作界面,提供调用其他类的接口。


其中issave变量用于控制是否显示继续游戏按钮,当第一次运行游戏时,不显示该按钮,所以设置一个boolean量issave用于控制主界面显示的Button,当暂停游戏或者退出游戏时,设置issave变量为true,当完成游戏后设置为false。
在onResume()中判断issave的值通过对数据库的访问判断issave的值,去设置是否显示继续游戏的按钮是否为可见。
其中定义一个广播接受者用来接收是否已完成数独。完成的话从当前表中删除。同时设置butt_backgame不可见。

 

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("cn.abel.action.over");
this.registerReceiver(new MyBroadcastReciver(), intentFilter);
		//创建一广播类并继承BroadcastReceiver
	 private class MyBroadcastReciver extends BroadcastReceiver {  @Override
		  public void onReceive(Context context, Intent intent) {
		   String action = intent.getAction();
		   if(action.equals("cn.abel.action.over")) {
		    String author = intent.getStringExtra("author");
		 	issave=false;//设置标记量为假
		    System.out.println("mianzhong jieshoh");
		    Button butt_backgame=(Button) findViewById(R.id.butt_backgame);
		    butt_backgame.setVisibility(View.INVISIBLE);
		    }
		  }
	}

(1)游戏难度选择

游戏关卡选择模块主要包括游戏难度等级选择。游戏难度等级选择如图4.5所示。

游戏难度选择通过实例化一个AlertDialog来实现,传入定义好的难度数组XML,监听选择的项,将索引值传递给游戏开始类GameActivity.java。

protected Dialog onCreateDialog(int id) {
		Dialog dialog = null;
		switch (id) {
		case LISTDIALOG:
			Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("难度选择");
			DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialogInterface, int which) {
					if (which == 4) {
						Intent intent = new Intent();
						intent.setClass(MainActivity.this, MyGameActivity.class);
						startActivity(intent);
					} else {
						String Str_nandu = getResources().getStringArray(R.array.hobby)[which];
						Intent intent = new Intent();
						intent.putExtra("nandu", String.valueOf(which));
						intent.setClass(MainActivity.this, GameActivity.class);
						startActivity(intent);
					}
				}
			};
			builder.setItems(R.array.hobby, listener);
			dialog = builder.create();
			break;
		}
		return dialog;
	}

点击继续游戏按钮,进入继续游戏模块。

(1)定义一个广播接收,接收是否完成游戏。从数据库获取当前游戏时间,并开启线程计时。

DataBaseHelper dbHelper = new DataBaseHelper(BackgameActivity.this, "save_table", null,1);
		
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		Cursor cursor = db.query("save_table", new String[] { "id","sshudu", "mshudu","time"},null,null, null, null, null);
		while (cursor.moveToNext()) {
			t = cursor.getString(cursor.getColumnIndex("time"));
		}
		int a[]=Timer.getTime(t);
		h=a[0];
		m=a[1];
		s=a[2];
handler.post(HandlerThread);
Runnable HandlerThread = new Runnable() {
        public void run() {
 
        	if (s < 60)
    		{
    			s += 1;
    		} else if (m < 60) {
    			m += 1;
    			s = 1;
    		} else {
    			h += 1;
    			m = 1;
    			s = 1;
    		}
            handler.postDelayed(HandlerThread, 1000);
        }
    };

(2)在onPause()中停止计时,以及判断是否完成游戏,完成则发送广播到MainActivity,否则保存数据到数据库。

protected void onPause() {

             // TODO Auto-generated method stub

             handler.removeCallbacks(HandlerThread);

             if(!is_over){

                    save();

             }else{

                 Intent overintent = new Intent();

                 overintent.setAction("cn.abel.action.over");

                       //要发送的内容

                 overintent.putExtra("author", "true");

                       //发送 一个无序广播

                 BackgameActivity.this.sendBroadcast(overintent);

             }

             super.onPause();

      }

保存游戏执行save()方法:得到一个可写的数据save_table用来存储当前进行的游戏进度及所用时间。插入时先把之前的数据删除并存入当前数据,关闭数据库。

public void save(){

             String save_shudu=BackView.tiles;

             String msave_shudu=BackView.newtiles;

             DataBaseHelper dbHelper = new DataBaseHelper(BackgameActivity.this, "save_table", null,1);

             // 得到一个可写的数据库

             SQLiteDatabase db = dbHelper.getWritableDatabase();

             String whereClauses = "id=?";

             String[] whereArgs = { String.valueOf(0) };

             // 调用delete方法,删除数据

             db.delete("save_table", whereClauses, whereArgs);

             System.out.println("删除ID为0");

             // 生成ContentValues对象 //key:列名,value:想插入的值

             ContentValues cv = new ContentValues();

             // 往ContentValues对象存放数据,键-值对模式

             cv.put("id", 0);

             cv.put("sshudu", save_shudu);

             cv.put("mshudu", msave_shudu);

             // 调用insert方法,将数据插入数据库

             db.insert("save_table", null, cv);

             // 关闭数据库

             db.close();

      }

相关文章:

  • MySQL中的时间类型
  • linux的基础指令
  • Docker容器中安装Mysql和Redis等全过程(以在阿里云服务器中的Docker安装Mysql和Redis为例)
  • java---SPFA算法---判断负权回路(每日一道算法2022.8.31)
  • 操作系统(Linux)
  • 基础 | 并发编程 - [LockSupport]
  • Uboot命令应用
  • kettle-实现不同数据库之间的数据交换
  • OPPO小布4.0:软件定义硬件,智能定义“助手”
  • python获取模块文件路径
  • java计算机毕业设计企业人事管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  • 机器学习算法1---KNN
  • Java--Spring事务
  • 卷妹带你回顾Java基础每日更新Day12
  • UM5006-RT-Thread ART-Pi 数据 flash 擦写手册
  • Apache的80端口被占用以及访问时报错403
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • javascript 总结(常用工具类的封装)
  • JavaScript函数式编程(一)
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • windows下mongoDB的环境配置
  • 百度地图API标注+时间轴组件
  • 订阅Forge Viewer所有的事件
  • 官方解决所有 npm 全局安装权限问题
  • 解析 Webpack中import、require、按需加载的执行过程
  • 看域名解析域名安全对SEO的影响
  • 前端面试总结(at, md)
  • 译自由幺半群
  • 栈实现走出迷宫(C++)
  • #《AI中文版》V3 第 1 章 概述
  • #14vue3生成表单并跳转到外部地址的方式
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (4)(4.6) Triducer
  • (C++)八皇后问题
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)负载均衡,回话保持,cookie
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • **PHP二维数组遍历时同时赋值
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 程序发生了一个不可捕获的异常
  • .net 简单实现MD5
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 事件模型教程(二)
  • .net6 webapi log4net完整配置使用流程
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @RestControllerAdvice异常统一处理类失效原因