android简单的答题游戏
笔者最近开始沦陷于android,从开始入门到现在已经快半个月的时间,于是便写一个较综合,用到了数据库,多线程操作,以及时钟的添加和停止消除,activity之间的动画转换等,适用于初学者学以致用的小游戏来巩固自己的知识,有需要的读者可以去我的资源库中下载源码。
以下是主游戏程序的部分代码,带有笔者的丰富注释:
package com.example.pingping_game1; import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask; import com.example.pingping_game1.Tools.JudgeAnswer;
import com.example.pingping_game1.Tools.MakeIntToString;
import com.example.pingping_game1.getsqldatabase.getquestion;
import com.example.pingping_game1.getsqldatabase.getsqldatabase; import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.widget.SimpleCursorAdapter.ViewBinder;
import android.text.style.BulletSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast; public class GameActivity1 extends Activity implements OnClickListener { public GameActivity1() {
// TODO Auto-generated constructor stub
} private TextView stateView, stateprogressView, questionView; // 各种状态信息
private Button aswA, aswB, aswC, aswD; // 4个答案选项按钮
private ProgressBar timeprogress; // 时间进度条
private int wr = 0; // 答错的题数
private int tr = 0; // 答对的题数
private int qnumber = 1; // 当前题目的题号
private int statenum = 1; // 当前关数
private final static int sum = 5; // 总共需要答对的题数
private final static int wrsum = 3; // 总共可答错的次数
private final static int LASTSTATE = 2; // 最终关数
private final static int CHANGE_QUESTION = 1; // 变换游戏界面题目的标识符
private final static int SETPROGRESS = 2; // 表示设置时间进度条的标识符
private final static int RESTARTGAME = 3; // 重新开始游戏的标识符
private static boolean OVERTIME = false; // 是否已经超时标识符
// 用mainMap来存储该题对应的信息
private Map<String, String> mainMap = new HashMap<String, String>();
private boolean flag = false; // 此题是否答对
private int progressBarValue = 0; // 表示时间进度条的进度
private final static int TOTALPROGRESS = 30; // 设置时间进度条的最大值
private Timer timer; // 设置一个定时器
private Random random = new Random(); // 设置一个随机数来随机抽取题目
private int[] QuestionNum = new int[8]; // 每一关题目的序列号 // 用线程和handler来处理消息
private Handler handler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case CHANGE_QUESTION:
mainMap = (Map<String, String>) msg.obj;
stateView.setText("第" + statenum + "关");
stateprogressView.setText(tr + "/" + sum + "\n" + wr + "/"
+ wrsum);
questionView.setText(qnumber + ":" + mainMap.get("questions"));
aswA.setText("A." + mainMap.get("a"));
aswB.setText("B." + mainMap.get("b"));
aswC.setText("C." + mainMap.get("c"));
aswD.setText("D." + mainMap.get("d"));
break;
case SETPROGRESS:
int progress = (Integer) msg.obj;
timeprogress.setProgress(progress);
break;
case RESTARTGAME:
timer.cancel();
OVERTIME = true; // 设置为超时
new ShowTimeOverDialog().showdialog();
break;
}
};
}; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.ggg);
stateView = (TextView) this.findViewById(R.id.statetext);
stateprogressView = (TextView) this.findViewById(R.id.stateprogress);
questionView = (TextView) this.findViewById(R.id.questiontext);
aswA = (Button) this.findViewById(R.id.aswA);
aswA.setAlpha((float) 0.5);
aswA.setOnClickListener(this);
aswB = (Button) this.findViewById(R.id.aswB);
aswB.setAlpha((float) 0.5);
aswB.setOnClickListener(this);
aswC = (Button) this.findViewById(R.id.aswC);
aswC.setAlpha((float) 0.5);
aswC.setOnClickListener(this);
aswD = (Button) this.findViewById(R.id.aswD);
aswD.setAlpha((float) 0.5);
aswD.setOnClickListener(this);
timeprogress = (ProgressBar) this.findViewById(R.id.progressBar1);
timeprogress.setMax(TOTALPROGRESS);
InitialQNum(); // 初始化题号序列数组
new Thread(new StartGame()).start();
timer = new Timer(true);
timer.schedule(new TimerTask() { @Override
public void run() {
// TODO Auto-generated method stub
if (progressBarValue == TOTALPROGRESS) {
// 超出游戏时间,弹出对话框提示玩家
handler.sendEmptyMessage(RESTARTGAME);
} else {
// 将信息传送给handler来更新进度条
Message message = Message.obtain();
message.obj = progressBarValue;
message.what = SETPROGRESS;
handler.sendMessage(message);
// 时间进度自增
progressBarValue++;
}
}
}, 0, 1000);
} // 初始化QuestionNum数组,随机抽取
private void InitialQNum() {
int count = 0;
while (count < 8) {
boolean flag1 = true; // 标志是否重复
int cur = Math.abs(random.nextInt() % 8) + 1;
for (int i = 0; i < count; i++) {
if (cur == QuestionNum[i]) {
flag1 = false;
break;
}
}
if (flag1) {
QuestionNum[count] = cur;
count++;
}
}
} public class StartGame implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
getquestion getq = new getquestion(GameActivity1.this);
Map<String, String> map = new HashMap<String, String>();
// 用MakeIntToString工具类来转换字符,并选择对应题目
String str = MakeIntToString.getString(QuestionNum[qnumber - 1]
+ (statenum - 1) * 8);
String str1 = String.valueOf(statenum);
String[] strs = new String[] { str, str1 };
map = getq.getquestionMap(strs);
// 用message来向主线程传递信息并处理
Message message = Message.obtain();
message.obj = map; // 将map信息放入message中
message.what = CHANGE_QUESTION; // 设定message的标示符
handler.sendMessage(message); // 向主线程中的handler发送信息
} } // 游戏进入下一关
private void GoToNextState() {
if (OVERTIME) {
return;
}
timer.cancel(); // 关闭时钟
statenum++; // 关数自增
qnumber = 1; // 题号重置为1
wr = 0; // 答错重置
tr = 0; // 答对重置
InitialQNum(); // 重新抽取随机数组为题目序列
progressBarValue = 0; // 将时间进度重置为0
Toast.makeText(GameActivity1.this, "恭喜你进入第" + statenum + "关!", 0)
.show();
new Thread(new StartGame()).start();
timer = null;
timer = new Timer();
timer.schedule(new TimerTask() { @Override
public void run() {
// TODO Auto-generated method stub
if (progressBarValue == TOTALPROGRESS) {
// 超出游戏时间,弹出对话框提示玩家
handler.sendEmptyMessage(RESTARTGAME);
} else {
// 将信息传送给handler来更新进度条
Message message = Message.obtain();
message.obj = progressBarValue;
message.what = SETPROGRESS;
handler.sendMessage(message);
// 时间进度自增
progressBarValue++;
}
}
}, 0, 1000);
} // 重新开始游戏
private class RestartGame {
public RestartGame() { } public void restart() {
statenum = 1;
qnumber = 1; // 重置题号为1
wr = 0;
tr = 0;
progressBarValue = 0;
InitialQNum();
timer = null;
timer = new Timer(true);
timer.schedule(new TimerTask() { @Override
public void run() {
// TODO Auto-generated method stub
if (progressBarValue == TOTALPROGRESS) {
// 超出游戏时间,弹出对话框提示玩家
handler.sendEmptyMessage(RESTARTGAME);
} else {
// 将信息传送给handler来更新进度条
Message message = Message.obtain();
message.obj = progressBarValue;
message.what = SETPROGRESS;
handler.sendMessage(message);
// 时间进度自增
progressBarValue++;
}
}
}, 0, 1000);
new Thread(new StartGame()).start();
}
} // 游戏超时弹出对话框
public class ShowTimeOverDialog {
public ShowTimeOverDialog() { } public void showdialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(
GameActivity1.this);
builder.setTitle("提示");
builder.setMessage("对不起,你的智商太低,没有在规定时间内完成答题!");
builder.setPositiveButton("重新开始",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
OVERTIME = false; // 设置为不超时
new RestartGame().restart();
}
});
builder.setNegativeButton("主界面",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
GameActivity1.this.finish();
}
});
builder.setCancelable(false);
Dialog dialog = builder.create();
dialog.show(); }
} // 游戏失败时弹出的对话框
public class ShowGameOverDialog { public ShowGameOverDialog() { } public void showdialog() {
timer.cancel();
AlertDialog.Builder builder = new AlertDialog.Builder(
GameActivity1.this);
builder.setTitle("提示");
builder.setMessage("对不起,愚蠢的人类,你闯关失败了!");
builder.setPositiveButton("重新闯关",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
new RestartGame().restart();
}
});
builder.setNegativeButton("主界面",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
GameActivity1.this.finish();
}
});
builder.setCancelable(false);
Dialog dialog = builder.create();
dialog.show();
}
} private void GoOverGame() {
if (OVERTIME) {
return;
}
timer.cancel();
AlertDialog.Builder builder = new AlertDialog.Builder(
GameActivity1.this);
builder.setTitle("提示");
builder.setMessage("恭喜您通关!!~您的智商真是高!");
builder.setPositiveButton("谦让谦让",
new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
GameActivity1.this.finish();
}
});
builder.setCancelable(false);
Dialog dialog = builder.create();
dialog.show();
} @Override
public void onBackPressed() { // 按返回键时触发事件
// TODO Auto-generated method stub
super.onBackPressed();
timer.cancel(); // 将时钟取消并置空
timer = null;
GameActivity1.this.finish();
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.aswA:
// 返回当前是否答对
flag = new JudgeAnswer(GameActivity1.this).judgeit("a", mainMap);
if (flag) { // 如果答对,对应参数进行改变
tr++;
qnumber++;
if (tr == sum) {
if (statenum == LASTSTATE) {
GoOverGame();
} else {
GoToNextState();
}
} else {
new Thread(new StartGame()).start();
}
} else {
wr++;
qnumber++;
if (wr == wrsum) { // 当错误题量达到上限,弹出游戏结束对话框
new ShowGameOverDialog().showdialog();
} else { // 否则更换题目
new Thread(new StartGame()).start();
}
}
break;
case R.id.aswB:
flag = new JudgeAnswer(GameActivity1.this).judgeit("b", mainMap);
if (flag) {
tr++;
qnumber++;
if (tr == sum) {
if (statenum == LASTSTATE) {
GoOverGame();
} else {
GoToNextState();
}
} else {
new Thread(new StartGame()).start();
}
} else {
wr++;
qnumber++;
if (wr == wrsum) {
new ShowGameOverDialog().showdialog();
} else {
new Thread(new StartGame()).start();
}
}
break;
case R.id.aswC:
flag = new JudgeAnswer(GameActivity1.this).judgeit("c", mainMap);
if (flag) {
tr++;
qnumber++;
if (tr == sum) {
if (statenum == LASTSTATE) {
GoOverGame();
} else {
GoToNextState();
}
} else {
new Thread(new StartGame()).start();
}
} else {
wr++;
qnumber++;
if (wr == wrsum) {
new ShowGameOverDialog().showdialog();
} else {
new Thread(new StartGame()).start();
}
}
break;
case R.id.aswD:
flag = new JudgeAnswer(GameActivity1.this).judgeit("d", mainMap);
if (flag) {
tr++;
qnumber++;
if (tr == sum) {
if (statenum == LASTSTATE) {
GoOverGame();
} else {
GoToNextState();
}
} else {
new Thread(new StartGame()).start();
}
} else {
wr++;
qnumber++;
if (wr == wrsum) {
new ShowGameOverDialog().showdialog();
} else {
new Thread(new StartGame()).start();
}
}
break;
}
}
}
android简单的答题游戏的更多相关文章
- Android 经典欧美小游戏 guess who
本来是要做iOS开发的,因为一些世事无常和机缘巧合与测试工作还有安卓系统结下了不解之缘,前不久找到了guess who 源码,又加入了一些自己的元素最终完成了这个简单的小游戏. <?xml ve ...
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 无聊的人用JS实现了一个简单的打地鼠游戏
直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...
- Android版的疯狂猜图游戏源码完整版分享
这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧. > ...
- Android简单逐帧动画Frame的实现(二)
Android简单逐帧动画Frame的实现 Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...
- Scratch 简单的小游戏 --- 碰碰球
Scratch 简单的小游戏 --- 碰碰球 ================================ 积木脚本块的简要分类: 1. 角色 2. 背景 3. 角色和背景组成的场景 4. 挡板角 ...
- HTML5小游戏-简单抽奖小游戏
换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客.最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏. ...
- 用Kotlin破解Android版微信小游戏-跳一跳
前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...
随机推荐
- AC日记——大爷的字符串题 洛谷 P3709
大爷的字符串题 思路: 莫队,需开O2,不开50: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20000 ...
- iwebshop 自动给css js链接加版本信息
lib/core/tag_class.php case 'theme:': $path = $matches[4]; $exts = strtolower(substr($matches[4], st ...
- 基于kbengine 0.4.20 解读
[以下文章转自kbe论坛] MMOG服务端是一种高品质的工程项目,品读开源的kbe是一种乐趣.本文档我带童鞋们一起领略一下.囿于我知识面和经验方面所限,文中所述之处难免有错误存在,还请读童鞋们睁大慧眼 ...
- php定位并且获取天气信息
/** *获取天气预报信息 **/ header("Content-type: text/html; charset=utf-8"); class getWeather{ priv ...
- Linux基础系列-Day6
Samba服务(基于CentOS 7.0) Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之 ...
- Windows下安装Memcached服务及安装PHP的Memcached扩展
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串.对象).这些数据可以是数据库调用.API ...
- BZOJ 1982 [Spoj 2021]Moving Pebbles(博弈论)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1982 [题目大意] 两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头, 然后移动任意 ...
- 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
题意:给你一张图,给你每个点的权值,要么是-1,要么是1,要么是0.如果是-1就不用管,否则就要删除图中的某些边,使得该点的度数 mod 2等于该点的权值.让你输出一个留边的方案. 首先如果图内有-1 ...
- 20162312 2016-2017-2《Java程序设计》课程总结
一.每周作业链接汇总 预备作业01 写的是有关老师和学生的关系: 预备作业02 如何做中学: 预备作业03 实验楼学习linux环境: 第一周作业 java入门,虚拟机等课前准备: 第二周作业 掌握J ...
- POJ 3437 Tree Grafting
题意:给出一个深度优先遍历树的up down顺序,求这棵树以及这棵树变为”左子右兄”树的高度 思路:直接dfs,x代表树1的高度,y代表树2的高度 #include<cstdio> #in ...