问题提出
学C语言不久,尝试做三子棋,苦恼于获胜条件,胜利条件该怎么写才能在改变棋盘大小的情况下不影响胜利条件,例如在5*5的棋盘上仍是3子获胜。
一开始写三子棋的我就是是简单的罗列出在3*3棋盘三子棋获胜的所有条件进行判断,但是一旦改变了棋盘的大小或者胜利的条件,代码就完全废除了。
查阅了别人的文章也没有好的解决方法,大部分都是局限于3*3的棋盘,或者就是获胜条件不能更改。
最终潜力爆发,想出来解决方法,但是仍有改进空间!
问题概述
程序主体
关于三子棋的整体逻辑我就不赘述了,稍微简单介绍一下。
主函数用来调出菜单,并判断是否进入游戏:
#define _CRT_SECURE_NO_WARNINGS 1 #include"Sanziqi.h" int main() { int input = 0; do { menu(); printf("请选择(0或1):"); scanf("%d", &input); srand((unsigned int)time(NULL)); switch(input) { case 1: system("cls");//清屏 Rule();//跳出规则,如果改变棋盘大小和胜利条件,此处也应该修改 Game();//游戏的主体函数 break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }
将所有的函数声明都放入在"Sanziqi.h"中 。
想要实现改变获胜条件,最最最重要的则是Tiaojian的定义,通过改变Tiaojian则可以改变获胜条件,如改成4则会变为四子棋,实现的步骤请看下文。
#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 3 #define COLUMN 3 //改变ROW COLUMN就可以改变棋盘大小 #define Tiaojian 3 #include<stdio.h> #include<stdlib.h> #include<time.h> void menu(); void Rule(); void Game(); void Initialize_Board(char board[ROW][COLUMN]); void Display_Board(char board[ROW][COLUMN]); void Player_change_Board(char board[ROW][COLUMN]); char Judge(char board[ROW][COLUMN]); void Computer_change_Board(char board[ROW][COLUMN]); int Isfull(char board[ROW][COLUMN]);
以下是此次游戏的逻辑,初始化棋盘,展示棋盘
{玩家输入棋子坐标,展示棋盘,判断是否获胜,电脑输入棋子坐标,展示棋盘,判断是否获胜}
直到{}内的步骤确定玩家获胜还是电脑获胜,结束此次游戏,回到菜单。
补充一点,由于棋盘是固定的,所以传参只要根据头文件中定义的ROW和COLUMN,也就是棋盘的行和列为已知的,所以只需要输入数组名就可以改变棋盘内容,判断胜负。
void Game() { char board[