五子棋(一)

 最近一直想写一个五子棋程序,思路已经初步成熟。 可是一向用SDK写GUI的我这次想用 MFC 着实的有点摸不到头脑。
以前都是用面向过程的思路去写程序,虽然也是模块化结构化,可是与面向对象的思路还是大相径庭。
这次改用VC6.0写五子棋,是在不知从何入手。并且学习VC半个月而已,很多地方都不熟悉。
于是我在网上找了几个五子棋的代码想参考一下, 其中有一个 王**(这里是真名我还不能写出来,因为联系不到他,等得到他的同一我会把名字写出来的) 写的五子棋代码还可以。里面涉及的知识面很广
很适合初学者学习,看完一遍代码等于学了半个VC。 玩了几次他写的五子棋,发现BUG一堆。大大小小的BUG充斥这整个程序,已经严重的导致游戏正常的运行,让人玩起来很不爽。我想联系作者,可是找了很久也没有找到作者的联系方法。
这一点我很佩服他,因为一般人写了代码不开源也要留个联系方式使劲显摆,可他都开源了却没有留下任何联系方式。
不过在这里我还是要谢谢 王** 你的代码对我很有用里面MFC SDK用的虽然比较混乱,但是磨练了我的意志。
后来一想既然自己的五子棋无从入手那就先从改他的这个五子棋开始吧,他的这个五子棋核心代码很混乱,思路上缺陷很多,语句写的不够严密。我想要改好这个 基本等于从写一次核心算法没区别了。
首先要修改的就是程序里面的over函数了(对了他的代码也是面向过程的思路写的),一个判断五子连珠游戏是否结束的函数。下面我给出这个函数的实现:
  1. void CMy7_1View::over(CPoint point) 
  2. //获取鼠标指向数组位置 
  3. int x=(point.x-30)/20; 
  4. int y=(point.y-30)/20; 
  5. //计算开始判断的坐标 xx,yy 
  6. int xx,yy; 
  7. if(x<4) 
  8. xx=0; 
  9. else 
  10. xx=x-4; 
  11. if(y<4) 
  12. yy=0; 
  13. else 
  14. yy=y-4; 
  15. int i,j,a; 
  16. //横向判断 
  17. for(i=xx;i<15;i++) 
  18. a=0; 
  19. for(j=i;j<i+5;j++) 
  20. a=a+wzq[j][y]; 
  21. //五个都是白棋 
  22. if(a==5) 
  23. AfxMessageBox("白棋胜!"); 
  24. //重新开始 
  25. //不是联机游戏 
  26. if(play==1) 
  27. OnStart(); 
  28. return
  29. //联机游戏 
  30. else 
  31. //停止计时器 
  32. KillTimer(1); 
  33. //重新开始 
  34. OnNet2(); 
  35. //返回 
  36. return
  37. //五个都是黑棋 
  38. if(a==-5) 
  39. AfxMessageBox("黑棋胜!"); 
  40. if(play==1) 
  41. OnStart(); 
  42. return
  43. else 
  44. KillTimer(1); 
  45. OnNet2(); 
  46. return
  47. //竖向判断 
  48. for(i=yy;i<15;i++) 
  49. a=0; 
  50. for(j=i;j<i+5;j++) 
  51. a=a+wzq[x][j]; 
  52. if(a==5) 
  53. AfxMessageBox("白棋胜!"); 
  54. if(play==1) 
  55. OnStart(); 
  56. return
  57. else 
  58. KillTimer(1); 
  59. OnNet2(); 
  60. return
  61. if(a==-5) 
  62. AfxMessageBox("黑棋胜!"); 
  63. if(play==1) 
  64. OnStart(); 
  65. return
  66. else 
  67. KillTimer(1); 
  68. OnNet2(); 
  69. return
  70. //向右下角 
  71. //判断起点位置 
  72. if(x<y) 
  73. if(xx==0) 
  74. yy=y-x; 
  75. else 
  76. if(yy==0) 
  77. xx=x-y; 
  78. //参数over=1时退出循环 
  79. int over=0; 
  80. do 
  81. a=0; 
  82. for(i=0;i<5;i++) 
  83. if((xx+i)<19||(yy+i)<19) 
  84. //错误就在这里 这里是判断边界的 应该用逻辑与 而作者用的是逻辑或 我想可能是作者的疏忽 
  85. //但是这个一个符号的错误就造成了 数组的下标越界 后果很严重 应该改成 if((xx+i)<19&&(yy+i)<19) 
  86. //因为这个错误我玩的时候 经常遇到没下几个子突然就赢了 赢的我莫名其妙的。。。。。 
  87. //还好这个程序是开源的 有错误可以找出来 下面还有 向左下角判断的 也有这个错误 我就不指出了 
  88. { a=a+wzq[xx+i][yy+i]; 
  89. if(a==5) 
  90. AfxMessageBox("白棋胜!"); 
  91. if(play==1) 
  92. OnStart(); 
  93. return
  94. else 
  95. KillTimer(1); 
  96. OnNet2(); 
  97. return
  98. if(a==-5) 
  99. AfxMessageBox("黑棋胜!"); 
  100. if(play==1) 
  101. OnStart(); 
  102. return
  103. else 
  104. KillTimer(1); 
  105. OnNet2(); 
  106. return
  107. //到了边界 
  108. else 
  109. over=1; 
  110. xx+=1; 
  111. yy+=1; 
  112. }while(over==0); 
  113. //向左下角 
  114. if(y>(18-x)) 
  115. if(x>13) 
  116. yy=y-(18-x); 
  117. xx=18; 
  118. else 
  119. yy=y-4; 
  120. xx=x+4; 
  121. else 
  122. if(y<5) 
  123. xx=x+y; 
  124. yy=0; 
  125. else 
  126. yy=y-4; 
  127. xx=x+4; 
  128. over=0; 
  129. do 
  130. a=0; 
  131. for(i=0;i<5;i++) 
  132. if((xx-i)>=0||(yy+i)<19) 
  133. a=a+wzq[xx-i][yy+i]; 
  134. if(a==5) 
  135. AfxMessageBox("白棋胜!"); 
  136. if(play==1) 
  137. KillTimer(1); 
  138. OnStart(); 
  139. return
  140. else 
  141. OnNet2(); 
  142. return
  143. if(a==-5) 
  144. AfxMessageBox("黑棋胜!"); 
  145. if(play==1) 
  146. OnStart(); 
  147. return
  148. else 
  149. KillTimer(1); 
  150. OnNet2(); 
  151. return
  152. //到了边界 
  153. else 
  154. over=1; 
  155. xx-=1; 
  156. yy+=1; 
  157. }while(over==0); 
  158. }

 

 

虽然是个极小的错误可是后果很严重 会造成数组下标越界 结果无法想象。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值