zoukankan      html  css  js  c++  java
  • 软件工程:黄金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 }
    View Code

    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() + "
    " + data.getMinperson() + " ...得"
     9                     + data.getAllperson() + "分
    " + data.getMaxperson()
    10                     + " ...得-2分
    " + "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     }
    View Code

    三)总结

          在Android学习中,自己总走错路,菜鸟的领航人就是自己的信念。坚持并接受一切来自别人的批评,学技术最忌讳的就是闭门造车。在结对伙伴这里成长,以后才能走得更远!

  • 相关阅读:
    List 组件简单示例及其onItemsDisclosure点击事件
    读取mysq数据库l数据,并使用dataview显示
    使用dataview组件显示服务器端xml文件数据
    Flex 布局教程:语法篇
    artTemplate模板引擎
    HTTP协议响应消息的常用状态码【转】
    淘宝网前端开发面试题(二)--JS 面试题
    淘宝网前端开发面试题(一)--HTML & CSS 面试题
    HTML 5 Canvas
    清除浮动的几种方法
  • 原文地址:https://www.cnblogs.com/zxr63/p/5371578.html
Copyright © 2011-2022 走看看