C语言三子棋

    xiaoxiao2021-04-15  379

    三子棋

    今天我花了好长时间按做这个三子棋,希望大家能够喜欢,有兴趣朋友可以下载玩玩

    话不多说,源码呈上 代码分为三个文件,一个是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; }

    好了,就分享到这了, 愿对你有帮助的你能收获,没有帮助的睡一觉忘掉。 希望能帮助到你,嘿嘿,随后我会上传扫雷 如果代码有什么错误,希望您能指点,您的点滴指点就是对我最大的鼓励。 共同学习,共同交流,共同进步。 祝福您每天幸福快乐!


    最新回复(0)