前言:
往期给大家介绍了用C语言实现三子棋,今天我将在三子棋的基础上升级为五子棋,来跟着阿C看看吧。
注:建议先学会写三子棋,可以看我的往期博客 C语言三子棋游戏实现(基础版)
初学C语言的小伙伴放心食用~~~
目录
❤️1.巧用宏定义
进阶要求:
自定义棋盘大小
更普遍的输赢判断方法
1.巧用宏定义
像这样的就是宏定义:
#define ROW 3
#define COL 3
宏定义最大的好处是“方便程序的修改”,使用宏定义可以用宏代替一个在程序中经常使用的常量
使用宏定义之后,我们就可以一键修改经常使用的常量,如:
char board[ROW][COL];
init_board(board, ROW, COL);
print_board(board, ROW, COL);
这为经常使用的常量的修改提供了便利。
2.打印棋盘
先来回顾下往期是如何打印棋盘的:
void print_board(char board[3][3], int row, int col) { int i = 0; for (i = 0; i < row; i++) { printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]); if(i<row-1) printf("---|---|---\n"); } }
因为往期明确是 3*3 的棋盘,所以只对棋盘进行了简单的拆分,与 row , col 变量关系不是很密切,灵活度不高;
而自定义棋盘意味着更高的灵活度,自然要对棋盘进一步拆分并加强与 row , col 变量的关系。
第一部分:
1 和 2 看作整体3 ,最后一个整体没有 2;
第二部分:
与第一部分类似
上代码:
void print_board(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { //printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { //printf("---|---|---\n"); for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\n"); } } }
这里定义行和列为 9 ,展示:
是不是妙哉~
3.输赢判断
增加了棋盘的格子数,五子连珠的种类大幅增加,显然不能像三子棋那样穷举,我们需要一种更普遍的判断方式,就是引入函数。
这里 i >=2 , j >= 2 ;
以 (i , j) 为中心展开,用坐标表示其他相关位置,这样就很轻易得到判断标准:
int i = 2; for (i = 2; i < row; i++) { int j = 2; for (j = 2; j < col; j++) { if (board[i][j] != ' ' && board[i][j-2] == board[i][j-1] && board[i][j-1] == board[i][j] && board[i][j] == board[i][j+1] && board[i][j+1] == board[i][j+2]) { return board[i][j]; } } } for (i = 2; i < row; i++) { int j = 2; for (j = 2; j < col; j++) { if (board[i][j] != ' ' && board[i-2][j] == board[i-1][j] && board[i-1][j] == board[i][j] && board[i][j] == board[i+1][j] && board[i+ 1][j] == board[i+2][j]) { return board[i][j]; } } } for (i = 2; i < row; i++) { int j = 2; for (j = 2; j < col; j++) { if (board[i][j] != ' ' && board[i-2][j-2] == board[i-1][j-1] && board[i-1][j-1] == board[i][j] && board[i][j] == board[i+1][j+1] && board[i+1][j+1] == board[i+2][j+2]) { return board[i][j]; } } } for (i = 2; i < row; i++) { int j = 2; for (j = 2; j < col; j++) { if (board[i][j] != ' ' && board[i-2][j+2] == board[i-1][j+1] && board[i-1][j+1] == board[i][j] && board[i][j] == board[i+1][j-1] && board[i+1][j-1] == board[i+2][j-2]) { return board[i][j]; } } }
总结:
这篇博客内容比较简单,算是对往期三子棋游戏实现的补充, 其中巧用宏定义是重要知识点,掌握了它,以后写代码就可以事半功倍哦。