今天学习了如何用C语言实现三子棋,以下为学习分享。
首先,我们可以将目标的实现成三个模块,一个game.h放在头文件,用来声明和定义,test.c用来实现整体的逻辑,game.c用来实现游戏的具体内容。那么现在就可以开始具体实现了。
首先在test.c里创建主函数,并使用test函数。
int main()
{
test();
return 0;
}
然后在test函数中实现是否玩游戏的选择,并利用循环确保每次进行完游戏和非法输入的情况能再次选择。
void test()
{
while (1)
{
menu();
int input = 0;
scanf("%d", &input);
if (input == 1)
{
system("cls");
game();
}
else if (input == 0)
{
system("cls");
printf("退出游戏\n");
break;
}
else
{
system("cls");
printf("非法输入,请重试\n");
continue;
}
}
}
当然我们得有一个菜单提示选择
void menu()
{
printf("**********************************\n");
printf("********* 1.play *******\n");
printf("********* 0.exit *******\n");
printf("**********************************\n");
printf("请输入一个数值:");
}
然后我们就可以创建game()函数了,其中所要调用的函数,我们在game.c这个源文件中实现,为此我们还得在game.h中先进行一系列的声明。
void game()
{
int ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盘
init_board(board, ROW, COL);
//打印棋盘
print_board(board, ROW, COL);
while (1)
{
//玩家下棋
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 0)
{
break;
}
//电脑下棋
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 0)
{
break;
}
}
if (ret == 1)
{
printf("玩家赢\n");
}
else if (ret == 2)
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
//is_win返回0,继续游戏
//返回1,玩家赢
//返回2,电脑赢
//返回3,平局
其中game.h应如下
#define _CRT_SECURE_NO_WARNINGS
//头文件中声明函数,引库函数,宏的定义
#include
#include
#include
#include
//定义宏
#define ROW 3
#define COL 3
//初始化棋盘
void init_board(char board[ROW][COL],int row,int col);
//打印棋盘
void print_board(char board[ROW][COL], int row, int col);
//玩家移动
void player_move(char board[ROW][COL], int row, int col);
//电脑移动
void computer_move(char board[ROW][COL], int row, int col);
//判断输赢
int is_win(char board[ROW][COL], int row, int col);
为了使用这些函数,千万不要忘记先在game.c和test.c中首先引入头文件
#include "game.h"
然后便是初始化棋盘
void init_board(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 print_board(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 (j < col - 1)
{
printf(" %c |", board[i][j]);
}
else
{
printf(" %c\n", board[i][j]);
}
}
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf("---|");
}
else
{
printf("---\n");
}
}
}
}
}
实现玩家移动
void player_move(char board[ROW][COL], int row, int col)
{
while (1)
{
int a = 0;//行
int b = 0;//列
printf("请输入要下的坐标:");
scanf("%d %d", &a, &b);
if (a <= row && a > 0 && b <= col && b > 0)
{
if (board[a-1][b-1] == ' ')
{
board[a-1][b-1] = '*';
break;
}
else
{
printf("目标坐标已被占用,请重新输入。\n");
}
}
else
{
printf("坐标非法,请重新输入。\n");
}
}
}
实现电脑移动
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:\n");
int a = 0;
int b = 0;
while (1)
{
a = rand() % 3;
b = rand() % 3;
{
if (board[a][b] == ' ')
{
board[a][b] = '#';
break;
}
}
}
}
其中为了保证随机数的生成我们选择返回到test()函数中添加srand()函数
void test()
{
srand((unsigned int)time(NULL));
while (1)
{
menu();
int input = 0;
scanf("%d", &input);
if (input == 1)
{
system("cls");
game();
}
else if (input == 0)
{
system("cls");
printf("退出游戏\n");
break;
}
else
{
system("cls");
printf("非法输入,请重试\n");
continue;
}
}
}
实现输赢判断或者继续游戏
int is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//玩家赢 *
for (i = 0;i < row; i++)//判断一行是否有三个相同
{
int a = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == '*')
{
a++;
}
if (a == ROW)
{
return 1;
}
}
}
for (j = 0; j < row; j++)//判断一列是否有三个相同
{
int a = 0;
for (i = 0;i < col; i++)
{
if (board[j][i] == '*')
{
a++;
}
if (a == ROW)
{
return 1;
}
}
}
//判断对角线是否有三个相同
//1. "\"型
for (int a = 0 ,i = 0, j = 0; i < row && j < col; i++, j++)
{
if (board[i][j]== '*')
{
a++;
}
if (a == ROW)
{
return 1;
}
}
//2."/"型
for (int a = 0,i = 0, j = col - 1; i < row && j >= 0; i++, j--)
{
if (board[i][j] == '*')
{
a++;
}
if (a == ROW)
{
return 1;
}
}
//电脑赢 #
for (i = 0; i < row; i++)//判断一行是否有三个相同
{
int a = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == '#')
{
a++;
}
if (a == ROW)
{
return 2;
}
}
}
for (j = 0; j < row; j++)//判断一列是否有三个相同
{
int a = 0;
for (i = 0; i < col; i++)
{
if (board[j][i] == '#')
{
a++;
}
if (a == ROW)
{
return 2;
}
}
}
//判断对角线是否有三个相同
//1. "\"型
for (int a = 0, i = 0, j = 0; i < row && j < col; i++, j++)
{
if (board[i][j] == '#')
{
a++;
}
if (a == ROW)
{
return 2;
}
}
//2."/"型
for (int a = 0, i = 0, j = col - 1; i < row && j >= 0; i++, j--)
{
if (board[i][j] == '#')
{
a++;
}
if (a == ROW)
{
return 2;
}
}
//平局 即格子全填满了但没有三个相连
for (int a = 0,i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
{
a++;
}
if (a == ROW * COL)
{
return 3;
}
}
}
//继续游戏
return 0;
}
这样,我们就可以实现三子棋了。
以上就是今天学习内容的分享了,感谢您的阅读,如有发现错误也欢迎指出!