zoukankan      html  css  js  c++  java
  • 结对编程--基于android平台的黄金点游戏

    游戏内容:

    阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏:

    N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。

    玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。

    结对编程的体验

    这是第一次接触到结对编程,个人感觉效率提高了很多,在以前的编码过程中,思路经常因为查找文档这些事情而打断,但是在结对编程的过程中,两个人的思维都保持在一个很敏捷的状态,即使是短暂的走神等负面状态,也可以在很短的时间内恢复高效的状态,个人很喜欢这种编码方式,如果以后有机会,还会再在日常的编码过程中使用这种工作方式。

    项目概述

    接到题目之后思考之后并没有想到CS的良好交互体验方法,所有便选择了单机模式,就像在平时聚会时玩的谁是卧底游戏,只需要将手机按顺序传递就可以完成输入数据,在每个人输入数据之前重置界面便可以避免泄漏玩家的数据。同样限于时间问题,并没有做UI方面的设计,界面粗糙,还请海涵...下面讲一下该项目的文件结构。

    共创建了4个class,其中3个继承至Activity,另一个类playerINFO用来存放管理用户数据。

    1.MainActivity

    在这里选择开始游戏,之后会弹出页面alterdialog提醒第一个玩家输入自己的昵称,并详细讲述游戏规则,在本游戏中,每一轮的游戏时玩家的序号是玩家的标号,昵称并不作为唯一确定玩家身份的变量。界面如下图。

    package com.example.shea.goldenpoint;
    //************************************************************
    //**                                                        **
    //**                    RAY'S WORK                          **
    //**                    2013040101016                       **
    //**                                                        **
    //************************************************************
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import java.lang.reflect.Field;
    
    public class MainActivity extends AppCompatActivity {
    
        String name="";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button STARTbtn=(Button)findViewById(R.id.START);
            STARTbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    final EditText ET = new EditText(getApplicationContext());
                    ET.setHint("请输入你的昵称");
                    ET.setTextColor(Color.BLACK);
                    ET.setHintTextColor(Color.BLUE);
                    new AlertDialog.Builder(MainActivity.this).setView(ET).
                            setMessage("请输入一个0-100的有理数,然后点击提交,如果需要更改,点击再次提交,如果完成请点击下一位玩家,并将手机传递给下一位玩家,最后一名玩家请点击结束游戏").
                            setTitle("游戏规则").
                            setPositiveButton("了解!开始游戏!", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (TextUtils.isEmpty(ET.getText().toString()))
                                    {
                                        try {
                                            Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                                            field.setAccessible(true);
                                            field.set(dialog, false);
                                        } catch (IllegalAccessException e) {
                                            e.printStackTrace();
                                        } catch (NoSuchFieldException e) {
                                            e.printStackTrace();
                                        }
                                        Toast.makeText(MainActivity.this, "请输入玩家姓名", Toast.LENGTH_LONG).show();
                                        }
                                    else
                                    {                                   try {
                                        Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                                        field.setAccessible(true);
                                        field.set(dialog, true);
                                    } catch (IllegalAccessException e) {
                                        e.printStackTrace();
                                    } catch (NoSuchFieldException e) {
                                        e.printStackTrace();
                                    }
                                        name = ET.getText().toString();
                                        System.out.println(name);
                                        Intent intent=new Intent(MainActivity.this,Game.class);
                                        intent.putExtra("name",name); startActivity(intent);}
                                }
                            }).create().show();
                }
            });
        }
    }
    

      

    2.Game

    这部分作为项目的核心部分,玩家在这里输入自己的游戏数据,提交数据,然后把手机传给下一个玩家,循环往复。该部分在获取用户输入的过程中,很大一部分的工作是处理用户的异常输入,比如限制用户输入数字的范围必须在0-100,用户未输入数据不能点击结束游戏,下一位玩家的按钮,同时如果玩家少于2人,这个游戏无法开始,给用户提供两个选项结束游戏和继续游戏,在该部分为了使每次游戏的信息能存储下来,使用了sharedpreferences,这是一种轻型的数据存储方式,它的本质是基于XML文件存储Key-Value键值对数据。界面如下图

     package com.example.shea.goldenpoint;
    //************************************************************
    //**                                                        **
    //**                    RAY'S WORK                          **
    //**                    2013040101016                       **
    //**                                                        **
    //************************************************************
    
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Map;
    
    
    public class Game extends AppCompatActivity {
        private int count = 1;
        private boolean FLAG=true;
        private int counter=0;
        private double average=0;
        private double sum=0;
        private double num=0;
        private  double G=0;
        public String name="";
        public boolean draw=true;
        private double[] data= new double[100];
        private double[] distance=new double[100];
        public ArrayList<Object> showresult=new ArrayList<>();
        public playerINFO playerinfo[]=new playerINFO[100];
        String[] result=new String[100];
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.game);
            final SharedPreferences mypreferences=getSharedPreferences("tempdata",Context.MODE_APPEND);
            final SharedPreferences.Editor myeditor=mypreferences.edit();
            final Button END= (Button) findViewById(R.id.END);
            final Button NEXT= (Button) findViewById(R.id.NEXT);
            final Button reSUBMITbtn= (Button) findViewById(R.id.SUBMITbtn);
            final Button SUBMIT= (Button) findViewById(R.id.SUBMIT);
            final EditText ET = new EditText(getApplicationContext());
            final EditText INPUT= (EditText) findViewById(R.id.INPUT);
            final TextView reSUBMIT= (TextView) findViewById(R.id.SUBMITtv);
            final TextView SHOWINFO = (TextView) findViewById(R.id.PLAYERINFO);
            reSUBMITbtn.setVisibility(View.INVISIBLE);
            SHOWINFO.setText("当前是第" + 1 + "名玩家");
            reSUBMIT.setText("");
            Intent intent= getIntent();
            name=intent.getStringExtra("name");
    
    
            SUBMIT.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FLAG = false;
                    String str = INPUT.getText().toString();
                    if (TextUtils.isEmpty(INPUT.getText().toString()))
                        Toast.makeText(Game.this, "请输入您的数值!", Toast.LENGTH_SHORT).show();
                    else {
                        num = Float.valueOf(str);
                        if (num < 100 && num > 0) {
                            Toast.makeText(Game.this, "输入成功,请将手机传递给下一个玩家,如需修改,请输入数据后点击再次提交。如果停止游戏,请点击结束游戏", Toast.LENGTH_LONG).show();
                            reSUBMIT.setText(name+",您输入的数据是" + str);
                            reSUBMITbtn.setVisibility(View.VISIBLE);
                            data[counter] = Float.valueOf(str);
                            String ObjectNAME = "";
                            System.out.println(name);
                            playerinfo[counter] = new playerINFO(name, data[counter]);
                            playerinfo[counter].setNO(counter+1);
                            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                            if (imm.isActive() && getCurrentFocus() != null) {
                                if (getCurrentFocus().getWindowToken() != null) {
                                    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                                }
                            }
    
    
                        } else {
                            Toast.makeText(Game.this, "请输入一个介于0-100之间的有理数", Toast.LENGTH_SHORT).show();
    
                        }
                    }
                }
            });
    
            reSUBMITbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    reSUBMITbtn.setVisibility(View.INVISIBLE);
                    reSUBMIT.setText("");
                    INPUT.setText("");
    
                }
            });
    
            NEXT.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   if (FLAG)
                   {
                       Toast.makeText(Game.this,"请提交你的结果",Toast.LENGTH_SHORT).show();
                   }
                    else
                   {
                       reSUBMITbtn.setVisibility(View.INVISIBLE);
                       reSUBMIT.setText("");
                       INPUT.setText("");
                       FLAG=true;
                       count++;
                       counter++;
                       name="";
                       System.out.println();
                       SHOWINFO.setText("当前是第" + count + "名玩家");
                       final EditText ET = new EditText(getApplicationContext());
                       ET.setHint("请输入你的昵称");
                       ET.setTextColor(Color.BLACK);
                       ET.setHintTextColor(Color.BLUE);
                       new AlertDialog.Builder(Game.this).setView(ET).
                               setMessage("请输入一个0-100的有理数,然后点击提交,如果需要更改,点击再次提交,如果完成请点击下一位玩家,并将手机传递给下一位玩家,最后一名玩家请点击结束游戏").
                               setTitle("游戏规则").
                               setPositiveButton("了解!开始游戏!", new DialogInterface.OnClickListener() {
                           @Override
                           public void onClick(DialogInterface dialog, int which) {
                               if (TextUtils.isEmpty(ET.getText().toString()))
                               {
                                   try {
                                       Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                                       field.setAccessible(true);
                                       field.set(dialog, false);
                                   } catch (IllegalAccessException e) {
                                       e.printStackTrace();
                                   } catch (NoSuchFieldException e) {
                                       e.printStackTrace();
                                   }
                                   Toast.makeText(Game.this,"请输入玩家姓名",Toast.LENGTH_LONG).show();}
                               else
                               {                                   try {
                                   Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                                   field.setAccessible(true);
                                   field.set(dialog, true);
                               } catch (IllegalAccessException e) {
                                   e.printStackTrace();
                               } catch (NoSuchFieldException e) {
                                   e.printStackTrace();
                               }
                                   name = ET.getText().toString();
                               }
                           }
                       }).create().show();
                   }
    
    
                }
            });
    
            END.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
                    if(count<2)
                        new AlertDialog.Builder(Game.this).setTitle("不符合游戏规则!").setMessage("游戏结束至少需要2人,推荐人数10人").setPositiveButton("退出游戏", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent intent=new Intent(Game.this,MainActivity.class);
                                startActivity(intent);
                            }
                        }).setNegativeButton("继续游戏", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
    
                            }
                        }).create().show();
                    else if (TextUtils.isEmpty(INPUT.getText().toString())){
                        Toast.makeText(Game.this, "请输入您的数值!", Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
    
                        for (int m=0;m<count;m++)
                        {
                            sum+=data[m];
    
                        }
                        average = sum/count;
                        G=average*0.618;
                        for (int i=0;i<count;i++)
                        {
                            distance[i]=data[i]-G;
                            double a=Math.abs(distance[i]);
                            playerinfo[i].setDistance(a);
                         }
                        double max=playerinfo[0].distance;
                        double min=playerinfo[0].distance;
                        for (int i=1;i<count;i++) {
                            if (playerinfo[i].distance>max)
                                max=playerinfo[i].distance;
                            if (playerinfo[i].distance<min)
                                min=playerinfo[i].distance;
    
                        }
                        for (int i=0;i<count;i++)
                        {
                            if (playerinfo[i].distance==max)
                                playerinfo[i].setScore(-2);
                            else if (playerinfo[i].distance==min)
                                playerinfo[i].setScore(count);
                            else
                                playerinfo[i].setScore(0);
                            playerinfo[i].showinfo();
                        }
                        for (int i=0;i<count;i++)
                        {
                            result[i]=playerinfo[i].showinfo();
                            myeditor.putString(playerinfo[i].name,result[i]);
                            myeditor.commit();
    
                        }
                        if (max==min)
                            draw=false;
                        for (int i=0;i<count;i++){
                            String myresult= mypreferences.getString(playerinfo[i].name, "无比赛数据");
                            System.out.println(myresult);}
                        Map<String,?> mydata=mypreferences.getAll();
                        for (String key:mydata.keySet()
                             ) {
                            showresult.add(mydata.get(key));
                            System.out.println("new------" + mydata.get(key));
    
                        }
                        for (int i=0;i<showresult.size();i++)
                            System.out.println(result[i]=showresult.get(i).toString());
    
    
                        Bundle mybundle=new Bundle();
                        mybundle.putStringArray("result",result);
                        mybundle.putBoolean("draw",draw);
                        Intent intent=new Intent(Game.this,showresult.class);
                        intent.putExtra("data",mybundle);
                        startActivity(intent);
    
                  }
                }
            });
    
    
    
        }
    
    }

    3.showresult

    该界面就是用来输出结果,在这里可以清楚过往数据,返回主页以及查看历史数据。

     

    总结:

    通过该次结对编程,让我对编码的技巧性的认识又扩宽的一个层面,一个人的能力或许是有限的,但是当我们找到一个合适的方法,我们可以提升效率,把自己的能力最大化输出,这是我们日后走向工作岗位很重要的一项技能,这其中的工程之美,只有自己亲身体验了才能感受到,这让我更加期待自己日后的软件工程课的学习了。

    对伙伴的评价:本次项目进行之前,徐同学没有接触过android相关知识,但是在结对编程的过程中,学习进步非常快,个人觉得在IT行业中,学习能力是一项非常重要的能力,而徐同学在这方面很强,学以致用,举一反三,自己以后还是要向他学习一个。

    工作状态图...

    Coding地址:https://coding.net/u/rayshea/p/android-based-golden-point/git

  • 相关阅读:
    【Leetcode】【Easy】Remove Duplicates from Sorted List
    【Leetcode】【Easy】Pascal's Triangle II
    【Leetcode】【Easy】Pascal's Triangle
    【Leetcode】【Easy】Binary Tree Level Order Traversal II
    【Leetcode】【Easy】Binary Tree Level Order Traversal
    【Leetcode】【Easy】Maximum Depth of Binary Tree
    【Leetcode】【Easy】Minimum Depth of Binary Tree
    【Leetcode】【Easy】Balanced Binary Tree
    【Leetcode】【Easy】Symmetric Tree
    如何使用Action.Invoke()触发一个Storyboard
  • 原文地址:https://www.cnblogs.com/RayShea/p/5372398.html
Copyright © 2011-2022 走看看