C语言简单实现三子棋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 3
#define COLS 3
void menu()//菜单函数,输出可供选择的菜单
{
printf("**************************\n");
printf("***** 1.PLAY 0.EXIT *****\n");
printf("**************************\n");
}
void init_board(char arr[ROWS][COLS], int x, int y)//初始化函数
{
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
arr[i][j] = ' ';//将一个二维数组全部初始化成空格
}
}
}
void display_board(char arr[ROWS][COLS])//显示棋盘函数
{
int i = 0;
for (i = 0; i < ROWS; i++)
{
if (i < 2)//在前两行输出下方的棋盘
{
printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
printf("---|---|---\n");
}
else
{
printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
}
}
}
void player_move(char arr[ROWS][COLS])//玩家的下棋函数
{
int i = 0;
int j = 0;
printf("请输入坐标:\n");
while (1)
{
scanf("%d%d", &i, &j);
if ((i >= 1 && i <= ROWS) && (j >= 1 && j <= ROWS))
//判断坐标输入的正确性
{
i--; j--;
}
if (arr[i][j] == ' ')
{
arr[i][j] = 'x';
break;
}
else//如果输入错误,则一直循环,直到输入正确
{
printf("请重新输入坐标:");
}
}
}
int full(char arr[ROWS][COLS])//检查棋盘是否输入满
{
int i = 0; int j = 0;
int count = 0;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
if (arr[i][j] != ' ')
{
count++;
}
}
}
return count;
}
void com_move(char arr[ROWS][COLS])//电脑行走函数
{
int a = 0, b = 0;
while (1)
{
a = rand() % 3;//对a去一个[0,2]的随机数
b = rand() % 3;//对b去一个[0,2]的随机数
if (arr[a][b] == ' ')//如果期盼中这个位置没有下过的棋
{
arr[a][b] = 'c';
break;
}
}
}
int check_win(char arr[ROWS][COLS], int c)//判断输赢函数,将之前判满函数的返回值传入
{
int i = 0; int j;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS;j++)
if ((arr[i][0] == 'x' && arr[i][1] == 'x' && arr[i][2] == 'x'&& arr[i][1] != ' ') || (arr[0][2] == 'x' && arr[1][1] == 'x' && arr[3][1] == 'x'&& arr[1][1] != ' ') || (arr[0][0] == 'x' && arr[1][1] == 'x' && arr[2][2] == 'x'&&arr[1][1] != ' '))
return 1;
else if (arr[0][j] == 'x' && arr[1][j] == 'x'&& arr[2][j] == 'x' &&arr[1][j] != ' ')
return 1;
}
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
if ((arr[i][0] == 'c' && arr[i][1] == 'c' && arr[i][2] == 'c'&& arr[i][1] != ' ') || (arr[0][2] == 'c' && arr[1][1] == 'c' && arr[3][1] == 'c'&& arr[1][1] != ' ') || (arr[0][0] == 'c' && arr[1][1] == 'c' && arr[2][2] == 'x'&&arr[1][1] != ' '))
return 2;
else if (arr[0][j] == 'c' && arr[1][j] == 'c'&& arr[2][j] == 'c' &&arr[1][j] != ' ')
return 2;
}
if (full == 9)
return 'q';
return ' ';
}
void game()
{
char board[ROWS][COLS];//创建一个符合条件的二维数组
int i = 0;
int j = 0;
int m = 0;
int ret = 0;
init_board(board, ROWS, COLS);//初始化这个二维数组
display_board(board);//显示一次初始化好的棋盘
while (1)
{
player_move(board);//玩家走
printf("\n");
display_board(board);//玩家走完,显示一次棋盘
ret = full(board);//判棋盘是否已满,传回参数给ret
m = check_win(board, ret);//判数赢
if (m == 1)//返回1,玩家赢
{
printf("你赢了!\n\n");
break;
}
else
{
if (ret == 9)
{
printf("平局\n");
break;//跳出循环
}
else
{
printf("电脑下:\n\n");
srand((unsigned)time(NULL));//随机数需要的一个条件
com_move(board);//电脑走
m = check_win(board, ret);//判数赢
display_board(board);
if (m == 2)
{
printf("你输了!\n\n");
break;
}
else if (ret)
{
if (ret == 9)
{
printf("平局\n");
break;//跳出循环
}
}
else
continue;
}
}
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择->:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
exit(0);
default:
break;
}
} while (input);
system("pause");
return 0;
}