1.三子棋主函数
int main(void)
{
int input = 0;
srand((unsigned int)time(NULL));//与rand函数配套使用,是设置一个随机数的意思
do
{
caidan();//菜单函数
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();//game函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
2.菜单函数
void caidan()
{
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
}
3.game函数
void game()
{
//创建二维数组存放棋盘数据
char board[ROW][COL] = { 0 };
//初始化棋盘
initboard(board, ROW, COL);
//显示棋盘
printboard(board, ROW, COL);
char ret = 0;
while (1)
{
//玩家下棋
WuanJia(board, ROW, COL);
//打印棋盘
printboard(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
//电脑下棋
DianNao(board, ROW, COL);
//打印棋盘
printboard(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '#')
{
printf("玩家赢\n");
}
else if (ret == '*')
{
printf("电脑赢\n");
}
else
printf("平局\n");
}
3.1创建二维数组存放数据/初始化棋盘/打印棋盘
//创建二维数组存放棋盘数据
char board[ROW][COL] = { 0 };
//初始化棋盘
initboard(board, ROW, COL);
//打印棋盘
printboard(board, ROW, COL);
3.2//初始化棋盘
initboard(board, ROW, COL);//代码如下
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] = ' ';
}
}
3.3//打印棋盘
printboard(board, ROW, COL);代码如下
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++)//遍历数组给数组每个元素打印 %c |
{
printf(" %c ",board[i][j]);
if(j<col-1)//不打印最后一列棋盘 |
printf("|");
}
printf("\n");//打印完换行
if (i<row-1)//不考虑最后一行任何操作
{
for (j = 0; j < col; j++)//遍历数组给数组每个元素打印---|
{
printf("---");
if (j < col-1)//不打印最后一列棋盘 |
printf("|");
}
}
printf("\n");//打印完换行
}
}
3.4玩家下棋/电脑下棋/判断输赢,平局或游戏继续
char ret = 0;
while (1)
{
//玩家下棋
WuanJia(board, ROW, COL);
//打印棋盘
printboard(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL); //'#'玩家赢
//'*'电脑赢
//'c'游戏继续
//'a'游戏平局
if (ret != 'c')
{
break;//只要不返回游戏继续就继续执行循环玩游戏
}
//电脑下棋
DianNao(board, ROW, COL);
//打印棋盘
printboard(board, ROW, COL);
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'c')
{
break;//只要不返回游戏继续就继续执行循环玩游戏
}
}
if (ret == '#')
{
printf("玩家赢\n");//根据返回的ret判断谁赢
}
else if (ret == '*')
{
printf("电脑赢\n");//根据返回的ret判断谁赢
}
else
printf("平局\n");//根据返回的ret判断谁赢
3.41WuanJia(board, ROW, COL);//玩家下棋函数,代码如下
char WuanJia(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] == ' ')//二维数组的横列从0开始,输入-1表示的棋盘上玩家看见的坐标
{
board[x - 1][y - 1] = '#';//如果有效坐标内不为空格则赋值为‘#’
break;//跳出循环
}
else
printf("坐标被占用,重新输入\n");
}
else
printf("坐标越界,新重新输入\n");
}
}
3.42 DianNao(board, ROW, COL);//电脑下棋函数,代码如下
void DianNao(char board[ROW][COL], int row, int col)
{
printf("电脑下棋 :\n");
while (1)
{
int x = rand() % row;//rand函数设置随机值
int y = rand() % col;
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
}
}
3.43ret = IsWin(board, ROW, COL);//判断输赢函数代码如下
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][0] != ' ')//横行判断三个是否相等
{
return board[i][0];
}
}
for (i = 0; i < col; 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[2][2]== board[1][1] && board[1][1] != ' ')//对角判断是否相等
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[2][0]== board[1][1] && board[1][1] != ' ')//对角判断是否相等
{
return board[1][1];
}
3.44if (pingju(board, ROW, COL))判断平局或者游戏继续函数,代码如下
//'#'玩家赢
//'*'电脑赢
//'c'游戏继续
//'a'游戏平局
if (pingju(board, ROW, COL))
{
return 'a';//pingju函数为真则返回‘a’,否则返回‘c’
}
return 'c';
//pingju(board, ROW, COL)函数代码如下
pingju(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++)
{
if (board[i][j] == ' ')//遍历数组看是否还有空格,有就返回0,没有就返回1
return 0;
}
}
return 1;
}