关于井字棋的问题求助
...下面是我写的关于井字棋的一个C程序,运行时在机器下棋的时候就出现了异常.望高手帮忙解答
#include <stdio.h> //#include "ConstNum.h" //头文件ConstNum.h,记录各常量值 #define Status int #define HUMAN_WIN 0 //人取得了胜利 #define DRAW 1 //平局 #define PLAYING 2 //没有决出胜负,正在进行游戏 #define COMPUTER_WIN 3 //电脑取得了胜利 #define HUMAN 0 //人 #define COMPUTER 1 //机器 #define EMPTY 2 //空 #define FALSE 0 //假 #define TRUE 1 //真 //记录一步棋所需的所有信息:行数,列数,判断值 typedef struct { int column; int row; int val; }Nodes; int board[3][3]; //InitBoard初始化棋盘 Status InitBoard() { int row,column; for(row=0; row<3; row++) for(column=0; column<3; column++) board[row][column]=EMPTY; return TRUE; } //PostionIsEmpty判断在棋盘上在给定的置是否为空 Status PositionIsEmpty(int row , int column) { if(board[row][column]==2) return TRUE; else return FALSE; } //Place在指定的地方落子 Status Place(int row,int column, int piece) { board[row][column]=piece; return TRUE; } //BoardIsFull判断棋盘是否己满 Status BoardIsFull() { int i=0,j=0; for(i=0;i<3;i++) for(j=0;j<3;j++) { if(board[i][j] ==2) return FALSE; } return TRUE; } //IsWin判断是否有一方己经胜利 Status IsWin( int side ) { int row, column; //判断一行 for( row = 0; row < 3; row++ ) { for( column = 0; column < 3; column++ ) if( board[ row ][ column ] != side ) break; if( column >= 3 ) return TRUE; } //判断一列 for( column = 0; column < 3; column++ ) { for( row = 0; row < 3; row++ ) if( board[ row ][ column ] != side ) break; if( row >= 3 ) return TRUE; } //判断主对角线 if( board[ 1 ][ 1 ] == side && board[ 2 ][ 2 ] == side && board[ 0 ][ 0 ] == side ) return TRUE; //判断副对角线 if( board[ 0 ][ 2 ] == side && board[ 1 ][ 1 ] == side && board[ 2 ][ 0 ] == side ) return TRUE; return FALSE; } //PositonValue返回落子后的状态 有四种状态在ConstNum.h中定义 COMPUTER_WIN, HUMAN_WIN, DRAW, PLAYING Status PostionValue() { return IsWin(COMPUTER)?COMPUTER_WIN:(IsWin(HUMAN)?HUMAN_WIN:(BoardIsFull()?DRAW:PLAYING)); } //BestMovement判断最佳落子位置,采用递归 ,求出最佳位置 /*Nodes * BestMovement(int side) { int opp;//对手 Nodes * nodes, * node2; //nodes记录当前最佳位置,nodes返回最佳位置 int simpleEval; //记当中间结果 int bestRow=0, row; int bestColumn=0, column; int value; //判断是否游戏己经结束 if( (simpleEval=PostionValue()) != PLAYING) { node2->row=0; node2->column=0; node2->val=simpleEval; return node2; } if(side==COMPUTER) { opp=HUMAN; value=HUMAN_WIN; } else { opp=COMPUTER; value=COMPUTER_WIN; } for(row=0; row<3; row++) for(column=0; column<3; column++) if(PositionIsEmpty(row, column) ) { Place(row, column, side); nodes = BestMovement(opp); Place(row,column,EMPTY); / 到更好的位置,更新信息 if( (side ==COMPUTER && nodes->val > value) || (side==HUMAN && nodes->val < value) ) { value=nodes->val; bestRow=row; bestColumn=column; } } node2->row=bestRow; node2->column=bestColumn; node2->val=value; return node2; }*/ Nodes * BestMovement( int side, int alpha, int beta, int depth ) { int opp; // The other side Nodes nodes, node2; // Opponent’s best reply int dc; // Placeholder int simpleEval; // Result of an immediate evaluation Position thisPosition = new Position( board ); int tableDepth = 5; // Max depth placed in Trans. table int bestRow = 0,row; int bestColumn = 0, column; int value; if( ( simpleEval = positionValue( ) ) != UNCLEAR ) { node2->row=0; node2->column=0; node2->val=simpleEval; return node2; } if( depth == 0 ) transpositions.clear( ); else if( depth >= 3 && depth <= tableDepth ) { Integer lookupVal = transpositions.get( thisPosition ); if( lookupVal != null ) return new Best( lookupVal ); } if( side == COMPUTER ) { opp = HUMAN; value = alpha; } else { opp = COMPUTER; value = beta; } Outer: for(row = 0; row < 3; row++ ) for(column = 0; column < 3; column++ ) if( squareIsEmpty( row, column ) ) { place( row, column, side ); reply = chooseMove( opp, alpha, beta, depth + 1 ); place( row, column, EMPTY ); if( side == COMPUTER && reply.val > value || side == HUMAN && reply.val < value ) { if( side == COMPUTER ) alpha = value = reply.val; else beta = value = reply.val; bestRow = row; bestColumn = column; if( alpha >= beta ) break Outer; // Refutation } } if( depth <= tableDepth ) transpositions.put( thisPosition, value ); return new Best( value, bestRow, bestColumn ); } //PlayhMove让指定方在指定位置落子,如果位置不正确,则返回FALSE,否则返回TURE Status PlayMove( int side, int row, int column ) { if( row < 0 || row >= 3 || column < 0 || column >= 3 || board[ row ][ column ] != EMPTY ) return FALSE; board[ row ][ column ] = side; return TRUE; } //Print打印出当前棋盘状态 Status Print() { int row,column; for(row=0; row<3; row++) for(column=0; column<3; column++) { if(board[row][column]==2) printf("@ "); else if(board[row][column]==1) printf("X "); else printf("O "); if((column!=0) && (column%2 ==0)) printf("\n"); } return TRUE; } int main(void) { Nodes * playNode; int first,a, b, result; //first决定谁先下第一步棋。result记录每下一步棋后的结果 InitBoard(); while(TRUE) { printf("请决定人机对战时谁先走第一步?0:人 1:电脑"); scanf("%d",&first); if(first==0 || first ==1) { break; } printf("输入错误,请重新选择\n\n"); } printf("人的棋子为O,电脑的棋子X,空位用@表示\n"); if(first==0) { while(TRUE){ printf("请输入你落子所在的行数,列数(格式:a,b(0~2)):"); scanf("%d,%d",&a,&b); PlayMove(HUMAN,a,b); Print(); //下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; playNode=BestMovement(COMPUTER); PlayMove(COMPUTER, playNode->row, playNode->column); Print(); //下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; } } else if(first==1) { while(TRUE) { playNode = BestMovement(COMPUTER); PlayMove(COMPUTER, playNode->row, playNode->column); Print(); //下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; printf("请输入你落子所在的行数,列数(格式:a,b(a,b在0~2之间)):"); scanf("%d,%d",&a,&b); PlayMove(HUMAN,a,b); Print(); //下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; } } if(result==COMPUTER_WIN) printf("哈哈,你输了!"); else if(result == HUMAN_WIN) printf("恭喜,你赢了!"); else printf("平局!"); return 0; }
注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1199017562984.html
如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:)