谁是卧底程序设计.docx
- 文档编号:14927870
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:16
- 大小:137.29KB
谁是卧底程序设计.docx
《谁是卧底程序设计.docx》由会员分享,可在线阅读,更多相关《谁是卧底程序设计.docx(16页珍藏版)》请在冰点文库上搜索。
谁是卧底程序设计
1、程序设计
1.1用户界面设计
根据需求分析可以知道,应用程序应包含两个主要的用户界面,这里需要进一步分析每个用户界面中应该包括哪些显示内容。
打开游戏的第一个页面,应该让游戏的管理员确定游戏的卧底人数和平民人数,然后选定本次游戏的玩家身份词,并添加玩家个人信息。
另一个重要页面就是游戏进行的页面。
在该页面中,需进行两项内容操作,其一是让玩家一次查看个人的身份词,并随机分配卧底,玩家自己并不知道自己是卧底还是平民;然后就是开始游戏,逐次淘汰玩家,进行平民和卧底之间的较量。
根据对用户界面显示内容的分析,使用EdrawMax绘制出用户界面的草图,如下图所示。
图1关键界面
1.2程序模块设计
图2程序结构设计图
2、
程序开发
2.1文件结构与用途
在程序开发时,将程序所用到的Java类分别放在4个包里面,以便于开发过程中对所需要的类库快速进行查找和修改,四个包依次为activity包、db包、game包和uti包,activity包用于存放Android应用程序所需要的界面控制类,是不同的界面显示各自所需要的内容;db包用于存放数据库管理类,对数据库不同的表格进行增删查找;game包用于存放游戏所需要的一些实体类,如玩家实体等,util包主要存放一些工具类,如游戏背景音乐控制类库。
图3程序工程Java包
Android开发虽然是基于Java语言进行开发的,但是在开发过程中还用到了一些其他类型的可扩展标记语言,用的最多的是xml语言,Android工程中用到的一些样式、布局、动画等都是在xml中进行设置的,这里主要介绍一下工程
里用到的xml存放位置,这部分文件放在res包的子包内。
布局文件主要才能放在layout包内,图片放在drawable包内,文本放在raw包内,颜色、文字、样式则放在values包内。
图4布局控制文件包
由于工程中用到的Java类和资源文件较多,这里就不一一详细进行解释了,主要列出一些关键类和资源文件,仅供参考。
表1关键Java类
包名称
文件名
说明
---activity
WellcomActivity
欢迎界面,打开该应用的第一个界面
MainActivity
添加玩家身份词和玩家数量的界面
CancelPlayerActivity
玩家进行游戏的界面,主要进行查看玩家身份词和淘汰玩家的界面
ChengfaActivity
在一轮游戏结束时,进行真心话大冒险惩罚
SettingDataActivity
选择需要设置内容的界面
PredataListActivity
查看之前进行过的游戏,可以直接使用这些数据进行新的游戏
PlayerListAdapter
玩家列表适配器
DataCFManageActivity
对惩罚问题进行管理的界面
DataKWManageActivity
对玩家身份词进行管理的界面
---db
keywordSqlite
玩家身份词数据库操作类
ChengfaSqlite
惩罚问题数据库操作类
PreDataSqlite
往期游戏记录数据库操作类
---game
Player
玩家实体类
---util
LotteryView
转盘旋转操作类
注:
由于包名全称较长,这里用---表示“com.qqjz.findingundercovers.”
图4布局控制文件包
资源目录
文件名
说明
layout
wellcom.xml
欢迎界面布局文件
main.xml
添加玩家界面布局文件
cancelplayer.xml
淘汰玩家界面布局文件
setting_data.xml
设置界面布局文件
chengfa.xml
真心话大冒险界面布局文件
raw
skycity.mp3
背景音乐文件
values
colore.xml
颜色样式管理文件
strings.xml
字符串管理文件
styles.xml
界面风格设置文件
sswd
AndroidManifest.xml
系统配置文件
2.2数据库管理
改程序数据采用了外部数据库和内部数据库两种形式,外部数据库为raw包内的sswd.db文件,主要包含keyword表和chengfa表,分别为身份词和惩罚问题表,该表采用外部数据主要原因是在首次启动改程序时,可以直接从该数据库查找预先设置好的玩家身份词和惩罚问题。
该类数据库在首次调用时需要将工程中的数据库复制到手机内存卡中,之后对该数据库操作就直接在内存卡中进行。
这种数据库获取管理对象的关键程序如下:
privateSQLiteDatabaseopenDatabase1(){
StringDATABASE_PATH=android.os.Environment
.getExternalStorageDirectory().getAbsolutePath()+"/sswd/";
System.out.println("path="+DATABASE_PATH);
StringDATABASE_FILENAME="sswd.db";
try{
StringdatabaseFilename=DATABASE_PATH+"/"+DATABASE_FILENAME;
Filedir=newFile(DATABASE_PATH);
if(!
dir.exists())
dir.mkdirs();
if(!
(newFile(databaseFilename)).exists()){
InputStreamis=context.getResources().openRawResource(
R.raw.sswd);
FileOutputStreamfos=newFileOutputStream(databaseFilename);
byte[]buffer=newbyte[8192];
intcount=0;
while((count=is.read(buffer))>0){
fos.write(buffer,0,count);
}
fos.close();
is.close();
}
SQLiteDatabasedatabase=SQLiteDatabase.openOrCreateDatabase(
databaseFilename,null);
Log.e("打开数据库","打开成功");
returndatabase;
}catch(Exceptione){
e.printStackTrace();
}
returnnull;
}
内部数据库存放的主要是往期游戏记录信息,表名为predata,该类数据库需要先创建数据表格,然后通过SQLiteOpenHelper获取数据库操作对象,然后对数据库进行管理。
创建表格的方法为:
@Override
publicvoidonCreate(SQLiteDatabasedb){
Stringsql1="CREATETABLEpredata("//
+"idINTEGERPRIMARYKEY,"
+"dateVARCHAR(50)NOTNULL,"
+"allnumINTEGERNOTNULL,"
+"wdnumINTEGERNOTNULL,"
+"pmVARCHAR(50)NOTNULL,"
+"wdVARCHAR(50)NOTNULL);";
db.execSQL(sql1);
}
获取数据库管理对象的方法为:
publicPreDataSqlite(Contextcontext){
this.context=context;
dbHelper=newPreDataSQLiteHelper(context,tabName);
}
/**
*开启数据库
*/
publicvoidopenDatabase(){
myDatabase=dbHelper.getWritableDatabase();
Log.e(tag,"开启数据库");
}
/**
*关闭数据库
*/
publicvoidcloseDatabase(){
Log.e(tag,"关闭数据库");
dbHelper.close();
}
对数据库进行操作的方法:
/**
*插入数据
*@parammap
*/
publicvoidinsertDatabase(Mapmap){
ContentValuesvalues=newContentValues();
values.put("wdnum",map.get("wdnum").toString());
values.put("allnum",map.get("allnum").toString());
values.put("pm",map.get("pm").toString());
values.put("date",map.get("date").toString());
values.put("wd",map.get("wd").toString());
myDatabase.insert(tabName,null,values);
}
/**
*删除数据
*@paramid
*/
publicvoiddelDatabase(Stringid){
myDatabase.delete(tabName,"id=?
",newString[]{id});
}
2.3.程序主要功能实现
改程序的实现关键点有创建玩家对象列表,更新玩家信息,随机分配卧底和平民等,为了实现给类问题,首先需要创建玩家实体类,既player类,包含了玩家姓名,编号,是否淘汰,玩家身份,玩家身份词,淘汰原因,玩家是否查看过身份词等信息。
然后将该类放到list集合中,当游戏的管理员每次添加一个玩家信息后,通过activity回调方法更新玩家信息,主要方法如下:
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
super.onActivityResult(requestCode,resultCode,data);
System.out.println("回调参数requestCode"+requestCode+"resultCode");
if(resultCode==11){//添加玩家
System.out.println("list.size="+list.size());
Playerplayer=newPlayer();//创建一个新的玩家对象
player.setName(data.getStringExtra("name"));//添加玩家姓名
player.setIndex(list.size()+1);//设置玩家在列表中的位置
player.setLiveState(true);//设置玩家的生命状态,及是否被淘汰
player.setSeeState(false);//设置玩家是否查看过自己的身份词
player.setWord("");//玩家的身份词暂时设置为空
list.add(player);//讲玩家添加到列表中
getData();
}elseif(resultCode==12){//设置卧底人数
wdCount=data.getIntExtra("wdcount",1);
wdTv.setText("卧底"+wdCount+"人");
}elseif(resultCode==13){//设置玩家身份词
word1=data.getStringExtra("word1");
word2=data.getStringExtra("word2");
Toast.makeText(MainActivity.this,"你选择的身份词为"+word1+"和"+word2,
Toast.LENGTH_SHORT).show();
}
}
在推出该界面,启动玩家淘汰界面时,需要对对本次游戏信息进行保存,并玩家信息传递到下一个界面中,关键方法如下:
@Override
publicvoidonClick(Viewv){
if(wdCount>=(list.size()/2.0)){
Toast.makeText(MainActivity.this,"卧底人数不可以大于玩家人数的一半",
Toast.LENGTH_SHORT).show();
return;
}
GameApplicationgameApp=((GameApplication)MainActivity.this
.getApplication());
gameApp.setPlayerList(list);
Intentintent=newIntent(MainActivity.this,
CancelPlayerActivity.class);
if(word1.length()==0||word2.length()==0){//随机获取身份词
keywordSqliteksq=newkeywordSqlite(MainActivity.this);
ksq.openDatabase();
List
ksq.closeDatabase();
intsize=wordsList.size();
Randomr=newRandom();
inti=r.nextInt(size);
word1=wordsList.get(i).get("pm");
word2=wordsList.get(i).get("wd");
System.out.println(word1+"---"+word2);
}
Map
map.put("allnum",list.size()+"");
map.put("wdnum",wdCount+"");
map.put("date",getCurrentDate());
map.put("pm",word1);
map.put("wd",word2);
PreDataSqlitepdb=newPreDataSqlite(MainActivity.this);
pdb.openDatabase();
pdb.insertDatabase(map);
pdb.closeDatabase();
intent.putExtra("word1",word1);
intent.putExtra("word2",word2);
intent.putExtra("wdcount",wdCount);
startActivity(intent);
}
});
在玩家开始游戏之前,需要对玩家身份词进行随机分类,改程序采用的方法是现获取一个随机数,判断是否是2的倍数,如果是则将获取到的身份词1设置为平民身份词,身份词2设置为卧底身份词,如果不是2的倍数则取相反值。
然后根据获取的卧底人数,将卧底随机穿插在list列表中,关键程序如下:
publicvoidinitPlayerdata(){
intr1=newRandom().nextInt(1000);
Log.e("res",r1+"r1/2="+r1/2);
if(r1%2==0){//通过随机数是否是偶数,分配卧底和平民身份词
System.out.println("r1/2="+r1/2);
pmword=word1;
wdWord=word2;
}else{
pmword=word2;
wdWord=word1;
}
inttemp=0;
intsize=list.size();
while(temp System.out.println("temp="+temp+"wdcount="+wdCount); intr2=newRandom().nextInt(size);//随机数是从0开始的 if(list.get(r2).getWord().length()==0){ temp++; list.get(r2).setWord(wdWord); list.get(r2).setIdentify("卧底"); } } for(inti=0;i if(list.get(i).getWord().length()==0){ list.get(i).setWord(pmword); list.get(i).setIdentify("平民"); } } wdLiveCount=wdCount; pmLiveCount=size-wdCount; } 然后比较重要的就是确定在什么时候淘汰玩家,因为每个玩家都有生命状态的属性,并且有身份属性,在淘汰玩家的时候,当点击卧底身份用户的头像,则显示卧底标志,如果点击了平民身份玩家头像,则显示“冤死”标志,当当游戏剩余一个玩家和一个卧底时,卧底获胜,否则只有一方消灭另一方游戏才结束,关键程序如下: publicvoidonItemClick(AdapterView >arg0,Viewview,intarg2, longarg3){ System.out.println("cancleListenr"); switch(gameState){ case0: //查看身份词 if(! list.get(arg2).isSeeState()){ dataIndex=arg2; Intentintent=newIntent(CancelPlayerActivity.this, SeeWordDialog.class); intent.putExtra("word",list.get(arg2).getWord()); startActivityForResult(intent,1); list.get(arg2).setSeeState(true); }else Toast.makeText(CancelPlayerActivity.this,"你已经查看过了! ", Toast.LENGTH_SHORT).show(); break; case1: //淘汰玩家 System.out.println("showstamp"); ImageViewstamp=(ImageView)view .findViewById(R.id.player_list_item_stamp); if(list.get(arg2).getIdentify().endsWith("平民")){ stamp.setImageResource(R.drawable.stamp_yuan); pmLiveCount--; checkGameOver(); }else{ stamp.setImageResource(R.drawable.stamp_spy); wdLiveCount--; checkGameOver(); } stamp.setVisibility(View.VISIBLE); break; case2: Toast.makeText(CancelPlayerActivity.this, "本次游戏已经结束,请选择重新开始! ",Toast.LENGTH_SHORT).show(); break; default: break; } } });
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 谁是 卧底 程序设计