背景
C语言学习过程中会有很多有趣的实践小程序需要大家编写,这里带给大家一个常见的三子棋小游戏的代码。如果有不足之处,还望指出,感谢浏览。
框架
这里给刚开始学习或接触C语言的小伙伴分享一点我个人的经验,C语言语法的学习在于更好更高效的实现自己所想实现的程序。而不管是制作一个大的程序还是一个小程序,都要先列出一个相应的框架,这一点在各个领域都很实用,如果把写程序比作盖房子,那么搭起程序的基本框架就相当于在给这个房子制作简单的图纸。只有有了一定的这些图纸,我们才能更具有条理性的将自己的思维表达在电脑上,而且不容易出现逻辑性的错误。
三字棋所需的功能模块
这里的模块便是一个一个实现相应功能的函数,我们之所以将这些功能都分别写成函数,是因为将整个程序分为各个模块方便我们进行
调试(在我们写程序时,难免出现一些不易察觉的错误,这时我们就需要对我们所写的代码进行调试,以使其正确实现我们想要的功能,而这时将整个代码分成各个模块后,我们就可以只调试出现错误的模块,这也间接提高了我们开发程序的效率)。
我在写程序时,会首先将自己能想到的模块一一列出来:
菜单 + 棋盘 + 电脑 + 玩家 + 判断输赢 + 判断棋盘是否下满
随后将这些模块的功能一一用代码实现。
运行程序
源代码
下面是我写的代码,如果有不足之处,非常欢迎小伙伴们积极指出。
头文件
#ifndef _sanziqi_H #define _sanziqi_H #include <time.h> #include <stdio.h> #include <stdlib.h> void init_chess(char arr[3][3]); //初始化棋盘 void print_chess(char arr[3][3]); //打印棋盘 void menu(); //菜单 int whom_act(); //选择谁先行动 int chess_full(char arr[3][3]); //判断棋子是否下满 char jud_win(char arr[3][3]); //判断输赢 void player_act(char arr[3][3]); //玩家行动 void computer_act(char arr[3][3]); //电脑行动
功能函数模块
#include "sanziqi.h" void init_chess(char arr[3][3]) //初始化棋盘 { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { arr[i][j] = ' '; } } } void print_chess(char arr[3][3]) //打印棋盘 { printf("\n"); for (int i = 0; i < 3; i++) { printf("%c | %c| %c\n", arr[i][0], arr[i][1], arr[i][2]); if (i < 2) { printf("—+—+—\n"); } } printf("\n"); } void menu() //菜单 { printf("****************************\n"); printf("** 1.开始游戏 **\n"); printf("** **\n"); printf("** 0.退出游戏 **\n"); printf("****************************\n"); } int whom_act() //选择谁先行动 { int input = 0; printf("****************************\n"); printf("** 1.电脑先手 **\n"); printf("** **\n"); printf("** 0.玩家先手 **\n"); printf("****************************\n"); while (1) { printf("请选择谁先落子:>"); scanf_s("%d", &input); if (input == 1) return 1; else if (input == 0) return 0; else printf("选择错误,请重新选择。\n"); } } int chess_full(char arr[3][3]) //判断棋子是否下满 { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (arr[i][j] == ' ') return 0; } } return 1; } char jud_win(char arr[3][3]) //判断输赢 { for (int i = 0; i < 3; i++) { if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][0] != ' ')) return arr[i][0]; else if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[0][i] != ' ')) return arr[0][i]; else if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] != ' ')) return arr[1][1]; else if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] != ' ')) return arr[1][1]; } return ' '; } void player_act(char arr[3][3]) //玩家行动 { int x = 0; int y = 0; while (1) { printf("请落子(即输入对应x,y坐标):>"); scanf_s("%d,%d", &x, &y); if (arr[--x][--y] == ' ') { arr[x][y] = 'X'; break; } else { printf("您选择的位置已有棋子,请重新选择。\n"); } } } void computer_act(char arr[3][3]) //电脑行动 { srand((unsigned)time(NULL)); while (1) { int x = rand() % 3; int y = rand() % 3; if (arr[x][y] == ' ') { arr[x][y] = 'O'; break; } } }
主体函数
#include <stdio.h> #include <time.h> #include <stdlib.h> #include "sanziqi.h" int main() //主函数 { int input = 0; char arr[3][3] = { 0 }; do { menu(); printf("请选择你想进行的动作:>"); scanf_s("%d", &input); switch (input) { case 1: init_chess(arr); if (whom_act()) { while (1) { computer_act(arr); print_chess(arr); if ((jud_win(arr)) == 'X') { printf("玩家赢\n"); break; } else if ((jud_win(arr)) == 'O') { printf("电脑赢\n"); break; } player_act(arr); print_chess(arr); if ((jud_win(arr)) == 'X') { printf("玩家赢\n"); break; } else if ((jud_win(arr)) == 'O') { printf("电脑赢\n"); break; } else if (chess_full(arr)) { printf("平局\n"); break; } } } else { while (1) { print_chess(arr); player_act(arr); print_chess(arr); if ((jud_win(arr)) == 'X') { printf("玩家赢\n"); break; } else if ((jud_win(arr)) == 'O') { printf("电脑赢\n"); break; } computer_act(arr); print_chess(arr); if ((jud_win(arr)) == 'X') { printf("玩家赢\n"); break; } else if ((jud_win(arr)) == 'O') { printf("电脑赢\n"); break; } else if (chess_full(arr)) { printf("平局\n"); break; } } } break; case 0: printf("正在退出游戏\n"); break; } } while (input); return 0; }