对于编程小白来说,能做一款属于自己的小游戏是一场无与伦比的自豪体验,而三子棋的出现,则满足了编程小白实现了这个梦想。
那么今天就让我们来探究一下如何实现三子棋的编程->
建议自取代码阅读更有帮助 三子棋
在正式敲代码前,我们要先理清楚模块,这点对我们后来的系统性编程有很重要的铺垫作用
这次的编程我们一共用到三个文件:
- text.c文件:用来实现游戏基本框架(可以理解为游戏开始界面)
- game.c文件:用来实现游戏主体内容
- game.h文件:用来连接 text.c 和 game.c 的文件
1.text.c文件
我们要如何实现一个游戏呢?
- 菜单必不可少
- 供玩家自由选择开始游戏或者退出游戏
- 游戏的结束(即代码的结束)
所以我们将main函数放入text.c文件中,来实现整体框架
先构建main函数框架
int main() { menu(); return 0; }
1.游戏菜单:我们用menu来创建
void menu() { printf("************************\n"); printf("*********1.play*********\n"); printf("*********0.exit*********\n"); printf("************************\n"); }
2.玩家选择项的实现,以及循环结束条件(该代码只要不选择停止,将会一直进行游戏),game()为进入游戏主体代码,后面开始完成该代码
int main() { int input = 0; do { 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 != 0); return 0; }
2. game.c文件
在开始写游戏之前,我们要先确认我们需要那些步骤
对于棋盘:
对于棋手:
确定步骤后,我们用game.c文件来实现游戏主体
1.初始化棋盘
假设我们想要一个正方形棋盘,我们选择用宏定义的方式来设计棋盘大小,然后初始化棋盘元素,这样便于修改棋盘大小
#define ROW 3 #define COL 3
void game() { char board[ROW][COL] = { 0 }; Initboard(board,ROW,COL); }
void Initboard(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++) { board[i][j] = ' '; } }
2.打印棋盘
我们用如下代码便可实现棋盘打印(读者自行阅读代码细节)
void game() { char board[ROW][COL] = { 0 }; Initboard(board,ROW,COL); Displayboard(board, ROW, COL); }
void Displayboard(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) { for (int j = 0; j < COL; j++) { printf("---"); if (j < COL - 1) printf("|"); } } printf("\n"); } }
以上两个步骤可以实现如下图形,可见棋盘创建完成!
3.玩家移动,此处需要注意两点
- 玩家输入坐标和实际坐标是不吻合的,会差1,这是因为数组下标的定义
- 判断该处有没有落子,如有落子,则需要继续输入其他坐标
代码如下
void game() { char board[ROW][COL] = { 0 }; Initboard(board,ROW,COL); Displayboard(board, ROW, COL); Player_move(board, ROW, COL); Displayboard(board, ROW, COL); }
void Player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("请输入坐标:->"); scanf("%d %d", &x, &y); if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else printf("坐标输入错误,请重新输入!\n"); } }
4.电脑移动,此处需要注意一点,如何实现电脑的随机落子,这里我们用rand()函数实现,rand函数详解
void Computer_move(char board[ROW][COL], int row, int col) { while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
void game() { char board[ROW][COL] = { 0 }; Initboard(board,ROW,COL); Displayboard(board, ROW, COL); while (1) { Player_move(board, ROW, COL); Displayboard(board, ROW, COL); Computer_move(board, ROW, COL); Displayboard(board, ROW, COL); } }
5.判断输赢
void game() { char board[ROW][COL] = { 0 }; Initboard(board,ROW,COL); Displayboard(board, ROW, COL); char ret = 0; while (1) { Player_move(board, ROW, COL); Displayboard(board, ROW, COL); ret=Win(board, ROW, COL); if (ret != 'C') break; Computer_move(board, ROW, COL); Displayboard(board, ROW, COL); ret=Win(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') printf("玩家获胜!\n"); else if (ret == '#') printf("电脑获胜!\n"); else if (ret == 'Q') printf("平局!\n"); }
3.game.h文件
game.h的作用是声明函数,在每个.c文件中都加入 #include"game.h" 就可以拥有game.h中的一切声明
这里的pragma就就供读者自学了
#pragma once #include<stdlib.h> #include<time.h> #include<stdio.h> #define ROW 3 #define COL 3 void game(); void Displayboard(char board[ROW][COL], int row, int col); void Initboard(char board[ROW][COL], int row, int col); void Player_move(char board[ROW][COL], int row, int col); void Computer_move(char board[ROW][COL], int row, int col); char Win(char board[ROW][COL], int row, int col);
极限刺激的三子棋就这么完成,如果读者有收获的话,给个小小的赞呗!