最近一直想写一个五子棋程序,思路已经初步成熟。 可是一向用SDK写GUI的我这次想用 MFC 着实的有点摸不到头脑。
以前都是用面向过程的思路去写程序,虽然也是模块化结构化,可是与面向对象的思路还是大相径庭。
这次改用VC6.0写五子棋,是在不知从何入手。并且学习VC半个月而已,很多地方都不熟悉。
于是我在网上找了几个五子棋的代码想参考一下, 其中有一个 王**(这里是真名我还不能写出来,因为联系不到他,等得到他的同一我会把名字写出来的) 写的五子棋代码还可以。里面涉及的知识面很广
很适合初学者学习,看完一遍代码等于学了半个VC。 玩了几次他写的五子棋,发现BUG一堆。大大小小的BUG充斥这整个程序,已经严重的导致游戏正常的运行,让人玩起来很不爽。我想联系作者,可是找了很久也没有找到作者的联系方法。
这一点我很佩服他,因为一般人写了代码不开源也要留个联系方式使劲显摆,可他都开源了却没有留下任何联系方式。
不过在这里我还是要谢谢 王** 你的代码对我很有用里面MFC SDK用的虽然比较混乱,但是磨练了我的意志。
后来一想既然自己的五子棋无从入手那就先从改他的这个五子棋开始吧,他的这个五子棋核心代码很混乱,思路上缺陷很多,语句写的不够严密。我想要改好这个 基本等于从写一次核心算法没区别了。
首先要修改的就是程序里面的over函数了(对了他的代码也是面向过程的思路写的),一个判断五子连珠游戏是否结束的函数。下面我给出这个函数的实现:
以前都是用面向过程的思路去写程序,虽然也是模块化结构化,可是与面向对象的思路还是大相径庭。
这次改用VC6.0写五子棋,是在不知从何入手。并且学习VC半个月而已,很多地方都不熟悉。
于是我在网上找了几个五子棋的代码想参考一下, 其中有一个 王**(这里是真名我还不能写出来,因为联系不到他,等得到他的同一我会把名字写出来的) 写的五子棋代码还可以。里面涉及的知识面很广
很适合初学者学习,看完一遍代码等于学了半个VC。 玩了几次他写的五子棋,发现BUG一堆。大大小小的BUG充斥这整个程序,已经严重的导致游戏正常的运行,让人玩起来很不爽。我想联系作者,可是找了很久也没有找到作者的联系方法。
这一点我很佩服他,因为一般人写了代码不开源也要留个联系方式使劲显摆,可他都开源了却没有留下任何联系方式。
不过在这里我还是要谢谢 王** 你的代码对我很有用里面MFC SDK用的虽然比较混乱,但是磨练了我的意志。
后来一想既然自己的五子棋无从入手那就先从改他的这个五子棋开始吧,他的这个五子棋核心代码很混乱,思路上缺陷很多,语句写的不够严密。我想要改好这个 基本等于从写一次核心算法没区别了。
首先要修改的就是程序里面的over函数了(对了他的代码也是面向过程的思路写的),一个判断五子连珠游戏是否结束的函数。下面我给出这个函数的实现:
- void CMy7_1View::over(CPoint point)
- {
- //获取鼠标指向数组位置
- int x=(point.x-30)/20;
- int y=(point.y-30)/20;
- //计算开始判断的坐标 xx,yy
- int xx,yy;
- if(x<4)
- xx=0;
- else
- xx=x-4;
- if(y<4)
- yy=0;
- else
- yy=y-4;
- int i,j,a;
- //横向判断
- for(i=xx;i<15;i++)
- {
- a=0;
- for(j=i;j<i+5;j++)
- {
- a=a+wzq[j][y];
- //五个都是白棋
- if(a==5)
- {
- AfxMessageBox("白棋胜!");
- //重新开始
- //不是联机游戏
- if(play==1)
- {
- OnStart();
- return;
- }
- //联机游戏
- else
- {
- //停止计时器
- KillTimer(1);
- //重新开始
- OnNet2();
- //返回
- return;
- }
- }
- //五个都是黑棋
- if(a==-5)
- {
- AfxMessageBox("黑棋胜!");
- if(play==1)
- {
- OnStart();
- return;
- }
- else
- {
- KillTimer(1);
- OnNet2();
- return;
- }
- }
- }
- }
- //竖向判断
- for(i=yy;i<15;i++)
- {
- a=0;
- for(j=i;j<i+5;j++)
- {
- a=a+wzq[x][j];
- if(a==5)
- {
- AfxMessageBox("白棋胜!");
- if(play==1)
- {
- OnStart();
- return;
- }
- else
- {
- KillTimer(1);
- OnNet2();
- return;
- }
- }
- if(a==-5)
- {
- AfxMessageBox("黑棋胜!");
- if(play==1)
- {
- OnStart();
- return;
- }
- else
- {
- KillTimer(1);
- OnNet2();
- return;
- }
- }
- }
- }
- //向右下角
- //判断起点位置
- if(x<y)
- {
- if(xx==0)
- yy=y-x;
- }
- else
- {
- if(yy==0)
- xx=x-y;
- }
- //参数over=1时退出循环
- int over=0;
- do
- {
- a=0;
- for(i=0;i<5;i++)
- {
- if((xx+i)<19||(yy+i)<19)
- //错误就在这里 这里是判断边界的 应该用逻辑与 而作者用的是逻辑或 我想可能是作者的疏忽
- //但是这个一个符号的错误就造成了 数组的下标越界 后果很严重 应该改成 if((xx+i)<19&&(yy+i)<19)
- //因为这个错误我玩的时候 经常遇到没下几个子突然就赢了 赢的我莫名其妙的。。。。。
- //还好这个程序是开源的 有错误可以找出来 下面还有 向左下角判断的 也有这个错误 我就不指出了
- { a=a+wzq[xx+i][yy+i];
- if(a==5)
- {
- AfxMessageBox("白棋胜!");
- if(play==1)
- {
- OnStart();
- return;
- }
- else
- {
- KillTimer(1);
- OnNet2();
- return;
- }
- }
- if(a==-5)
- {
- AfxMessageBox("黑棋胜!");
- if(play==1)
- {
- OnStart();
- return;
- }
- else
- {
- KillTimer(1);
- OnNet2();
- return;
- }
- }
- }
- //到了边界
- else
- over=1;
- }
- xx+=1;
- yy+=1;
- }while(over==0);
- //向左下角
- if(y>(18-x))
- {
- if(x>13)
- {
- yy=y-(18-x);
- xx=18;
- }
- else
- {
- yy=y-4;
- xx=x+4;
- }
- }
- else
- {
- if(y<5)
- {
- xx=x+y;
- yy=0;
- }
- else
- {
- yy=y-4;
- xx=x+4;
- }
- }
- over=0;
- do
- {
- a=0;
- for(i=0;i<5;i++)
- {
- if((xx-i)>=0||(yy+i)<19)
- {
- a=a+wzq[xx-i][yy+i];
- if(a==5)
- {
- AfxMessageBox("白棋胜!");
- if(play==1)
- {
- KillTimer(1);
- OnStart();
- return;
- }
- else
- {
- OnNet2();
- return;
- }
- }
- if(a==-5)
- {
- AfxMessageBox("黑棋胜!");
- if(play==1)
- {
- OnStart();
- return;
- }
- else
- {
- KillTimer(1);
- OnNet2();
- return;
- }
- }
- }
- //到了边界
- else
- over=1;
- }
- xx-=1;
- yy+=1;
- }while(over==0);
- }
虽然是个极小的错误可是后果很严重 会造成数组下标越界 结果无法想象。