首先我们要有三个文件game.h ——函数的声明 game.c ——函数实现 test.c ——测试游戏
创建菜单(menu())
//菜单选择界面
void menu()
{
printf("*****************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("*****************\n");
}
int main()
{
int i = 0;
do
{
//1.先创建一个菜单,让用户可以看见如何选择。
menu();
printf("请选择:>");
scanf("%d", &i);
switch (i)
{
case 1:
game();//游戏主体核心,放到game.c里执行
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (i);
return 0;
}
菜单界面运行截图:
游戏代码主体核心的实现
1.棋盘初始化
void game()
{
//游戏棋盘的创建
char arr[rows][cols] = {0};
//初始化棋盘函数。
Init_board(arr,rows,cols);
}
函数的实现:
void Init_board(char arr[rows][cols],int row,int col)
{
int i = 0;//i 表示行
int j = 0;//j 表示列
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] =' ';//先将棋盘初始化为空格
}
}
}
2.打印棋盘
print_board(arr, rows, cols);//打印棋盘
函数的实现:
void print_board(char arr[rows][cols],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)
{
int j = 0;
for (j = 0; j < col ; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
Trivia:为了提高代码可读性,使用了全局变量rows cols,有了这两个全局变量,以后改变代码也会更加容易(将三子棋改为五子棋会很方便)。
3.玩家下棋:
要想实现玩家下棋,需注意以下几点:
1.接收玩家所输入的地址位置(因为数组下标为0,所以玩家输入的坐标应该-1)
2.判断玩家所输入的地址所在是否已有落子
3.将玩家的棋子落入对应地
void Player_action(char arr[rows][cols],int row,int col)
{
int i = 0;
int j = 0;
printf("玩家下棋=<\n");
while (1)
{
printf("请输入坐标=>:");
scanf("%d %d", &i,&j);
if(i >= 1 && i <= row && j >= 1 && j <= col)
{
if(arr[i - 1][j - 1] == ' ')
{
arr[i - 1][j - 1] = '*';
break;
}
else
{
printf("坐标已被占用,重新输入\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}
4.电脑下棋
要想实现电脑下棋必须要调用头文件:
如果要将电脑下的坐标限制在某个数值内,则还需要:
- srand((unsigned int)time(NULL)); 坐标初始化
- x = rand() % row;
y = rand() % col; 创建随机数
同时判断电脑所下的地址是否被占用,以及将棋子落下。
代码如下:
void Computer_operation(char arr[rows][cols], int row, int col)
{
printf("电脑下棋\n");
int i = 0;
int y = 0;
while(1)
{
i = rand() % row;
y = rand() % col;
if (arr[i][y] == ' ')
{
arr[i][y] = '#';//电脑下棋
break;
}
}
}
srand((unsigned int)time(NULL)) 函数要放main()函数里。
5.游戏胜负判断
由于规则特殊性,电脑和玩家每下一步棋都需对结果进行判定,以保证程序的逻辑可以运行
这里我们使用Winning()函数来实现这一功能。
同时还需要实现以下逻辑:
1. 玩家赢‘*’
2. 电脑赢‘#’
3. 平局‘C’
4. 继续‘F’
函数在整个游戏主体位置 :
void game()
{
char ret = 0;
char arr[rows][cols] = {0};//棋盘数组创建
//1.初始化棋盘函数。
Init_board(arr,rows,cols);
//2.打印棋盘。
print_board(arr, rows, cols);
//3.下棋。
while(1)
{
Player_action(arr, rows, cols);//玩家下棋。
//判断输赢
ret = Winning(arr, rows, cols);
if (ret != 'F')
{
break;
}
print_board(arr, rows, cols);
Computer_operation(arr, rows, cols);//电脑下棋。
//判断输赢
ret = Winning(arr, rows, cols);
if (ret != 'F')
{
break;
}
print_board(arr, rows, cols);
}
if (ret == '*')
{
print_board(arr, rows, cols);
printf("玩家赢了\n");
}
else if (ret == '#')
{
print_board(arr, rows, cols);
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
}
Winning()函数如下:
char Winning(char arr[rows][cols], int row, int col)
{
//判断行连在一起
int i = 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][i];
}
}
//判断列连在一起
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[1][j] != ' ')
{
return arr[1][j];
}
}
//判断对角线连在一起
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
{
return arr[1][1];
}
//判断平局
if (draw(arr, row, col))
{
return 'C';
}
return 'F';//继续游戏
}
“平局”里 draw()函数:
int draw(char arr[rows][cols], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
return 0;//还有空格,继续下。
}
}
}
return 1;//没有空格,平局
}
游戏整体实现:
//菜单选择界面
void menu()
{
printf("*****************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("*****************\n");
}
//游戏本体
void game()
{
char ret = 0;
char arr[rows][cols] = {0};
//1.初始化棋盘函数。
Init_board(arr,rows,cols);
//2.打印棋盘。
print_board(arr, rows, cols);
//3.下棋。
while(1)
{
Player_action(arr, rows, cols);//玩家下棋。
//判断输赢
ret = Winning(arr, rows, cols);
if (ret != 'F')
{
break;
}
print_board(arr, rows, cols);
Computer_operation(arr, rows, cols);//电脑下棋。
//判断输赢
ret = Winning(arr, rows, cols);
if (ret != 'F')
{
break;
}
print_board(arr, rows, cols);
}
if (ret == '*')
{
print_board(arr, rows, cols);
printf("玩家赢了\n");
}
else if (ret == '#')
{
print_board(arr, rows, cols);
printf("电脑赢了\n");
}
else
{
printf("平局\n");
}
}
//主程序
int main()
{
srand((unsigned int)time(NULL));
int i = 0;
do
{
//1.先创建一个菜单,让用户可以看见如何选择。
menu( );
printf("请选择:>");
scanf("%d", &i);
switch (i)
{
case 1:
game();//游戏
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (i);
return 0;
}
游戏运行实况
以上就是三子棋详解了,学会了的你还不赶紧去 *** 作一次加深自己记忆力。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)