软件工程:黄金G点小游戏1.0
我们要做的是黄金G点小游戏:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。
现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下:
1、本作业属于结对编程项目,必须由二人共同完成,并分别将本次作业过程发到博客,同时将本次作业源代码提交到codeing系统;
2、如果可能的话尽量以C/S或B/S方式实现,即利用服务器接收和处理所有玩家提交的数字,并将结果反馈给各玩家,玩家可以通过客户端提交的数字;
3、如果采用单机方式实现的话,需要为用户提供便利的输入界面;
4、该游戏每次至少可以运行10轮以上,并能够保留各轮比赛结果。
这是个工程结对作业,我的队友是:http://www.cnblogs.com/lvzhongheng/
接下来是研究作业时的照片:
我们做的作业是黄金G点小游戏(老师上课时说4班做电梯调度系统,但是当时没注意听讲,就直接做了G点小游戏,由于进程过半,同老师商量之后就继续做了这个作业。),用Android APP实现。从设计讨论分析需求,我两讨论激烈。
他有他的想法我有我的固执,就这样在需求这一块没谈拢,我们又很在乎这次作业。后来各自回去之后自己设计自己的游戏模型,然后一起隔天讨论。
很小的细节,在我们各自回去之后,我在玩游戏时,突然他在QQ上给我谈了他对这个黄金小游戏需求和看法,其实那时也差不多是晚上十二点了,我没怎么理会。从这件事我就知道他也很重视这个作业。
第二天看了他设计的模型之后,觉得他挺有想法,UI设计也挺美观。虽然后面有所改动。这样好的模型设计我们怎舍得拒绝,谈下来了,就这样他负责UI的制作,而我负责一些逻辑功能的设计与实现。
我负责代码的堆砌,他负责设计。
APP下载链接,由于只是用5.1寸、1080p模拟器开发,没做屏幕适配:http://pan.baidu.com/s/1slgiW8X
先看个GIF演示吧(不知道怎么回事优酷链接的视频无法加载,果断用了gif):
主要功能及实现:
一).主页面讲解;
1.主页面如图: |
2.界面元素 | |
1.页面中央为参与游戏人员输入的姓名及数值,从输入框中获取信息,进行参与游戏。 重置是把list集合里的数据清空,提交是把数据提交进行单机运算(原本准备实现单机与联网模式的,时间有限只实现了单机,后面如果升级加入联网模式),下一个人表示准备输入下一个人信息。 2.右上角+为主菜单按钮。 |
3.代码及分析:
在游戏参与人员的姓名和数值输入框中我采取了验证型方式,即是采用了正则表达式来验证,首先验证是否输入为空,姓名是否输入错误,数值是否是在1-99之间。
1)获取输入内容:
1 private void functionnext() { 2 String name = ET_name.getText().toString(); 3 String numble = ET_numble.getText().toString(); 4 if (isSure(name, numble)) { 5 functionAdd(name, numble); 6 flag++; 7 }
2)验证是否合法,合法返回true,否则返回false:
1 private boolean isSure(String name, String numble) { //提交按钮函数 2 if (name == null || numble == null) { 3 Toast.makeText(getApplication(), "不能为空......", Toast.LENGTH_LONG) 4 .show(); 5 return false; 6 } else { 7 boolean nam = InputText("\\w{1,8}", name); 8 boolean num = InputText("[1-9]|[1-9]\\d", numble); 9 if (nam == false && num == false) { 10 Toast.makeText(MainActivity.this, "名字和数字输入错误...", 11 Toast.LENGTH_LONG).show(); 12 return false; 13 } else if (nam == false && num == true) { 14 Toast.makeText(MainActivity.this, "名字输入错误,只能是8位词组...", 15 Toast.LENGTH_LONG).show(); 16 return false; 17 } else if (nam == true && num == false) { 18 Toast.makeText(MainActivity.this, "数字输入错误,只能是1到99...", 19 Toast.LENGTH_LONG).show(); 20 return false; 21 } else { 22 return true; 23 } 24 }
1 private boolean InputText(String inType, String inValue) { ///// 正则表达式匹配 2 Pattern patternA = Pattern.compile(inType); 3 Matcher matcherA = patternA.matcher(inValue); 4 boolean result = matcherA.matches(); 5 return result;
3)合法加入list集合:
1 private void functionAdd(String name, String numble) { 2 int numbleInt = Integer.parseInt(numble); 3 Datamodle data = new Datamodle(); 4 data.setName(name); 5 data.setNumble(numbleInt); 6 list.add(data); 7 flagA = list.size() + 1; 8 TV_ifo.setText("第" + flagA + "个人"); 9 ET_name.setText(null); 10 ET_numble.setText(null);
4)重置即是清空list集合用到list.removeall();
1 private void functionLast() { //// 重置函数 method 2 AlertDialog aler = new AlertDialog.Builder(MainActivity.this).create(); 3 aler.setIcon(R.drawable.ic_launcher); 4 aler.setTitle("提示:");// 设置对话框标题 5 aler.setMessage("确定重置吗?");// 设置显示的内容 6 aler.setButton(DialogInterface.BUTTON_POSITIVE, "确定", 7 new DialogInterface.OnClickListener() { 8 @Override 9 public void onClick(DialogInterface dialog, int which) { 10 list.removeAll(list); 11 try { 12 if (list.isEmpty()) { 13 Toast.makeText(getApplication(), "重置成功...", 14 Toast.LENGTH_SHORT).show(); 15 } else { 16 Toast.makeText(getApplication(), "没有重置成功...", 17 Toast.LENGTH_LONG).show(); 18 } 19 } catch (Exception e) { 20 // TODO: handle exception 21 } 22 flagA = list.size() + 1; 23 TV_ifo.setText("第" + flagA + "个人"); 24 } 25 }); 26 aler.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", 27 new DialogInterface.OnClickListener() { 28 @Override 29 public void onClick(DialogInterface dialog, int which) { 30 } 31 }); 32 aler.show();// 在按键响应事件中显示此对话框 33 }
二)历史页面讲解
1.历史记录界面 | 2.界面元素 | |
1.历史记录折线图,根据历史记录里的黄金G值绘出来的折线图,可以直观的看出是否G点有下降的趋势,并可以进行分析。 2.listview历史记录,记录的是曾经加入历史记录的每一轮游戏的相关信息。 |
3.代码及分析:
1)关于折线图的绘制我在上一篇博客有描述,这里不再讲解。链接:http://www.cnblogs.com/zxr63/p/5338531.html
2)listview的绑定内容在adapter上,并且从数据库中取得数据,加载在list集合中,每次加载10条数据库中的数据。
adapter代码:
1 package com.example.game; 2 3 import java.text.SimpleDateFormat; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import android.content.Context; 8 import android.view.View; 9 import android.view.ViewGroup; 10 import android.widget.BaseAdapter; 11 import android.widget.TextView; 12 13 public class AdapterHistory extends BaseAdapter { 14 private Context Mcontext; 15 private List<DataHistory> list=new ArrayList<DataHistory>(); 16 public AdapterHistory(Context Mcontext, 17 List<DataHistory> list) { 18 this.Mcontext=Mcontext; 19 this.list=list; 20 } 21 @Override 22 public int getCount() { 23 return list.size(); 24 } 25 26 @Override 27 public DataHistory getItem(int position) { 28 return list.get(position); 29 } 30 31 @Override 32 public long getItemId(int position) { 33 return position; 34 } 35 36 @Override 37 public View getView(int position, View convertView, ViewGroup parent) { 38 DataHistory data=new DataHistory(); 39 data=list.get(position); 40 View view=null; 41 Holder holder=null; 42 if(convertView!=null){ 43 view=convertView; 44 holder=(Holder) view.getTag(); 45 }else{ 46 view=View.inflate(Mcontext, R.layout.itemhistory, null); 47 holder=new Holder(); 48 holder.TV_minperson=(TextView) view.findViewById(R.id.TV_minperson); 49 holder.TV_maxperson=(TextView) view.findViewById(R.id.TV_maxperson); 50 holder.TV_itemtime=(TextView) view.findViewById(R.id.TV_itemtime); 51 view.setTag(holder); 52 } 53 holder.TV_minperson.setText("Minperson:"+data.getMinValue()+"人..."); 54 holder.TV_maxperson.setText("Maxperson:"+data.getMaxValue()+"人..."); 55 holder.TV_itemtime.setText(data.getTime()); 56 return view; 57 } 58 public static class Holder{ 59 public TextView TV_minperson; 60 public TextView TV_maxperson; 61 public TextView TV_itemtime; 62 63 } 64 65 }
listview被点击项的删除操作:
1 public class ItemClickListener implements OnItemClickListener { 2 @Override 3 public void onItemClick(AdapterView<?> parent, View view, int position, 4 long id) { 5 StringBuffer str = new StringBuffer(); 6 DataHistory data = new DataHistory(); 7 data = adapter.getItem(position); 8 str.append(data.getIfo() + "\n" + data.getMinperson() + " ...得" 9 + data.getAllperson() + "分\n" + data.getMaxperson() 10 + " ...得-2分\n" + "G值为:" + data.getValueG()); 11 AlertDialog aler = new AlertDialog.Builder(HistoryActivity.this) 12 .create(); 13 aler.setIcon(R.drawable.ic_launcher); 14 aler.setTitle("游戏信息:"); 15 aler.setMessage(str); 16 final String idposition = data.getId()+""; 17 final int positionA=position; 18 aler.setButton(Dialog.BUTTON_POSITIVE, "取 消", 19 new DialogInterface.OnClickListener() { 20 @Override 21 public void onClick(DialogInterface dialog, int which) { 22 } 23 }); 24 aler.setButton(Dialog.BUTTON_NEGATIVE , "删除记录", 25 new DialogInterface.OnClickListener() { 26 @Override 27 public void onClick(DialogInterface dialog, int which) { 28 SQLiteDatabase db = SQLiteDatabase 29 .openOrCreateDatabase(pathDatabase, null); 30 db.delete("ifotable","id="+idposition, null); 31 Cursor cr=db.rawQuery("select *from ifotable;",null); 32 if(databaseROW==cr.getCount()+1){ 33 Toast.makeText(getApplicationContext(), "删除成功...", Toast.LENGTH_LONG).show(); 34 V_text.removeAllViews(); //清除之前绘制的折线图 35 list.remove(positionA); //移除相应的item 36 adapter.notifyDataSetChanged(); //告知listview adapter发生变化 37 V_text.addView( 38 new Myview(HistoryActivity.this, paint())); 39 }else{ 40 Toast.makeText(getApplicationContext(), "删除失败...", Toast.LENGTH_LONG).show(); 41 } 42 db.close(); 43 } 44 }); 45 aler.show(); 46 } 47 }
三)总结
在Android学习中,自己总走错路,菜鸟的领航人就是自己的信念。坚持并接受一切来自别人的批评,学技术最忌讳的就是闭门造车。在结对伙伴这里成长,以后才能走得更远!