目的:对前面知识的灵活运用
这里的整体代码分为三块:
- 首先是有主函数区的文件game_3ziqi.c
- 其次是game.h用来进行函数声明的
- 最后是game.c用来进行代码的实现
1.game_3ziqi.c
#include"game.h"
void game()
{
char board[ROW][COL];
char ret = 0;
//初始化棋盘
init_board(board,ROW,COL);
//打印数组
print_board(board,ROW, COL);
//玩家下棋,再打印出来
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret=judge(board,ROW,COL);
if (ret != 'C')
{
Sleep(1500);
system("cls");
print_board(board, ROW, COL);
break;
}
//电脑下棋,再打印出来
computer_move(board, ROW, COL);
Sleep(1500);
system("cls");
print_board(board, ROW, COL);
//判断输赢
ret = judge(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == 'O')
printf("you win !!!\n");
else if (ret == 'X')
printf("computer win !\ncomputer:you should work harder!\n");
else if (ret == 'Q')
printf("no winer!!!");
}//判断输赢的结果有:玩家赢了返回O,电脑赢了返回X,平局返回Q,游戏继续返回C
void menu(void)
{
printf("************************\n");
printf("****** 1.play ********\n");
printf("****** 0.exit ********\n");
printf("************************\n");
}
void test(void)
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择数字:>");
scanf("%d",&input);
switch (input)
{
case 1:
printf("玩游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("请重新选择哦!\n");
Sleep(1500);
system("cls");
}
} while (input);
}
int main()
{
test();
return 0;
}
2.game.h
#define ROW 3
#define COL 3
#include
#include
#include
#include
//头文件中,声明函数
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);
char judge(char board[ROW][COL], int row, int col);
3.game.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++)
{
system("color 73");
/*printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);*/
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)
{
/*printf("---|---|---\n");*/
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
}
void player_move(char board[ROW][COL], int row, int col)
{
printf("*玩家请下棋*\n");
while (1)
{
printf("请输入你要下棋的坐标:>");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'O';
break;
}
else
printf("这个位置已有棋子了哦!!!\n请重新输入。\n");
}
else
printf("输入错误,请重新输入(>-<)!\n");
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋(0V0) \nLoading.....\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
}
static int is_full(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] == ' ')
return 0;
}
}
return 1;
}
char judge(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[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
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) == 1)
{
return 'Q';
}
return 'C';
}
注意:
代码有点多,你可以先把代码拷贝一份,放在你的编译器上运行一下试试,看看效果,如果觉得还行,那就继续往下看,如果觉得不太行,那欢迎来评论区探讨,总之,本篇主要为你提供思路,看完本篇可以试试写一份属于自己的三子棋。
#include
void test()
{
int input=0;
do
{
menu();//用来打印游戏菜单
printf("请选择数字:>");
scanf("%d",&input);//玩家选择开始和结束
switch (input)
{
case 1:
printf("玩游戏\n");
game();//用来玩游戏的
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("请重新选择哦!\n");
}
}while(input);//循环:可以让玩家多次玩
}
int main()
{
test();//用来创建循环,让玩家可以多次玩
return 0;
}
void menu()
{
printf("************************\n");
printf("****** 1.play ********\n");
printf("****** 0.exit ********\n");
printf("************************\n");
}
1.首先,先在game.h中声明棋盘初始化函数,打印边界线函数,电脑下棋函数,玩家下棋函数,和判断的函数。
#define ROW 3//字符数组的行
#define COL 3//字符数组的列
#include //printf函数与scanf函数
#include //系统调用函数,system(),rand函数
#include //Sleep函数
#include //时间戳函数
//头文件中,声明函数
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);
//电脑下棋的声明
char judge(char board[ROW][COL], int row, int col);
//判断谁赢的函数声明
2.在game()函数里调用棋盘初始化函数,在game.c中实现棋盘初始化函数
#include"game.h"//用来函数的声明
void game()
{
char board[ROW][COL];
//初始化棋盘
init_board(board,ROW,COL);//棋盘初始化函数的调用
}
#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] = ' ';//将字符数组元素都赋值为空格
}
}
}//完成初始化棋盘
完成后你是看不到的,所以才要打印棋盘边界线
3.在game()函数里调用打印边界线函数,在game.c中实现打印棋盘边界线函数
#include"game.h"
void game()
{
char board[ROW][COL];
//打印棋盘边界线
print_board(board,ROW, COL);//调用打印棋盘边界线函数
}
//第一种方法:直接格式化打印
void print_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]);
if(i<row-1)
printf("---|---|---\n");
}
}
//第二种方法:在方法一的基础上拆分成循环,更加灵活
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++)
{
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");
}
}
}
4.在game()函数里调用玩家下棋的函数,在game.c中实现玩家下棋的函数
#include"game.h"
void game()
{
char board[ROW][COL];
player_move(board, ROW, COL);//调用玩家下棋的函数
print_board(board,ROW, COL);//打印出来让玩家看到
}
void player_move(char board[ROW][COL], int row, int col)
{
printf("*玩家请下棋*\n");
while (1)
{
printf("请输入你要下棋的坐标:>");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法
{
if (board[x - 1][y - 1] == ' ')//若合法,是否已有棋子
{
board[x - 1][y - 1] = 'O';
break;
}
else
printf("这个位置已有棋子了哦!!!\n请重新输入。\n");
}
else
printf("输入错误,请重新输入(>-<)!\n");//不合法
}
}
5.在game()函数里调用电脑下棋的函数,在game.c中实现电脑下棋的函数
#include"game.h"
void game()
{
char board[ROW][COL];
computer_move(board, ROW, COL);//调用电脑下棋的函数
print_board(board,ROW, COL);//打印出来让玩家看到
}
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下棋(0V0) \nLoading.....\n");
while (1)
{
int x = rand() % row;//让行坐标范围是0~ 3
int y = rand() % col;//让列坐标范围是0~ 3
if (board[x][y] == ' ')//判断是否是空格
{
board[x][y] = 'X';
break;
}
}
}
注意:
使用rand()函数要有随机值,就要调用srand((unsigned int)time(NULL));
但只能调用一次,不能多次调用,因此把srand函数放在test()函数中。
6.实现电脑和玩家能多次下棋,而不止步于只能下一次
while (1)
{
//玩家下棋,打印出来
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//电脑下棋,再打印出来
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
}
7.最后,就是判断部分
#include"game.h"
void game()
{
char board[ROW][COL];
ret=judge(board,ROW,COL);
}
1.我们把玩家赢和电脑赢看作一类
要么三个一样的连成一行或一列,要么连成对角线
代码实现:
char judge(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[0][i];
}
//判断左对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
//判断右对角线
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
2.当棋盘满的时候,就意味着平局
代码实现:
int is_full(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] == ' ')
return 0;
}
}
return 1;
}
char judge(char board[ROW][COL], int row, int col)
{
if (is_full(board, ROW, COL) == 1)
{
return 'Q';//另起炉灶,在一个函数里写的太麻烦
}
}
3.游戏继续
当前面的情况判断完后,就只剩下最后一种了,那么就直接return ‘C’;
4.判断函数在game()函数中的使用
void game()
{
char board[ROW][COL];
char ret = 0;
//初始化棋盘
init_board(board,ROW,COL);
//打印数组
print_board(board,ROW, COL);
//玩家下棋,再打印出来
while (1)
{
player_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret=judge(board,ROW,COL);
if (ret != 'C')
{
break;
}
//电脑下棋,再打印出来
computer_move(board, ROW, COL);
print_board(board, ROW, COL);
//判断输赢
ret = judge(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == 'O')
printf("you win !!!\n");
else if (ret == 'X')
printf("computer win !\ncomputer:you should work harder!\n");
else if (ret == 'Q')
printf("no winer!!!");
}//判断输赢的结果有:玩家赢了返回O,电脑赢了返回X,平局返回Q,游戏继续返回C
以上就是三子棋的整体逻辑和代码实现,如果喜欢本篇内容,不妨赞一赞,有什么疑问,咱们可以评论区一起聊,如果想要后期一起学习,不妨点个关注,我每周都会更新博客,(baibai) !!!