目录
在学习了数组和基本语法之后,可以尝试去写一些与数组相关的小项目,锻炼自己的能力,巩固自己的知识,同时也可以查漏补缺,加深印象。
1.大体结构
在写这个代码的时候,首先要有一个基本的构架,比如一个先写简单的菜单,让用户选择选择是否游戏,要用到选择就要用到switch分支语句,相比于if语句简洁明了,用户也可以多次选择,一进来让用户选择,所以大体的程序放在do...while循环中,代码如下:
int main()
{
int input = 0;
do
{
menu();
printf("请输入:> ");
scanf("%d",&input);
switch (input)
{
case 1:
{
game(); //游戏的内容在这里实现
break;
}
case 0:
{
printf("游戏结束\n");
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
} while (input);
}
2.具体内容实现
紧接着就要在函数game()里面实现三子棋的具体内容,在game()里面只调用相关的函数就可以,具体的实现还需要我们自己创建一个文件,在这里实现函数的功能。同时也创建对应的头文件,在这里声明函数。
3.数组初始化
三子棋是在一个三行三列的棋盘上面进行的,所以需要定义一个三行三列的二维数组,并且初始化.
void Init_board(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
arr[i][j] = ' '; //初始化数组,将数组里面的内容都初始化为空格
}
}
}
4.打印棋盘
要将棋盘打印出来,我个人认为不太好理解的就是棋盘的打印了,具体代码如下:
/*打印棋盘*/
void Display_board(char arr[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 ",arr[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");
}
}
}
5.玩家下棋
玩家下棋比较简单,只需要输出相应的坐标即可.具体看代码
void Player_move(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
while (1)
{
if (x > 0 && x < row && y>0 && y < col) //判断坐标是否非法
{
if (arr[x - 1][y - 1] == ' ') //判断该单元格是否被占用
{
arr[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新输入\n");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
}
6.电脑下棋
电脑下棋是机选,目前还写不出很高的水准,只需调用C语言中简单的库函数,生成一个随机的数即可.具体要用到rand()和srand(),具体我也不在详细解说(因为我也不太会)
void Computer_move(char arr[ROW][COL], int row, int col)
{
printf("电脑下棋;>\n");
while (1)
{
int x = rand() % row; //0-3
int y = rand() % col;
if (arr[x][y] == ' ') //判断该单元格是否被占用
{
arr[x][y] = '#';
break;
}
}
}
7.判断输赢
三子棋只需要连成三个相同的就可以,只需要统计每行\每列以及对角线符号的情况,是否存在平局.
static int is_full(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == ' ')
return 0; //没满
}
}
return 1; //满了
}
char is_win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//先判断行和列,在判断对角线
for (i = 0; i < row; i++) //行
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != ' ')
{
return arr[i][0];
}
}
for (j = 0; j < col; j++) //列
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')
{
return arr[0][j];
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ') //右斜
{
return arr[1][1];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ') //右斜
{
return arr[0][2];
}
//判断平局
if (is_full(arr, ROW, COL) == 1)
{
return 'Q';
}
//继续
return 'C';
}
8.game里面的代码:
void game() //在这里开始游戏
{
char board[ROW][COL] = {0};
char ret = 0;
Init_board(board,ROW,COL);//初始化棋盘
Display_board(board, ROW, COL); //打印棋盘
while (1)
{
Player_move(board, ROW, COL);
Display_board(board, ROW, COL); //打印棋盘
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
Computer_move(board, ROW, COL);
Display_board(board, ROW, COL); //打印棋盘
ret=is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret=='Q')
{
printf("平局\n");
}
}
9.main 里面的代码:
int main()
{
srand((unsigned int )time(NULL));
int input = 0;
do
{
menu();
printf("请输入:> ");
scanf("%d",&input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("游戏结束\n");
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
} while (input);
return 0;
}
感谢!