文档库 最新最全的文档下载
当前位置:文档库 › C语言编写的井字棋

C语言编写的井字棋

C语言编写的井字棋
C语言编写的井字棋

井字旗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=0 && b<=MAX && PositionIsEmpty(a,b))

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=0 && b<=MAX && PositionIsEmpty(a,b))

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--;

相关文档