井字旗C语言程序:
运行环境:Turbo C/C++for Windows集成实验与学习环境或VC++6.0
#define MAX 3
#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 //真
#include
#include"malloc.h"
//记彔一步棋所需的所有信息:行数,列数,判断值
typedef struct
{
int column;
int row;
int val;
}Nodes;
int board[MAX][MAX];
//InitBoard初始化棋盘
Status InitBoard()
{
int row,column;
for(row=0; row for(column=0; 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 for(j=0;j { if(board[i][j] ==2) return FALSE; } return TRUE; } //IsWin判断是否有一方己经胜利 Status IsWin( int side ) { int row, column; //判断一行 for( row = 0; row < MAX; row++ ) { for( column = 0; column < MAX; column++ ) if( board[ row ][ column ] != side ) break; if( column >= MAX ) return TRUE; } //判断一列 for( column = 0; column < MAX; column++ ) { for( row = 0; row < MAX; row++ ) if( board[ row ][ column ] != side ) break; if( row >= MAX ) 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:(BoardIsF ull()?DRAW:PLAYING)); } //BestMovement判断最佳落子位置,采用递归,求出最佳位置 Nodes BestMovement(int side) { int opp;//对手 Nodes nodes, node2; //nodes记彔当前最佳位置,node2返回最佳位置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 for(column=0; column { Place(row, column, side); nodes = BestMovement(opp); Place(row,column,EMPTY); // 到更好的位置,更新信息 if( (side ==COMPUTER && nodes.val >value) || (side==HUMAN && nodes.val { value=nodes.val; bestRow=row; bestColumn=column; } } node2.row=bestRow; node2.column=bestColumn; node2.val=value; return node2; } //Print打印出当前棋盘状态 Status Print() { int row,column; for(row=0; row for(column=0; 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,opera; //first决定谁先下第一步棋。result记彔每下一步棋后的结果 while(TRUE) { while(TRUE) { printf("请选择你要进行的操作:\n"); printf("1:开局\n"); printf("2: 退出\n"); scanf("%d",&opera); if(opera==1) break; if(opera==2) return TRUE; printf("你的输入有误,请重新输入\n"); } 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) { while(TRUE) { printf("请输入你落子所在的行数,列数(格式:a,b(a,b 在0~2之间)):"); scanf("%d,%d",&a,&b); if(a>=0 && a break; printf("你输入的位置不合法,请重新输入:\n\n"); } Place(a,b,HUMAN); Print(); //下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; playNode=BestMovement(COMPUTER); Place( playNode.row, playNode.column, COMPUTER); printf("\n电脑落子后的棋盘为:\n"); Print(); ////下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; } } else if(first==1) { while(TRUE) { printf("\n电脑落子后棋盘状态为\n"); playNode = BestMovement(COMPUTER); Place( playNode.row, playNode.column,COMPUTER); Print(); //下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; while(TRUE) { printf("请输入你落子所在的行数,列数(格式:a,b(a,b 在0~2之间)):"); scanf("%d,%d",&a,&b); if(a>=0 && a break; printf("你输入的位置不合法,请重新输入:\n\n"); } Place(a,b, HUMAN); Print(); //下一步棋后打印出棋盘状态,并判断是否结束,如结束,则跳出 if( (result=PostionValue()) != PLAYING) break; } } if(result==COMPUTER_WIN) printf("哈哈,你输了!\n\n"); else if(result == HUMAN_WIN) printf("恭喜,你赢了!\n\n"); else printf("平局!\n\n"); } return 0; } 英文版本 运行环境:Turbo C 或Turbo C/C++for Windows集成实验与学习环境或VC++6.0或Turbo C2.0英文版等。。。。。。 #include"stdio.h" #include"malloc.h" #define SIZE 3 #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define NONE 0 #define PLAYER_A 1 #define PLAYER_B 2 #define WARNNING 255 #define COMPETITOR 200 #define WINNER -1 char chessboard[SIZE][SIZE]; struct CHESS_MAN { int row; int col; }; /*get the value of current chess board: count and retrun how many ways the player can win the game*/ int get_value(int player) { int i,j,ret=0; int row,col,inc; int bNONE=FALSE; /*check the row*/ for(i=0;i { row=SIZE; bNONE=FALSE; for(j=0;j { /*if there is a competitor's chess man at the location sub row*/ if(chessboard[i][j]==player) row--; /*if there is any empty location in the row, set bNONE as TRUE*/ if(chessboard[i][j]==NONE) bNONE=TRUE; } /*computer : one empty and others are competitor's chess man, oh my god, danger, you may lose the game*/ if(row==1&&bNONE==TRUE) return WARNNING; /*computer : no competitor's chess man in the row, there is one way to make me win the game*/ else if(row==SIZE) ret++; } /*check the col*/ for(i=0;i { col=SIZE; bNONE=FALSE; for(j=0;j { if(chessboard[j][i]==player) col--;