笔者最近开始沦陷于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简单的答题游戏的更多相关文章

  1. Android 经典欧美小游戏 guess who

    本来是要做iOS开发的,因为一些世事无常和机缘巧合与测试工作还有安卓系统结下了不解之缘,前不久找到了guess who 源码,又加入了一些自己的元素最终完成了这个简单的小游戏. <?xml ve ...

  2. 怎样在Android开发中FPS游戏实现的两种方式比较

    怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...

  3. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  4. 无聊的人用JS实现了一个简单的打地鼠游戏

    直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...

  5. Android版的疯狂猜图游戏源码完整版分享

    这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧.   > ...

  6. Android简单逐帧动画Frame的实现(二)

    Android简单逐帧动画Frame的实现   Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...

  7. Scratch 简单的小游戏 --- 碰碰球

    Scratch 简单的小游戏 --- 碰碰球 ================================ 积木脚本块的简要分类: 1. 角色 2. 背景 3. 角色和背景组成的场景 4. 挡板角 ...

  8. HTML5小游戏-简单抽奖小游戏

    换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客.最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏.       ...

  9. 用Kotlin破解Android版微信小游戏-跳一跳

    前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...

随机推荐

  1. spring cloud报错解决:java.lang.ClassNotFoundException: com.netflix.servo.monitor.Monitors

    见鬼的事发生了. 在家里电脑上拿样例代码,运行时OK的.但一到公司电脑,用同样的代码,就会报下面的错误 ===================== Caused by: java.lang.Class ...

  2. ansible学习-playbook的YAML语法

    [一篇非常好的ansible参考博文] 初识Ansible http://liumissyou.blog.51cto.com/4828343/1616462 --------------------- ...

  3. python datetime处理时间(转)

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块,它提供 的接口与C标准库time.h基本一致.相比于time模块,datetime模块的接 ...

  4. Mac下配置PHP支持GD库FreeType

    一句话脚本 curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6 记得要FQ哦. 或者下面代码保存成.sh ,代码从http://php-os ...

  5. <四边形不等式优化>[NOI1995]石子合并

    留个坑 挺套路的 明天来写个总结 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = ...

  6. 【FFT】HDU4609-3 idiots

    ..退化为一天两题了,药丸.. [题目大意] 给出n根木棍的长度,求从其中取出3根能组成三角形的概率. [思路] 然后枚举求前缀和,枚举最长边.假设最长边为l,先求出所有两边之和大于它的情况数.然后减 ...

  7. Java并发(五):synchronized实现原理

    一.synchronized用法 Java中的同步块用synchronized标记. 同步块在Java中是同步在某个对象上(监视器对象). 所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操 ...

  8. (Mark)操作系统原理

    Q:什么是中断?A:中断嘛,举个容易理解的例子吧.   比如莲莲和唐唐在下象棋,眼看莲莲就快招架不住了,正当此紧要关头,唐唐的女友来了,非要唐唐陪她上街买衣服不可(唐唐晕倒:-) ),于是唐唐不得不同 ...

  9. KNN算法实现手写数字

    from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...

  10. 如何ping测有端口的网站

    参考:http://jingyan.baidu.com/article/c1a3101e878dcede656deb05.html 参考2:http://www.haoid.cn/post/261 现 ...