首先,用C语言实现三子棋主要分为五大步骤:
1.建立game.c,game.h, 和主函数test.c
建立基本框架,test.c中主要实现主函数和大体模块代码,game.c中主要包含三子棋游戏的一些函数的实现,game.h中主要为游戏函数的声明和一些宏定义。
2.初始化棋盘,和打印菜单,棋盘
初始化棋盘:初始化棋盘全为‘ ’,为了更好的显示打印棋盘。
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] = ' ';
}
}
}
打印菜单:利用do while循环,执行一次再进行条件的判断,条件为判断input的值,为0退出。
void meau()
{
printf("**********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("**********************\n");
}
int main()
{
srand((unsigned int)time(NULL)); //利用时间戳生成随机数
meau();
int input=0;
do
{
scanf("%d", &input);
switch(input)
{
case 0:
printf("退出\n");
break;
case 1:
game();
break;
default:
printf("输入错误,请重新输入。\n");
break;
}
} while (input);
打印棋盘:
void display_board(char board[ROW][COL], int row, int col) //打印棋盘内容(进阶版)
{
int i = 0;
for (i = 0; i < row;i++)
{
//printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
//打印一行数据 %c | %c | %c
int j = 0;
for (j = 0; j < col;j++)
{
printf(" %c ",board[i][j]);
if (j<col-1) //最后一列不打印|
printf("|");
}
printf("\n");
//打印---|---|---
if (i<row-1) //最后一行不打印---|---|---
{
int j = 0;
for (j = 0; j < col;j++)
{
printf("---");
if (j<col-1)
printf("|");//最后一列不打印|
}
printf("\n");
}
}
}
3.玩家下棋:
通过输入x,y坐标访问棋盘数组,判断board[x-1][y-1]是否为空格,如果是空格代表可以下棋,玩家下棋为'*',坐标输出错误或者,所填棋盘不为空格则输出:坐标输入错误,请重新输入。
void player_move(char board[ROW][COL], int row, int col) //玩家下棋
{
int x = 0;//玩家下棋的坐标
int y = 0;
printf("玩家下棋>");
while (1)
{
printf("请输入要下的坐标:");
scanf("%d%d", &x, &y);
if (x>0&&x<=row&&y>0&&y<=col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标输入错误,请重新输入。\n");
}
}
else
{
printf("坐标输入错误,请重新输入。\n");
}
}
}
4.电脑下棋:电脑下棋利用rand()生成随机数,通过调用srand((unsigned int )time(NULL)) ,利用时间戳产生随机数。rand()头文件为:<stdlib.h>,time()头文件为 <time.h>。
void computer_move(char board[ROW][COL], int row, int col)//电脑随机下棋
{
printf("电脑下棋>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row; //生成0~row-1的数,0~2
y = rand() % col; //生成0~col-1的数,0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
5.判断游戏输赢:某一行或列或对角线为'*'或'#',则可判断输赢,返回'*'为玩家赢,返回'#'为电脑赢,返回'Q'则为平局,返回'C'则继续。
char Is_win(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]; //判断行:只要某一行为'*'或'#'就返回对于的符号。
}
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
return board[0][j]; //判断列:只要某一列为'*'或'#'就返回对于的符号。
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
判断平局:如果没满足赢的条件而且棋盘上没空格了,则决定为平局。
//-------判断平局-----------
if (Is_full(board, row, col))
{
return 'Q';
}
return 'C';
判断棋盘是否满了,满了返回1,没满返回0;遍历数组,看是否有空格
//如果棋盘满了返回1,没满返回0;
int Is_full(char board[ROW][COL], int row, int col)
{
int i, j = 0;
for (i = 0; i < row;i++)
{
for (j = 0; j < col;j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
玩游戏game()函数:
void game()
{
//------初始化棋盘------------
char ret = 0;
char board[ROW][COL] = { 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;
}
//-------判断游戏输赢------
//玩家赢返回'*'
//电脑赢返回'#'
//平局返回'Q'
//继续返回'C'
if (ret == '*')
printf("玩家赢\n");
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
}
通过while()循环不断让玩家和电脑下棋,判断是否不为'C',通过判断返回的符号判断游戏的输赢。
返回'*'为玩家赢,返回'#'为电脑赢,返回'Q'则为平局。
最后,游戏运行结果图: