笔者最近开始沦陷于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. T-SQL备忘(6):常用内置函数

    日期和时间函数: 1.获取当前时间:GETDATE() select GETDATE() 返回: 2015-04-27 20:52:06.700 2.返回时间的部分(日.月.年) a.获取日: sel ...

  2. 【初探移动前端开发】jQuery Mobile 二

    本文例子请使用手机查看 List列表 在移动设备平台下,由于移动设备屏幕比较小,我们又是用手在上面点击的触屏方式,传统的列表模式在手机上就不太友好了. 虽然HTML5与CSS3提供了强大的界面实现方案 ...

  3. Aras Innovator 11 sp2 IE客户端设置

    在上一篇文章<Aras Innovator 11 sp2 安装>后,服务器算是安装好了,还需要在使用的客户端进行设置才可以正常使用Aras Innovator 该篇为IE设置,还有< ...

  4. python中文转换url编码

    今天要处理百度贴吧的东西.想要做一个关键词的list,每次需要时,直接添加 到list里面就可以了.但是添加到list里面是中文的情况(比如‘丽江’),url的地址编码却是’%E4%B8%BD%E6% ...

  5. [onethink ucenter] 跨域名单点登录关键点

    1.uc_client/data/cache/apps.php <?php $_CACHE['apps'] = array ( 1 => array ( 'appid' => '1' ...

  6. 如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】

    [已知先序.中序求后序排列]--字符串类型 #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和 ...

  7. 洛谷P1392 取数 [堆]

    题目传送门 取数 题目描述 在一个n行m列的数阵中,你须在每一行取一个数(共n个数),并将它们相加得到一个和.对于给定的数阵,请你输出和前k小的取数方法. 输入输出格式 输入格式: 第一行,三个数n, ...

  8. HZAU 1207 Candies(线段树区间查询 区间修改)

    [题目链接]http://acm.hzau.edu.cn/problem.php?id=1207 [题意]给你一个字符串,然后两种操作:1,将区间L,R更新为A或者B,2,询问区间L,R最长的连续的B ...

  9. Python开发基础-Day12模块1

    time模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: (1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月 ...

  10. Linux基础系列-Day8

    Shell编程基础 Shell介绍 Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于windows下的的cmd.exe.它接收用户命令,然后调用相应的应用程序 ...