结对编程黄金点游戏
这次的编程实验我的队友是慕向昕,我们共同完成了本次实验。
黄金点游戏是一个数字小游戏,其游戏规则是:
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轮以上,并能够保留各轮比赛结果。
在得到这个题目后我们对这次的实验如何进行进行了一些讨论。
我们先从实验方法上进行了讨论,要实现可视化可选择的语言有很多但是我们学习的C、C++要实现界面的就不如其他语言了。于是经过分析我们决定使用一种新的语言java语言,java是一种出色的面向对象的跨平台编程语言。为了能更好的学习java,我向图书馆借了三本有关java的书。如《java典型模块与项目实战大全》、《java程序设计与项目实践》、《java学习笔记》,并且从网上买了一本《零基础学java》的书。我们共同努力共同学习来完成这个编程实验。
在学习的过程中我们并没有停下编程。我们对本次编程进行了探讨画出编程的流程图便于本次的实验。进过我们共同的商议决定先编程实现游戏的进行。于是我们便先完成了如下代码:
for(int h=0;h<nump;h++){ goal[h]=0; gan[h]=0; } for(int s=0;s<numg;s++) { System.out.println("游戏开始"); for(int k=0;k<nump;k++) { System.out.println("由玩家输入估计的数值num值为整形"); double num = in.nextDouble(); //接收float型数据 numn[s][k]=num; } for(int j=0;j<nump;j++) { sum+=numn[s][j]; } G=(sum/nump)*0.618;//求G值 double dif=0; for(int qq=0;qq<nump;qq++){//求分数 dif=Math.abs(numn[s][qq]-G); goal[qq]=dif; } for(int f=0;f<nump;f++) { if(max<goal[f]) max=goal[f]; if(min>goal[f]) min=goal[f]; } for(int th=0;th<nump;th++) { if(goal[th]==min) gan[th]=gan[th]+nump; if(goal[th]==max) gan[th]=gan[th]-2; } for(int tt=0;tt<nump;tt++) { System.out.println(gan[tt]); } }
这个代码是用三个数组来实现的,numn[][]数组是来存放游戏者输入的值的,goal[]是中间数组用来求分数的时候对他们判断的差距进行存放。还有一个数组gan[]用来存放每个玩家的分数的。使用多个for循环来控制语句,控制变量。外层for循环来控制游戏的进行次数。这个代码的实现还是很简单的。我们分别进行的编码最终选用了我的来实现程序。就是上面所写代码。
在编程的过程中我们遇到过麻烦但是我们去查书、去上网百度,最终这些麻烦都得到了很好地解决。我们从最初的连java的输入输出都不会到完成一个程序虽然遇到过困难但是我们克服了,这个过程是非常的享受的。
这是我们一起进行编程一起讨论。
我们经过几天的学习对java的了解也更多了。Java的运行过程也略有熟悉,我就将输入输出之类的加上,将程序完善。
代码如下:
import java.awt.event.MouseEvent; import java.util.Scanner; public class shiyan4 { @SuppressWarnings("resource") public static void main(String args[]) { Scanner in=new Scanner(System.in); //使用Scanner类定义对象 double numn[][] = new double [100][100]; double goal[] = new double [100]; double gan[] = new double [100]; double max=0,min=100; double sum=0,G=0; System.out.println("请输入人数mump"); double nump=in.nextDouble(); //接收float型数据 System.out.println("请输入游戏次数mumg"); double numg=in.nextDouble(); //接收float型数 for(int h=0;h<nump;h++){ goal[h]=0; gan[h]=0; } for(int s=0;s<numg;s++) { System.out.println("游戏开始"); for(int k=0;k<nump;k++) { System.out.println("由玩家输入估计的数值num值为整形"); double num = in.nextDouble(); //接收float型数据 numn[s][k]=num; } for(int j=0;j<nump;j++) { sum+=numn[s][j]; } G=(sum/nump)*0.618;//求G值 double dif=0; for(int qq=0;qq<nump;qq++){//求分数 dif=Math.abs(numn[s][qq]-G); goal[qq]=dif; } for(int f=0;f<nump;f++) { if(max<goal[f]) max=goal[f]; if(min>goal[f]) min=goal[f]; } for(int th=0;th<nump;th++) { if(goal[th]==min) gan[th]=gan[th]+nump; if(goal[th]==max) gan[th]=gan[th]-2; } for(int tt=0;tt<nump;tt++) { System.out.println(gan[tt]); } } } }
这个代码达到了老师要求的大部分,我们想对代码进行改善,如加上界面,但是我们遇到了一些麻烦,对界面的学习我们还不到位,尽管我们很想很好地完成老师的任务,但是很遗憾我们没能实现。没能很好的完成老师布置的任务。不过我会继续努力学习java语言的,我已经深深的被她吸引,我相信将来我会做的更好。
这是进行游戏的过程,有一个人负责进行游戏操作决定玩家的人数和游戏的轮数,玩家把自己估计的值说个操作者,由操作者进行输入,我们这个游戏每轮都会给出成绩玩家,操作者可以决定玩家是否看每次的分数,增加游戏的乐趣。
这是每次得出的分数。
这次的编程过程很愉快,我们都进行了努力去编写这个程序,这个程序是我付出了很多,但同时我也收获了很多。我的编程伙伴是慕向昕,他编程也很有想法,编程序的整体思想很好,同时他也很虚心谦让,我们共同努力共同进步。
我会继续努力继续进步。