#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//判断棋盘满否,返回1表示棋盘满,0返回没满
int IsFull(char board[ROW][COL],int row,int col){
int i=0;
int j=0;
for(i=0;i<row;i++){
for(j=0;i<col;j++){
if(board[i][j]==' '){
return 0 ;
}
else if(board[i][j]!=' '){
}
}
}
return 1;
}
//判断输赢
char Iswin(char board[ROW][COL],int row, int col){
int i =0;
for(i=0;i<row;i++){
//横
if(board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][0];
}
}
for(i=0;i<col;i++){
//列
if(board[0][i]==board[1][i]&&board[0][i]==board[2][i]&&board[0][i]!=' ')
{
return board[0][i];
}
}
//判断斜线
if(board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[1][1]!=' ')
{return board[0][0];
}
if(board[2][0]==board[1][1]&&board[2][0]==board[0][2]&&board[2][0]!=' '){
return board[2][0];
}
//判断平局
if(IsFull(board,ROW,COL)==1){
return 'q';
}
return 'c';
}
//电脑下棋
void ComputerMove(char board[ROW][COL],int row,int col){
int x =0;
int y =0;
printf("电脑走\n");
while(1){
x =rand()%row;
y =rand()%col;
if(board[x][y]==' '){
board[x][y]='#';
break;
}
}
}
//玩家下棋
void PlayerMove(char board[ROW][COL],int row,int col){
int x =0;
int y =0;
printf("玩家走:\n");
while(1){
printf("请输入要下的坐标:");
scanf("%d%d",&x,&y);
//判断坐标合法性
if(x>=1&&x<=row && y>=1&&y<=col){
if(board[x-1][y-1]==' '){
board[x-1][y-1]='*';
break;
}
else{
printf("该坐标已经有棋子");
}
}
else{
printf("非法坐标,重新输入\n");
}
}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row, int col){
int i =0;
for(i =0;i<row;i++){
int j =0;
for(j=0;j<col;j++){
printf(" %c ",board[i][j]);
if(j<col)
printf("|");
}
printf("\n");
if(i<row-1){
for(j=0;j<col;j++){
printf("---");
if(j<col)
printf("|");
}
printf("\n");
}
}
}
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
//游戏主题
void game() {
char board[ROW][COL] = {0};
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
while(1){
//玩家下棋
PlayerMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断玩家是否赢
char ret;
Iswin(board,ROW,COL);//Iswin告诉 电脑赢-# 玩家赢-* 平局 继续-C
ret=Iswin(board,ROW,COL);
if(ret=='c'){
}
if(ret=='*'){
printf("玩家赢\n");
break;
}
else if(ret=='#'){
printf("电脑赢\n");
break;
}
else if(ret=='q')
{
printf("平局\n");
break;
}
//电脑下棋
ComputerMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
//判断电脑是否赢
Iswin(board,ROW,COL);//Iswin告诉 电脑赢-# 玩家赢-* 平局 继续-C
ret=Iswin(board,ROW,COL);
if(ret=='c'){
}
if(ret=='*'){
printf("玩家赢\n");
break;
}
else if(ret=='#'){
printf("电脑赢\n");
break;
}
else if(ret=='q')
{
printf("平局\n");
break;
}
}
}
//菜单
void menu () {
printf("_____________________________\n");
printf("____输入1 play 输入0 out____\n");
printf("_____________________________\n");
}
void test() {
int input;
srand((unsigned int) time(NULL));
scanf("%d", &input);
do {
switch (input) {
case 1:
printf("__________开始游戏__________\n");
game();
break;
case 0:
printf("__________退出game__________\n");
break;
default:
printf("__________输入有误__________\n");
break;
}
} while (input != 1 && input != 0);
}
int main() {
menu();
test();
return 0;
}