写代码前要先写思维导图
代码如下:
头文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 5
#define COL 5
#define STA 3
//菜单
void menu();
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col);
//玩家下棋
int PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
int ComputerMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col, int x, int y);
//列方向的判断
char Arrange(char board[ROW][COL], int row, int col, int x, int y);
//行的判断
char Line(char board[ROW][COL], int row, int col, int x, int y);
//对角线的判断
char Diagonal(char board[ROW][COL], int row, int col, int x, int y);
//反对角线的判断
char Back_Diagonal(char board[ROW][COL], int row, int col, int x, int y);
//是否满了
int IsFull(char board[ROW][COL], int row, int col);
源文件text.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//菜单
void menu()
{
printf("************************\n");
printf("****** 1,play *******\n");
printf("****** 0.exit *******\n");
printf("************************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
//初始化棋盘
InitBoard(board, ROW, COL);
//打印棋盘
PrintBoard(board, ROW, COL);
char sel = 0;
while (1)
{
//玩家下棋
sel = PlayerMove(board, ROW, COL);
//打印棋盘
PrintBoard(board, ROW, COL);
if (sel != 'C')
{
break;
}
//电脑下棋
sel = ComputerMove(board, ROW, COL);
//打印棋盘
PrintBoard(board, ROW, COL);
if (sel != 'C')
{
break;
}
}
if (sel == '*')
printf("玩家赢了\n");
else if (sel == '#')
printf("电脑赢了\n");
else
printf("平局\n");
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("已退出!\n");
break;
default:
printf("输入错误!请重新输入:\n");
break;
}
} while (input);
return 0;
}
源文件game.h:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化棋盘
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void PrintBoard(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++)
{
if (0 == i)
{
printf(" %d ", j);
}
else if (i != 0 && j == 0)
printf(" %d ", i);
else
printf(" %c ", board[i][j]);
}
printf("\n");
}*/
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (0 == i && j != col-1)
{
printf(" %d ", j);
if (j < col - 2)
printf("|");
}
else if (i != 0 && j == 0 && i != row - 1)
{
printf(" %d ", i);
if (j < col - 2)
printf("|");
}
else if (i == row - 1 || j == col - 1)
printf(" ");
else
{
printf(" %c ", board[i][j]);
if (j < col - 2)
printf("|");
}
}
printf("\n");
if (i < row -1)
{
for (j = 0; j < col - 1; j++)
{
printf("---");
if (j < col - 2)
printf("|");
}
}
printf("\n");
}
}
//玩家下棋
int PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请玩家输入坐标下棋,用空格隔开:\n");
scanf("%d %d", &x, &y);
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
printf("输入非法!请重新输入:\n");
}
char rec = IsWin(board, ROW, COL, x, y);
if (rec == '*')
return board[x][y];
}
//电脑下棋
int ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % (row - 1);
y = rand() % (col - 1);
if (x != 0 && y != 0 && board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
char rec = IsWin(board, ROW, COL, x, y);
if (rec == board[x][y])
return board[x][y];
}
//判断输赢
//玩家赢 '*'
//电脑赢 '#'
//平局 'Q'
//继续 'C'
char IsWin(char board[ROW][COL], int row, int col, int x, int y)
{
char temp = 0;
temp = Arrange(board, ROW, COL, x, y);
if (temp == board[x][y])
return board[x][y];
temp = Line(board, ROW, COL, x, y);
if (temp == board[x][y])
return board[x][y];
temp = Diagonal(board, ROW, COL, x, y);
if (temp == board[x][y])
return board[x][y];
temp = Back_Diagonal(board, ROW, COL, x, y);
if (temp == board[x][y])
return board[x][y];
if (IsFull(board, ROW, COL))
return 'Q';
return 'C';
}
//列的判断
char Arrange(char board[ROW][COL], int row, int col, int x, int y)
{
int cx = x;
int cy = y;
//两个边界值
int left = 0;
int right = 0;
//在同一直线的棋子数目
int count = 1;
//竖直方向的遍历
for (int i = 1; i < 10; i++)
{
if (left == 0)
{
if (board[cx - 1][cy] == board[x][y])
{
count++;
cx -= 1;
if (count == STA)
return board[x][y];
}
else
{
left = 1;
cx = x;
}
}
if (left == 1 && right == 0)
{
if (board[cx + 1][cy] == board[x][y])
{
count++;
cx += 1;
if (count == STA)
return board[x][y];
}
else
{
right = 1;
break;
}
}
}
return 0;
}
//行的判断
char Line(char board[ROW][COL], int row, int col, int x, int y)
{
int cx = x;
int cy = y;
//两个边界值
int left = 0;
int right = 0;
//在同一直线的棋子数目
int count = 1;
//水平方向的遍历
for (int i = 1; i < 10; i++)
{
if (left == 0)
{
if (board[cx][cy - 1] == board[x][y])
{
count++;
cy -= 1;
if (count == STA)
return board[x][y];
}
else
{
left = 1;
cy = y;
}
}
if (left == 1 && right == 0)
{
if (board[cx][cy + 1] == board[x][y])
{
count++;
cy += 1;
if (count == STA)
return board[x][y];
}
else
{
right = 1;
break;
}
}
}
return 0;
}
//对角线的判断
char Diagonal(char board[ROW][COL], int row, int col, int x, int y)
{
int cx = x;
int cy = y;
//两个边界值
int left = 0;
int right = 0;
//在同一直线的棋子数目
int count = 1;
//对角线方向的遍历
for (int i = 1; i < 10; i++)
{
if (left == 0)
{
if (board[cx - 1][cy - 1] == board[x][y])
{
count++;
cy -= 1;
cx -= 1;
if (count == STA)
return board[x][y];
}
else
{
left = 1;
cy = y;
cx = x;
}
}
if (left == 1 && right == 0)
{
if (board[cx + 1][cy + 1] == board[x][y])
{
count++;
cy += 1;
cx += 1;
if (count == STA)
return board[x][y];
}
else
{
right = 1;
break;
}
}
}
return 0;
}
//反对角线的判断
char Back_Diagonal(char board[ROW][COL], int row, int col, int x, int y)
{
int cx = x;
int cy = y;
//两个边界值
int left = 0;
int right = 0;
//在同一直线的棋子数目
int count = 1;
//对角线方向的遍历
for (int i = 1; i < 10; i++)
{
if (left == 0)
{
if (board[cx - 1][cy + 1] == board[x][y])
{
count++;
cy += 1;
cx -= 1;
if (count == STA)
return board[x][y];
}
else
{
left = 1;
cy = y;
cx = x;
}
}
if (left == 1 && right == STA)
{
if (board[cx + 1][cy - 1] == board[x][y])
{
count++;
cy -= 1;
cx += 1;
if (count == 5)
return board[x][y];
}
else
{
right = 1;
break;
}
}
}
return 0;
}
//是否满了
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 1; i < row-1; i++)
{
int j = 0;
for (j = 1; j < col - 1; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}