C语言学习过程当中会有不少有趣的实践小程序须要你们编写,这里带给你们一个常见的三子棋小游戏的代码。若是有不足之处,还望指出,感谢浏览。小程序
这里给刚开始学习或接触C语言的小伙伴分享一点我我的的经验,C语言语法的学习在于更好更高效的实现本身所想实现的程序。而无论是制做一个大的程序仍是一个小程序,都要先列出一个相应的框架,这一点在各个领域都很实用,若是把写程序比做盖房子,那么搭起程序的基本框架就至关于在给这个房子制做简单的图纸。只有有了必定的这些图纸,咱们才能更具备条理性的将本身的思惟表达在电脑上,并且不容易出现逻辑性的错误。框架
三字棋所需的功能模块函数
这里的模块即是一个一个实现相应功能的函数,咱们之因此将这些功能都分别写成函数,是由于将整个程序分为各个模块方便咱们进行调试(在咱们写程序时,不免出现一些不易察觉的错误,这时咱们就须要对咱们所写的代码进行调试,以使其正确实现咱们想要的功能,而这时将整个代码分红各个模块后,咱们就能够只调试出现错误的模块,这也间接提升了咱们开发程序的效率)。学习
我在写程序时,会首先将本身能想到的模块一一列出来:.net
菜单 + 棋盘 + 电脑 + 玩家 + 判断输赢 + 判断棋盘是否下满3d
随后将这些模块的功能一一用代码实现。调试
下面是我写的代码,若是有不足之处,很是欢迎小伙伴们积极指出。code
头文件blog
#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]); //电脑行动 #endif //_sanziqi_H
功能函数模块游戏
#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; }