结对编程--基于android平台的黄金点游戏

游戏内容:

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

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

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

结对编程的体验

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

项目概述

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

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

结对编程--基于android平台的黄金点游戏

1.MainActivity

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

结对编程--基于android平台的黄金点游戏

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键值对数据。界面如下图

结对编程--基于android平台的黄金点游戏

结对编程--基于android平台的黄金点游戏

结对编程--基于android平台的黄金点游戏

结对编程--基于android平台的黄金点游戏

结对编程--基于android平台的黄金点游戏

 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平台的黄金点游戏

总结:

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

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

结对编程--基于android平台的黄金点游戏

工作状态图...

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

上一篇:步步深入:MySQL架构总览->查询执行流程->SQL解析顺序


下一篇:volatile 与 JVM 指令重排序