目录
前言
最终实现的样式
打印菜单
void menu(void) //由于不需要返回值而且没有参数,所以返回类型和函数参数都是void
{
printf("**********************\n");
printf("***** 1、开始游戏 *****\n"); //可以根据自己的喜好来调格式
printf("***** 0、退出游戏 *****\n"); //在屏幕中间效果可能会更好(我不会)
printf("**********************\n");
}
初始化棋盘
//这里是使用函数的形式来进行初始化,首先要在主函数里面创建一个二维的字符数组
void star_board(char board[ROW][COL],int row,int col)
{
for (int i = 0; i < row; i++) //两层的循环分别代表着行和列
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' '; //初始化为' '。
}
}
打印棋盘
void put_board(char board[ROW][COL],int row,int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|"); //每列结束的时候打印 |来区分列
}
if (i < row - 1)
{
printf("\n");
printf("------------"); //每行结束的时候打印——————来区分行
printf("\n");
}
else
printf("\n");
}
}
玩家下棋
//小细节:形参ch是为了将数组中的元素改成自己想要的字符,这样就可以避免重复多次定义函数
void player_move(char board[ROW][COL], int row, int col, char ch)
{
int x, y;
printf("玩家下棋,请输入坐标:");
do {
scanf("%d%d", &x, &y);
if (x - 1 > row || y - 1 > col)
{
printf("非法输入,请输入正确的坐标:"); //没有输入正确的坐标的时候给与正确的提示
continue;
}
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = ch; //将数组中的元素改为ch
break;
}
else
printf("该坐标已经被占用,请重新输入坐标:"); //输入已经被下过的坐标的时候给与提示
} while (1);
}
电脑下棋(重难点)
void computer_move(char board[ROW][COL], int row, int col, char ch) //控制电脑的棋子样式
{
printf("电脑下棋:\n");
while (1)
{
int x = rand() % 3; //使电脑的棋子落在棋盘内
int y = rand() % 3;
if (board[x][y] == ' ') //判断棋盘有没有被下过
{
board[x][y] = ch; //电脑下棋
break;
}
}
}
判断输赢
char is_win(char board[ROW][COL], int row, int col)
{
int count = 0;
for (int i = 0; i < row; i++)
{
if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == '*')
return '*';
if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == '#')
return '#';
}
if ((board[0][0] == '*' && board[1][1] == '*' && board[2][2] == '*') || (board[0][2]
== '*' && board[1][1] == '*' && board[2][0] == '*'))
{
return '*';
}
if ((board[0][0] == '#' && board[1][1] == '#' && board[2][2] == '#') || (board[0][2]
== '#' && board[1][1] == '#' && board[2][0] == '#'))
{
return '#';
}
for (int i = 0; i < col; i++)
{
if (board[0][i] == '*' && board[1][i] == '*' && board[2][i] == '*')
return '*';
if (board[0][i] == '#' && board[1][i] == '#' && board[2][i] == '#')
return '#';
}
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
count++;
}
}
if (count == 0)
{
printf("游戏平局!!");
return '&';
}
}
组合函数来实现游戏
void game()
{
char board[ROW][COL];
star_board(board, ROW, COL); //初始化棋盘
put_board(board, ROW, COL); //打印棋盘
do {
player_move(board, ROW, COL, '*'); //玩家下棋
put_board(board, ROW, COL); //打印棋盘
if (is_win(board, ROW, COL) == '*') //判断输赢
{
printf("玩家赢!!\n");
break;
}
if (is_win(board, ROW, COL) == '&') //判断是否平局
{
printf("游戏平局!!\n");
break;
}
computer_move(board, ROW, COL, '#'); //电脑下棋
put_board(board, ROW, COL); //打印棋盘
if (is_win(board, ROW, COL) == '#') //判断输赢
{
printf("电脑赢!!\n");
break;
}
if (is_win(board, ROW, COL) == '&') //判断输赢
{
printf("游戏平局!!\n");
break;
}
} while (1);
}