三子棋
今天我花了好长时间按做这个三子棋,希望大家能够喜欢,有兴趣朋友可以下载玩玩
话不多说,源码呈上
代码分为三个文件,一个是test.c测试文件,一个是game.h头文件,最后一个是game.h文件
game.h
game.h头文件负责的是重要函数的声明,在我们写大型项目时,如果只用一个文件去写代码时,很容易混乱,而且不易修改维护。
采用多文件的形式,逻辑清晰,便于维护。头文件就是把构成程序重要的函数声明,宏,等实现,其他文件只要调用它就可以
使用它,其他文件加上#include"头文件名就可以了。
#ifndef GAME.H
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#define ROW 4
#define COL 4
void InitBroad(char broad[ROW][COL], int, int);//声明Map
void Display_Borad(char broad[ROW][COL], int, int);//声明棋盘函数
void ComputerMove(char broad[ROW][COL], int, int);//电脑移动
void PlayerMove(char broad[ROW][COL], int, int);//玩家移动
char Is_win(char broad[ROW][COL], int, int);//根据返回值来判断输赢
int is_Fill(char broad[ROW][COL], int, int);
#endif // !GAME.H
game.c
我们都知道函数有声明和定义,我们在game.h文件中函数声明,在game.c文件中函数定义(实现)。
当然你也可以在game.h中完成函数实现,用一个文件完成函数的实现。这样也可以达到我们的目的,但是我给你讲一个好处,你就明白为什么要这样写,我们都知道库函数吧,库函数里面的函数特别好用,例如:printf();scanf()等,我们甚至不用管它里面如何实现的,只要会用就行,同理,当你以后成为大佬,牛逼的时候,你也可以写一个库,如果你写的库特别好用,是可以赚钱的,这时候你得把你写的库给被人介绍,说明,这时候,你可以把库的头文件给别人,因为头文件里面只有函数的声明,没有实现,别人就不会知道你重要源码,这样既保证了自己的知识产权,又方便别人使用。-----嘿嘿,说了好多废话.
总之,game.c文件对game.h文件声明的函数进行实现。
#include"game.h"
void InitBroad(char broad[ROW][COL], int row, int col)
{
memset(&broad[0], ' ', row * col * sizeof(broad[0][0]));
}
void Display_Borad(char broad[ROW][COL], int row, int col)
{
// system("cls");
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", broad[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");
}
}
}
void ComputerMove(char broad[ROW][COL], int row, int col)
{
int ret1 = rand() % ROW;
int ret2 = rand() % COL;
while (1)
{
if (broad[ret1][ret2] == ' ')
{
broad[ret1][ret2] = 'X';
break;
}
}
}
void PlayerMove(char broad[ROW][COL], int row, int col)
{
int i = 0, j = 0;
while (1)
{
printf("请输入坐标>");
scanf_s("%d%d", &i, &j);
if ((i >= 1 && i <= ROW) && (j >= 1 && j <= COL))
{
if (broad[i - 1][j - 1] == ' ')
{
broad[i - 1][j - 1] = 'Y';//A代表玩家输入
break;
}
else
printf("被占用,请重新输入!\n");
}
else
{
printf("错误输入!\n");
}
}
}
char Is_win(char broad[ROW][COL], int row, int col)
{
#if 0
int i = 0, j = 0;
for (i = 0; i < ROW; i++)
{
if (broad[i][0] == broad[i][1] && broad[i][1] == broad[i][2] && broad[i][0] != ' ')
return broad[i][0];
if (broad[0][i] == broad[1][i] && broad[1][i] == broad[2][i] && broad[0][i] != ' ')
return broad[0][i];
}
if (broad[0][0] == broad[1][1] && broad[1][1] == broad[2][2] && broad[i][0] != ' ')
return broad[0][0];
if (broad[0][2] == broad[1][1] && broad[1][1] == broad[2][0] && broad[i][0] != ' ')
return broad[1][1];
if (is_Fill(broad, ROW, COL) == 1)
{
return 'P';
}
return ' ';
#elif 1
int i = 0, j = 0;
int count1 = 0;//计数器1
int count2 = 0;//计数器2
//这是判断行列赢得情况
for (i = 0; i < row; i++)
{
count1 = 0;
count2 = 0;
for (j = 0; j < col; j++)
{
if (broad[i][j] == ' ')//如果是空的话,跳出
break;
if (broad[i][j] == 'X')
count1++;
if (broad[i][j] == 'Y')
count2++;
if (count1 == col)
return 'X';
if (count2 == col)
return 'Y';
}
}
//这是判断数列赢得情况
for (i = 0; i < row; i++)
{
count1 = 0;
count2 = 0;
for (j = 0; j < col; j++)
{
if (broad[j][i] == ' ')//如果是空的话,跳出
break;
if (broad[j][i] == 'X')
count1++;
if (broad[j][i] == 'Y')
count2++;
if (count1 == col)
return 'X';
if (count2 == col)
return 'Y';
}
}
//这是对角线形式赢得情况
count1 = 0;
count2 = 0;
for (i = 0; i < row; i++)
{
if (broad[i][i] == ' ')//如果是空的话,跳出
break;
if (broad[i][i] == 'X')
count1++;
if (broad[i][i] == 'Y')
count2++;
if (count1 == col)
return 'X';
if (count2 == col)
return 'Y';
}
//这是对角线形式赢得情况
count1 = 0;
count2 = 0;
for (i = 0; i < row; i++)//col=3
{
if (broad[i][col - 1 - i] == ' ')//如果是空的话,跳出
break;
if (broad[i][col - 1 - i] == 'X')
count1++;
if (broad[i][col - 1 - i] == 'Y')
count2++;
if (count1 == col)
return 'X';
if (count2 == col)
return 'Y';
}
//这是判断平局得情况
if (is_Fill(broad, ROW, COL) == 1)
{
return 'P';
}
//这是继续的情况
return ' ';
#endif //0
}
int is_Fill(char broad[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (broad[i][j] == ' ')
return 0;
}
}
return 1;
}
test.c
上面两个文件就像积木,里面有好多你做好的积木(函数),这个文件就是你这个艺术家拼接的过程,把积木(函数)用你的智慧做出你想要的工艺品。
test.c是主函数main()存在的文件,我们都知道所有程序的入口和出口都是main()函数的。main()就是拼接的过程。
/*
三子棋
*/
#include"game.h"
void menu()
{
printf("***********************\n");
printf("******* 1、play *******\n");
printf("******* 0、exit *******\n");
printf("***********************\n");
}
void game()
{
int ret = 0;
char broad[ROW][COL] = { 0 };
InitBroad(broad, ROW, COL);
Display_Borad(broad, ROW, COL);//打印棋盘
while (1)
{
system("cls");
printf("\n电脑走>\n");
ComputerMove(broad, ROW, COL);//电脑移动
Display_Borad(broad, ROW, COL);
ret = Is_win(broad, ROW, COL);
if (ret != ' ')
break;
printf("\n玩家走>\n");
PlayerMove(broad, ROW, COL);//玩家移动
Display_Borad(broad, ROW, COL);
ret = Is_win(broad, ROW, COL);
if (ret != ' ')
break;
}
if (ret == 'X')
printf("电脑赢!\n");
else if (ret == 'Y')
printf("玩家赢!\n");
else if (ret == 'P')
printf("平局!\n");
(broad, ROW, COL);//打印棋盘
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//设置种子
do
{
menu();//菜单
printf("请输入>");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("错误输入!\n");
break;
}
} while (input != 0);
system("pause");
return 0;
}
好了,就分享到这了,
愿对你有帮助的你能收获,没有帮助的睡一觉忘掉。
希望能帮助到你,嘿嘿,随后我会上传扫雷
如果代码有什么错误,希望您能指点,您的点滴指点就是对我最大的鼓励。
共同学习,共同交流,共同进步。
祝福您每天幸福快乐!