一. 问题描述
用C语言分模块写出三子棋代码 游戏头文件 game.h 游戏源文件 game.c 主源文件 test.c
二. 三子棋简单描述
我们要实现一个如下三子棋(简单逻辑): 1.游戏开始,进入游戏界面,玩家自行选择是否开始游戏 2.创建一个空棋盘,让玩家可以下棋 3.创建过后,打印棋盘让玩家可以观察棋盘大小 4.玩家进行落子(以坐标形式进行落子)--(x y) 其中x(1<=x<=3) y(1<=y<=3) 5.玩家进行落子后,须判断玩家落子是否正确 6.电脑下棋 7.每一轮落子过后判断是否游戏输赢决定是否结束游戏或继续下棋
三. 三子棋步骤详解
1.菜单
1.玩家需要一个可视化的菜单 菜单应该实现可以让玩家自行选择是否游戏 在主源文件 test.c 中 代码如下:
void menu() //菜单界面 { printf("***********************\n"); printf("**1.play***0.退出游戏**\n"); printf("***********************\n"); } #include<stdio.h> int main() { int input = 0;//存储玩家的选择输入 printf(" 欢迎来到三子棋\n"); menu(); scanf("%d", input);//玩家进行选择 }
该处菜单代码可根据自行要求美化 效果展示
2.创建棋盘
菜单完成后,考虑玩家的选择,若玩家选择 1. 进行游戏则进入游戏代码模块 若选择 2.则选择退出游戏结束进程。考虑到这个游戏至少需要完成一次,因此我们写一个do while();循环来完成。由于棋盘是一个三行三列的数组,因此我们创建一个二维数组棋盘。 在主源文件 test.c 中 代码如下:
void game() { //创建棋盘 char board[ROW][COL] = { 0 };//存储棋盘 } int main() { int input = 0; srand((unsigned)time(NULL)); do { printf(" 欢迎来到三子棋游戏\n"); menu(); printf("请选择:\n"); scanf("%d", &input); switch (input) { case 1: printf("三子棋游戏开始\n"); game(); break; case 0: printf("即将退出游戏\n"); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input); return 0; }
其中,合理运用玩家的输入input的值来控制了这个循环。可以达到玩家输错后为一个非0的数字也可以继续选择,同时结束一局游戏后,又可以选择继续重新开始。
代码展示
在game.h中 定义行列大小
#define ROW 3 //三行 #define COL 3 //三列
在这使用自定义的行列有如下好处
1.提高代码可读性,防止与后续代码中出现的值歧义
2.方便后续创建一个新棋盘,更改自定义大小即可获得一个几行几列的数组
3.初始化棋盘
在创建了一个三行三列的数组后,这个棋盘里应该没有任何东西,因此须将棋盘进行初始化。
由于棋盘的初始化属于游戏模块,因此将其分装到 game.h 的头文件中进行声明,在 game.c 中进行实现(下述游戏模块的函数均如此分装不在赘述)
test.c 中代码如下:
void game() { //创建棋盘 char board[ROW][COL] = { 0 };//存储棋盘 //棋盘初始化 Initboard(board, ROW, COL); }
4.打印棋盘
在进行初始化后,玩家无法看见棋盘,因此我们需要写一个函数将棋盘打印出来,让玩家观察棋盘
test.c中代码如下:
void game() { //创建棋盘 char board[ROW][COL] = { 0 };//存储棋盘 //棋盘初始化 Initboard(board, ROW, COL); //打印初始化后的棋盘 print_board(board, ROW, COL); }
game.h中代码如下:
#define ROW 3 //三行 #define COL 3 //三列 //初始化棋盘 void Initboard(char board[ROW][COL], int row, int col); //打印棋盘 print_board(char board[ROW][COL], int row, int col);
在实现这个打印棋盘的函数时,进行逻辑分析
我们想要获得一下形式的棋盘
观察这个棋盘,我们可以将其分为:
1.数据行:玩家以及电脑落子后每一行中的数据
让每一组数据都落在中间那个空格上
2.每一行的分割行 数据 + | 第三行时没有分割行
3.每一列的分割行 _ _ _ 第三列没有分割行 _ _ _
game.c中代码如下:
print_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", board[i][j]);//打印每一行的数据 if (j < col - 1)//控制第三行没有分割行 | { printf("|");//打印每一列的分割列 } } printf("\n"); //打印完每一行后进行换行 if (i < row - 1)//控制第三列没有分割行 _ _ _ { int j = 0; for (j = 0; j < col; j++) printf("--- "); } printf("\n");//打印每一列数据后换行 } }
由于test.c 以及game.c 中都需要引用一些头文件,为更方便和简介,将这些头文件都放入game.h中,test.c 以及 game.c只需 #include“game.h” 即可使用
//函数体申明 #include<stdio.h> #include<stdlib.h> #include<time.h>
效果展示: