三子棋 步步为谋 细致拆分 (更侧重思想) 以及打此代码*3的感悟(未完待续)

颜色块   灰色加粗斜体  三子棋框架

颜色块  变色灰色加粗斜   变色颜色块  变色加粗斜体  加粗灰色斜体在细化实现

首先 写三子棋我们需要框架

框架思想:我们想这个游戏能   玩好几次 所以 用do...while()循环

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);

	} while (input);
	return 0;
}

                    *代码运行我们先打印出一个菜单menu()

void menu()
{
	printf("*********************************\n");
	printf("*********** 1 .game   ***********\n");
	printf("*********** 0 .exit   ***********\n");
	printf("*********************************\n");

}

                 之后让玩家选择:输入1:玩游戏 . 输入0:退出游戏 . 输入其他数字 :提醒玩家 输入错误

                       玩家选择 我们利用switch语句

#include <stdio.h>
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束!\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

框架结束 我们来实行game()这个函数

 

  1     *三子棋 我们首先要有一个棋盘 并且为了下棋 我们要在之后下棋的地方 先变成空格‘  ’

void game()
{
    char ret = 0;
	char board[ROW][COL] = { 0 };
    InitBoard(board,ROW,COL);
}
void InitBoard(char board[ROW][COL],int row,int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

  2     打印棋 如果我们直接打印 (都为空格,就是三行空格,什么都没有 我们应该打印出棋                 盘的模样)    ex:        

                        看上图如何实现:其实打印的为  空格 竖线 空格 ... 三个小下划线 竖线 ...

void DisplayBoard(char board[ROW][COL],int row,int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		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)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

3 4       玩家下棋  电脑下棋

                玩家下棋  玩家不是程序员 不知道 数组下标从0开始  玩家下棋的位置是否在棋盘内 玩家下棋的位置 是否被占用玩家下棋的位置用‘*’表示

void Playermove(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("玩家下棋\n");
	printf("请选择:>\n");
	do
	{
		scanf("%d %d", &i, &j);
		if (i > 0 && i < row + 1 && j>0 && j < col + 1)
		{
			if (board[i-1][j-1] == ' ')
			{
				board[i-1][j-1] = '*';
				break;
			}
			else
				printf("坐标已被占用,请重新选择:>\n");
		}
		else
			printf("坐标非法访问!请重新选择:\n");
	} while (1);
}

                电脑下棋产生随机数 去下棋(位置合法 ) 位置没被占用(利用do..while(1)一直循环 直到找到位置下棋 用break;跳出去) 用‘#’表示电脑下棋

                                (随机数rand 需要srand 只需调一次我们放在int main里)

void Computermove(char board[ROW][COL], int row, int col)
{
	int x = rand() % row;
	int y = rand() % col;
	printf("电脑下棋:\n");
	do
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	} while (1);
}

 5       判断输     

                        * 横/ 竖/ 斜 连着同   判断不是空格棋盘是否有地方能再下棋(用一个函数 for循环棋盘若无‘ ’返回‘Q’  有则返回‘C’继续下)      玩家赢返回‘*’   电脑赢返回‘#’  平局返回‘Q’   继续返回“C”

int if_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
	//判断行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
			return board[i][1];
	}
	//判断列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
			return board[1][j];
	}
	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (if_full(board, row, col) == 1)
	{
		return 'Q';
	}
	return 'C';
}

代码太长 我们分装他

 放声明 放函数实现 放主函数

差不多按思路走一遍 你就可以自己动手完成三子棋了~

感悟 :

        我第一次打三子棋实在听完思路和看完操作的半个月后(电脑坏了 邮回家去修)我当时恶补代码因为太久没打手生 我之后发现三子棋这个代码时 我内心抗拒 我当时照着记下的代码按思路顺序敲 换句话说有运行顺序的copy   我敲了一下午  全部敲完我在运行 出现一堆bug 我凌乱了 想着敲了一下午的代码 我脑子疼 明个再说 就一直拖 最后 这代码 被我删了

        我第二次敲 用了两个小时? 我机智了 我敲一部分 就运行 (但也到打印棋盘处),之后又敲敲敲 再然后运行 我又裂开了 代码不报错 但跑不起来  我对比代码 发现我找不到错     但这次没无疾而终  我找了个高手帮我看 他教调试代码 去寻找错误(调试 老有用了 自己找错 真的爽!)然后 我俩找到 一个大错误我去修改 我还没改完 就着急又去上课 下课剩我自己 我继续改那个大错 我运行发现还不行 利用他教我的调试 继续找错 嘿嘿我自己发现了bug 我记得我当时老开心了 就能自己找错(我之前对比代码 还找不到 老烦躁了)(没对比 没伤害)于是 我的代码运行成功了!

        我第三次敲之前:我又详细的听了一遍思路 看了操作 看了以便实现 我对这个代码的大框理解更深了 我发现拆分来看 这代码也不是很难 你一个个分 一个个实现 其实每个都不难 就有些循环套着你小心点 别晕就行 注意数据类型(我第二次代码的错误)   我这次是靠自己自己边回忆思路 边思考实现 敲的 并且 实现一大的步骤我 一部分 运行一次  有bug去调试  代码比上两次轻松的跑了起来  就nice!

总结:

       不要怕太长代码 拆分实现都不算难 像三子棋 二维数组元素都改为‘ ’,电脑下棋 随机生成数字,判断输赢 利用for循环 看连着三个是否相同........

        要自己能思考代码 的实现 和设计

        太长的代码 要实现一部分 就跑一下 去查bug

        代码有错 一定要去调试

        最后 熟能生巧 要自己理解和感悟

        长代码-->一个框架 思想 填充一堆短代码实现

唉 我不过敲了三次 就有这些感悟 等未来 我再敲三子棋 是手到擒来 还是会产生新的 更深的理解 我不知道 那就未来再补充我的未来感悟吧~

所以 标题感悟(未完待续)

           

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值