#ifndef __GAME_H_//防止文件被多次调用
#define __GAME_H_
#define ROWS 3
#define CLOWS 3//棋盘的纵坐标
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<string.h>
void game();
void init_board(char board[ROWS][CLOWS],int row,int clow);//初始化棋盘
void display(char board[ROWS][CLOWS],int row,int clow);//显示棋盘void player_move(char board[ROWS][CLOWS],int row,int clow);
void computer_move(char board[ROWS][CLOWS],int row,int clow);
char is_win(char board[ROWS][CLOWS],int row,int clow);
#endif
void init_board(char board[ROWS][CLOWS],int row,int clow)
{
memset(board,' ',ROWS*CLOWS*sizeof(board[0][0]));
}
void display(char board[ROWS][CLOWS],int row,int clow)
{
int i=0;
for(i=0;i<row;i++)
{
printf("__%c__|__%c__|__%c__\n",board[i][0],board[i][1],board[i][2]);
if(i<row-1)
printf(" | | \n");
}
}
void player_move(char board[ROWS][CLOWS],int row,int clow)
{
int x=0,y=0;
while(1)
{
printf("请输入坐标->");
scanf("%d%d",&x,&y);
if((x>0&&x<=row)&&(y>0&&y<=clow))
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='X';
break;
}
else
{
printf("此坐标已被占用\n");
}
}
else
printf("输入的坐标有误\n");
}
}
static int is_full(char board[ROWS][CLOWS],int row,int clow)//判断棋盘是否下满
{
int i=0,j=0;
for(i=0;i<row;i++)
{
for(j=0;j<clow;j++)
{
if(board[i][j]==' ')
return 0;
}
}
return 1;
}
char is_win(char board[ROWS][CLOWS],int row,int clow)
{
int i=0;
for(i=0;i<row;i++)
{
if((board[i][0]==board[i][1])&&(board[i][1]==board[i][2])&&board[i][0]!=' ')
return board[i][0];
}
for(i=0;i<clow;i++)
{
if((board[0][i]==board[1][i])&&(board[1][i]==board[2][i])&&board[0][i]!=' ')
return board[i][0];
}
if((board[0][0]==board[1][1])&&(board[1][1]==board[2][2])&&(board[1][1]!=' '))
{
return board[0][0];
}
else if((board[0][2]==board[1][1])&&(board[1][1]==board[2][0])&&(board[1][1]!=' '))
{
return board[0][2];
}
if(is_full(board,ROWS,CLOWS))
return 'q';
if(is_full(board,ROWS,CLOWS)==0)
return ' ';
}
void computer_move(char board[ROWS][CLOWS],int row,int clow)
{
printf("电脑下\n");
while(1)
{
int x=rand()%3;
int y=rand()%3;
if(board[x][y]==' ')
{
board[x][y]='$';
break;
}
}
}
void game()
{
char ret=0;
char board[ROWS][CLOWS]={0};
init_board(board,ROWS,CLOWS);
display(board,ROWS,CLOWS);
while(1)
{
player_move(board,ROWS,CLOWS);
if((ret=is_win(board,ROWS,CLOWS))!=' ')
break;
display(board,ROWS,CLOWS);
computer_move(board,ROWS,CLOWS);
if((ret=is_win(board,ROWS,CLOWS))!=' ')
break;
display(board,ROWS,CLOWS);
}
if(ret=='X')
{
printf("玩家赢!\n");
display(board,ROWS,CLOWS);
}
else if(ret=='$')
{
printf("电脑赢!\n");
display(board,ROWS,CLOWS);
}
else
{
printf("平局!\n");
display(board,ROWS,CLOWS);//打印棋盘
}
}
void menu()//菜单
{
printf("*****************************************\n");
printf("*****1.PLAY 0.EXIT**********************\n");
printf("*****************************************\n");
}
void test()
{
int input=0;//选择
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择: ");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
break;
default :
printf("请输入1或0\n");
}
}
while(input);
}
int main()
{
test();//测试函数
return 0;
}