目录
1、开始界面
2、退出程序
3、制作棋盘
4、放置棋子
5、判断胜负
胜负
平局
6、开始游戏
结束
1、开始界面void Show_Menu() {
printf("######################## \n");
printf("# 请选择 # \n");
printf("# 1、开始游戏 # \n");
printf("# 2、退出游戏 # \n");
printf("######################## \n");
}
2、退出程序
void ExitGame() {
printf("######################## \n");
printf("# # \n");
printf("# 欢迎下次再来 # \n");
printf("# # \n");
printf("######################## \n");
system("pause");
exit(0); // 可以直接退出程序
}
(搞这么多主要是为了好看)
3、制作棋盘先定义一个二维数组
为了方便就在全局定义
int arr[3][3] = { { 0,0,0 },
{ 0,0,0 },
{ 0,0,0 } };
打印棋盘
数组中0 为空 1为白子 -1为黑子
void Show_Map() {
printf(" 1 2 3\n"); // 横坐标
for (int i = 0; i < 3; i++) {
printf("%d ", i+1); // 纵坐标
for (int j = 0; j < 3; j++)
{
if (arr[i][j] == 1) printf("●");
else if (arr[i][j] == -1) printf("○");
else printf(" ");
if (j == 0 || j == 1) printf("|");
}
printf("\n");
if (i == 0 || i == 1) printf(" —|—|—\n");
}
}
效果图
4、放置棋子void Place(int i, int j,int chess) {
arr[i][j] = chess;
}
这里的 chess 就是棋子的类型 1 或 -1
5、判断胜负 胜负int Judge(int chess) {
int sum = 0;
for (int i = 0; i < 3; i++) { // 判断 行
sum = 0;
for (int j = 0; j < 3; j++) {
if (arr[i][j] == chess) sum++;
if (sum == 3) {
return 1;
}
}
}
sum = 0;
for (int i = 0; i < 3; i++) { // 判断 列
sum = 0;
for (int j = 0; j < 3; j++) {
if (arr[j][i] == chess) sum++;
if (sum == 3) {
return 1;
}
}
}
sum = 0;
for (int i = 0; i < 3; i++) { // 判断 主对角线
if (arr[i][i] == chess) sum++;
if (sum == 3) {
return 1;
}
}
sum = 0;
for (int i = 0; i < 3; i++) { // 判断 次对角线
if (arr[i][2-i] == chess) sum++;
if (sum == 3) {
return 1;
}
}
return 0;
}
因为我们只需要在一方下一个棋子后 判断这方的棋子类型能否连成三个
所以只需要循环遍历判断 传进去的 类型的棋子
平局在一方下完一个棋子 判断 不能 赢得胜利后
再来判断棋盘是否满了
满了 就为平局
int Is_Full() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (arr[i][j] == 0) { // 只有有一个 0 就说明 棋盘没满
return 0;
}
}
}
return 1;
}
6、开始游戏
void play() {
int chess = 1; // 有个好处
int i = 1, j = 1;
Show_Map();
while (1) {
printf("请输入坐标:");
scanf_s("%d %d", &i, &j);
if (arr[i - 1][j - 1] != 0) { // 判断输入的位置是否 有棋子
printf("已有棋子,请重新输入\n");
system("pause");
continue; // 直接跳过下面的进入下层循环 (下同)
}
if (i>3||i<1||j>3||j<1) { // 判断输入的位置是否 超出界限
printf("无效位置,请重新输入\n");
system("pause");
continue;
}
Place(i-1, j-1, chess); // i-1 j-1 是因为 数组下标是从0 开始
system("cls");
Show_Map();
if (Judge(chess)) { // 只需要判断 刚刚放置的棋子类型 是否能赢
switch (chess)
{
case 1:printf("白子胜利了!\n");
break;
case -1:printf("黑子胜利了!\n");
break;
}
break;
}
else if(Is_Full()) { // 如果不能赢 可以判断 棋盘是否满了
printf("平局了!\n");
break;
}
chess = -chess; // chess 为 1和-1 的好处就是 方便转换
}
system("pause");
system("cls");
}
结束
测试一下
还行。
完整代码在这
四月份/4-27 · 一点鱼/C语言练习作业 - 码云 - 开源中国 (gitee.com)https://gitee.com/OnePointFish/C-practice/tree/master/%E5%9B%9B%E6%9C%88%E4%BB%BD/4-27
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)