连珠五子棋的编程与制作(编辑修改稿)内容摘要:

flag++。 break。 } } n=weight(value,flag)。 if(weightBoard[i][j]n){ weightBoard[i][j]=n。 } } // 左下到右上方向 for(i=RectX2,j=RectY1。 i=RectX1。 i,j++){ if([i][j]!=0){ continue。 } value=0。 flag=0。 for(k=1。 i+k=RectX2 amp。 amp。 k5。 k++){ if([i+k][jk]==tcolor){ value++。 continue。 } if([i+k][jk]==0){ flag++。 break。 } } for(k=1。 ik=RectX1 amp。 amp。 k5。 k++){ if([ik][j+k]==tcolor){ value++。 } if([ik][j+k]==0){ flag++。 break。 } } n=weight(value,flag)。 if(weightBoard[i][j]n){ weightBoard[i][j]=n。 } } } /** * 返回棋子的权重 */ 连珠五子棋的编程与制作 共 31 页,第 13 页 private int weight(int count, int flag) { int weight=0。 switch(count){ case 0:{ if(flag0) weight=200。 else weight=0。 break。 } case 1:{ if(flag0) weight=1000。 else weight=0。 break。 } case 2:{ if(flag0) weight=5000。 else weight=0。 break。 } case 3:{ if(flag0) weight=8000。 else weight=0。 break。 } case 4:{ if(flag0) weight=10000。 else weight=0。 break。 } } return weight。 } /** * 在棋盘中找到最优的位置 */ private void getBetter(int count){ int [][] better = new int [count][2]。 int [][] tempArray = new int [15][15]。 for(int i=0。 i15。 i++){ for(int j=0。 j15。 j++){ tempArray[i][j]=weightBoard[i][j]。 } } for(int i=0。 icount。 i++){ 连珠五子棋的编程与制作 共 31 页,第 14 页 getBiggest(tempArray,better[i][0],better[i][1])。 } bestX=better[0][0]。 bestY=better[0][1]。 } /** *得到权重最大值 */ private void getBiggest(int [][] arr,int x,int y){ int [] temp=new int[2]。 int swt=arr[0][0],tmp=0。 for(int i=0。 i15。 i++){ for(int j=0。 j15。 j++){ if(arr[i][j]swt){ temp[0]=i。 temp[1]=j。 swt=arr[i][j]。 } } } x=temp[0]。 y=temp[1]。 arr[x][y]=0。 } } 、人工智能模块 有了上面填写的两张棋型表,现在要做的就是让电脑知道在哪一点下子。 其中最简单的方法就是便利棋型表 Computer[15][15][4]和 Player[15][15][4],找出其中数值最大的一点,在该点下子即可。 但是这种算法的弱点非常明显,只顾眼前的利益,不能顾全大局。 为了解决这个问题这里引入了“今后几步预测法”具体方法是这样的。 让电脑分析一个可能的弱点,如果在某个位置下子将会形成对手不得不防守的棋型(例如:“冲四”、“活三”):那么下一步对手就必须照你的思路下子防守,如此便完成了第一步的预测。 重新调用棋型表填写算法对预测后的棋进行盘面分析,如果出现了“四三”、“双三”或“双四”等制胜点,那么己方就可以获胜了;否则按照同样的方法向下分析,就可以预测出第二步、 第三步等。 但是要是盘面上没有没有对手防的棋型,那该怎么办呢。 进攻不成不成就得考虑防守,将自己和对手调换位置,然后用上面的方法来预测对手的棋。 这样既可以防守住对方巧妙地攻击,又能待机发动反击。 具体代码 : Analyse(int chessc[][]){ int i, j。 连珠五子棋的编程与制作 共 31 页,第 15 页 chessBoard = new int[17][17]。 for (i = 0。 i = 16。 i++) { for (j = 0。 j = 16。 j++) { if (i == 0 || j == 0 || i == 16 || j == 16) { chessBoard[i][j] = 4。 } else { chessBoard[i][j] = chessc[i 1][j 1]。 } } } } private long pow(int base, int pow){ int i。 long result=1。 for(i=1。 i=pow。 i++){ result*=base。 } return result。 } /** *判断上下位置 */ private long analyseUd(int x, int y, int side){ int tt[][] = new int[17][17]。 int i, j。 int tempx, tempy。 long mark = 0。 int base = BASE。 int uppersign = 0。 int downsign = 0。 int c_count = 1。 for (i = 0。 i 17。 i++) { for (j = 0。 j 17。 j++) { tt[i][j] = chessBoard[i][j]。 } } tt[y][x] = side。 tempx = x。 tempy = y。 if (tt[tempy 1][tempx] != side) { if (tt[tempy 1][tempx] == 0) { uppersign = 1。 } 连珠五子棋的编程与制作 共 31 页,第 16 页 if (tt[tempy 1][tempx] != 0) { uppersign = 0。 } } else { tempy = 1。 while (tt[tempy][tempx] == side) { c_count += 1。 tempy。 } if (tt[tempy][tempx] == 0) { uppersign = 1。 } if (tt[tempy][tempx] != 0) { uppersign = 0。 } } tempx = x。 tempy = y。 if (tt[tempy + 1][tempx] != side) { if (tt[tempy + 1][tempx] == 0) { downsign = 1。 } if (tt[tempy + 1][tempx] != 0) { downsign = 0。 } } else { tempy += 1。 while (tt[tempy][tempx] == side) { c_count += 1。 tempy++。 } if (tt[tempy][tempx] == 0) { downsign = 1。 } if (tt[tempy][tempx] != 0) { downsign = 0。 } } mark += pow(base, c_count)。 if ( (upp。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。