五子棋--开发第一阶段

来源:互联网 发布:bec背单词软件 编辑:程序博客网 时间:2024/05/17 11:57

           大学以来第一个工程实践项目---五子棋,现在大一,不知道以后还有没有,基本要求是人人对战,但是,还是想试一试人机对战,所以一开始就将人机对战的功能预算在里面了。到现在五子棋能实现人人对战和人机对战,由于没有限定语言,所以就使用Java了,大一寒假的时候用C语言写过一个小游戏,真心不会再用C些游戏了。。所以也就毫无顾忌的选择了Java,虽然是一个很小的工程实践项目,但是,我还是按照自己的想法来进行了开发流程。以下便是我整理的一些开发记录。

           首先设定的是项目需求,一个界面,可以人人对战,人机对战,保存棋局,设定先手等等,然后选择的开发流程是增量开发,首先开发出人人对战,其次是保存棋局,然后是人机对战,当然后面还有什么悔棋啊,选择难度啊,网络对战啊,由于考试月,所以也就只是开发了前面三个。一开始我设定了三个基本对象,画棋盘对象----负责初始化棋盘,画棋子等,玩家----负责改变棋盘状态,整个棋盘是一个数组,也就是说,回通过鼠标适当的点击来改变这个数组,最后一个是判决者----通过棋盘状态判断输赢,也即是说,首先会有一些初始化动作,然后是玩家改变棋盘状态,然后发消息给画棋盘对象,让它画出棋盘,最后画好了后由画棋盘对象发消息给判决者让它判断,但是后来我发现这样不太方便,于是我就将画棋盘和改变棋盘状态并为一个对象,也就是说玩家负责改变棋盘状态和画出棋盘,然后让判决者判断。后来由于需要,继续开发了保存棋盘类,播放音乐类,选择落子类,当然还有一个main类一共六个,功能也就是这些的名字,我想这个和面向对象有一定的联系了吧,类的划分也许还有一定的问题,共勉。

          然后就说一说期间具体遇到的问题吧,首先是repaint这个问题,具体的我已经写了一篇博客来阐述,然后就是判断者的算法了,思路很简单,落子后,判断这个落子的上下,左右,斜左,斜右是否成五就OK了,这里我也就给出具体的代码,算法也很菜鸟,我准备在暑假好好的优化一下,多多包涵。


/** * i:用于横向计数 j:用于纵向计数 h:用于相同连线棋子计数 judgewho用于暂时保存是谁在被判断的临时变量 * pointx与pointy是当前落子的地方,由于任意一方如果要赢,必须是五子连线,而且是最后一颗,所以, * 只需要确定当前落子对输赢的影响。 * 分别从上下,左右,左斜上左斜下和右斜上右斜下来进行判断 */private int i, j, h, judgewho;private boolean isWin = false;public int judge(int search[][], int pointx, int pointy) {i = pointx;j = pointy;h = 0;if (search[i][j] == 1 || search[i][j] == -1) {judgewho = search[i][j];// 上下判断if (isWin == false) {while (j > -1) {if (search[i][j] == judgewho) {h++;j--;if (h == 5) {System.out.println(judgewho + "..上下赢了!");isWin = true;return judgewho;}} else {break;}}j = pointy + 1;while (j > -1 && j < 15) {if (search[i][j] == judgewho) {h++;j++;if (h == 5) {isWin = true;System.out.println(judgewho + "..上下赢了!");return judgewho;}} else {break;}}i = pointx;j = pointy;h = 0;}// 左右判断if (isWin == false) {while (i > -1) {if (search[i][j] == judgewho) {h++;i--;if (h == 5) {System.out.println(judgewho + "..左右赢了!");return judgewho;}} else {break;}}i = pointx + 1;while (i > -1 && i < 15) {if (search[i][j] == judgewho) {h++;i++;if (h == 5) {System.out.println(judgewho + "..左右赢了!");return judgewho;}} else {break;}}i = pointx;j = pointy;h = 0;}// 判断左斜if (isWin == false) {while (i > -1 && j > -1) {if (search[i][j] == judgewho) {h++;i--;j--;if (h == 5) {System.out.println(judgewho + "..左斜赢了!");return judgewho;}} else {break;}}i = pointx + 1;j = pointy + 1;while (j < 15 && i < 15) {if (search[i][j] == judgewho) {h++;i++;j++;if (h == 5) {System.out.println(judgewho + "..左斜赢了!");return judgewho;}} elsebreak;}i = pointx;j = pointy;h = 0;}// 判断右斜if (isWin == false) {while (i > -1 && j < 15 & i < 15 & j > -1) {if (search[i][j] == judgewho) {h++;i++;j--;if (h == 5) {System.out.println("..... 右斜赢了");return judgewho;}} else {break;}}i = pointx - 1;j = pointy + 1;while (i < 15 && j > -1 && i > -1 && j < 15) {if (search[i][j] == judgewho) {h++;i--;j++;if (h == 5) {System.out.println("..... 右斜赢了");return judgewho;}} else {break;}}i = pointx;j = pointy;h = 0;}}return 0;}


只要写出了上下判断,基本上就是比葫芦画瓢了,需要的参数是棋盘状态和当前落子点。 

               这个就是一个段落了,然后就是人机对战了,确实是第一次遇到AI,所以期间也遇到了许多的问题,首先是博弈树,MAX-MIN问题,其次就是Alpha-beta算法,其实理解了MAX-MIN也就基本上能写出目前五子棋的AI了,在这个过程中,我也第一次看到了计算机的局限性,确实,计算机很强大,但是计算机业很弱。有关人机对战的问题会另写一篇来仔细描述。

原创粉丝点击