结对编程之黄金点游戏
本游戏采用客户端——服务器模式,程序设计语言为C#,使用winform设计游戏界面,网络通信采用Socket通信,使用Socket设计出服务器和客户端程序,这里可用个人电脑来做服务器端。
游戏界面
首先先来看一下最终的效果
这是服务器设置界面:
在这里可以设置游戏人数,游戏回合数,点击确定后设置成功。这里左上角有查看按钮,可以查看当前服务器所在计算机的IP地址,便于客户端通过IP地址与服务器端连接。
以下是IP地址查询结果,在未连接网络状态下显示IP地址为127.0.0.1,这里展示的是客户端与服务器同在一台电脑的运行结果,不同客户端的区分可通过其连接上服务器时对应的端口号。
这是客户端的界面:
在这里要想和服务器端连接首先要知道当前服务器的IP地址,由于现在的IP地址都是动态分配的,在联网状态下每次分配到的IP地址都不同,将服务器端查到的IP地址输入,并将用户名输入,在这里输入的用户名可以在服务器端看数据时看到。
这是客户端数据发送界面
在这里输入要发送的数据,并等待其他玩家发送完数据,然后接收来自服务器端的数据。
这是其中一个客户端收到的结果:
这是服务器端可以查看到的数据:
这里以表格形式呈现更加的直观,这里可以看到每个客户端的信息,包括姓名;客户端当前IP地址,因为所有客户端都在同一台计算机上运行,所以IP地址是相同的;端口号:每个客户端在连接服务器时都要与服务器对应端口号连接,我已经在程序里设定了固定的开放的端口号,在客户端也设定了与之对应的端口号,在连接上时,每个客户端会被分配到不同端口号,考虑到存在多个客户端在同一台计算机上运行,所以是通过对端口号来识别客户端,而不是IP地址;客户端发送的数据;以及分数。因为觉得服务器权限应该更大一些,所以在这里可以看到十分详尽的信息。
队友介绍及合作总结
这次结对编程我的队友是李泽,我们的性格比较的相近,这十分有利于我们的沟通。在整个设计过程中我们合作十分融洽,大大的有利于设计过程的顺利推进。我提出的任务队友很尽心尽力的去完成。队友十分谦虚好学,在设计过程中我说的相关知识队友会很耐心的听着,因此我觉得结对编程的过程也是一个知识交流的过程。在效率方面,当其中一个人在设计的时候,另一个人也在一直检查着,所以有一些问题在写代码的时候就提前解决,这十分重要,因为当工程量较大调试Bug的工作是十分艰巨的,我们体会颇深。而且两个人在一起的时候可以随时交流,所以在设计的时候是集两人之智慧,比一个人强很多,交流过程中时不时会碰撞出灵感的火花。所以结对编程我觉得有以下优点:可以集两人智慧,尽早找出问题所在,轮流编程可以减小疲劳,可以交流知识,有额外的收获。
合作照片
程序总结
不要小看这个小程序,它集合不同的技术,以C#程序设计语言为基础,界面使用C#中的winform,网络通信的构建采用Socket技术,因为要与多个客户端进行网络通信又使用了多线程技术。在程序运行过程中,数据在各个线程,之间不停的传送,从服务器传送到客户端,从客户端传送到服务器,将数据在传送到窗体界面之中,窗体根据这些数据再进行改变,数据通信时还有时序问题,还有发送的信息是字节,客户端或者服务器接收到数据并不知道这是什么数据,还要对数据进行判断这是什么类型的数据,再将数据进行存储计算。
这其中有一部分还是现学现用的,第一次使用时我们写试验程序,了解特性,积累经验。设计过程中遇到了很多难题,我们有一个深刻的体会,单个拿出来其中一种功能可以很好的应用它,但是当把众多技术结合在一起的时候会发生意想不到的问题。比如服务器进行运算之前要等到最后一个客户端发送过来信息才开始计算并改变窗体界面,在程序运行起来提示了一个错误,就是客户端这边的线程不能操控窗体的变化,这是首次遇到这类型的问题,以前写多线程程序是各个线程各自跑各自的,线程之间互不影响,但是现在用其中一个线程直接去操作另一个线程这就出现了问题。我们尝试了不同的办法都不能解决这个问题,我们不停的尝试,后来谈到计算机组成原理就有了灵感,不从程序出发而是从计算机结构出发,两个线程虽然在不停的运行,但是可以通过间接地方法实现一个线程来影响另一个线程,这个线程要发出指令的时候改变某一变量的数据,这个变量在主存之中,另一个线程不停的判断这个数据是否发生变化,当发生变化时,跳出循环,将数据应用到这个线程,来实现这一操作,这个问题的解决过程也是一个锻炼过程。
我很想说,原先的设计要比这个好很多,每个界面都有不同背景,等待界面还是动态的,接收到不同的分数客户端的界面也不同,这些东西在写程序时已经写到了程序中,并且在前期调试过程中还是有的,但是代码量实在太大,写完之后发生一系列的问题,在解决玩这些问题的时候,发现界面元素有些显示不出来了,然后进行修改又引发了其他问题,由于距离提交作业已经很近了没有充足的时间来排除这些问题,只能将这些东西删除掉。所以没有达到预期效果,心中有些小遗憾。对此我有一个总结,很多控件都放在一起通过隐藏和显示的方法来显示界面需要操控的对象十分之多而且相互影响,出现问题时导致Bug查找十分困难,反思之后觉得应该每个界面做一个子窗体,分别控制互不影响,各个子窗体在主窗体之中进行切换。
通过这次编程使得我们对技术的应用更加成熟了,也希望我的经验能够对各位道友有借鉴的作用。
队友博客网址:http://www.cnblogs.com/yy0522/p/5967666.html
源代码已上传至Coding.net上,网址:https://coding.net/u/baixiaochun/p/goldponit/git/tree/master/