2024年C C++最全【C】三子棋 VS 扫雷_三子棋扫雷,2024年最新阿里技术专家

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


### game.c



#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//满了返回1
//不满返回0
int isfull(char board[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ’ ')
return 0;
}
}
return 1;
}

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] = ’ ';
}
}
}

void displayboard(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");
	}
}	

}

void palyermove(char board[ROW][COL], int row, int col)
{
while(1)
{
int x = 0;
int y = 0;
printf(“玩家下棋\n”);
printf(“请输入坐标:>”);
scanf(“%d%d”, &x, &y);
if (x > 0 && x <= 3 && y > 0 && y <= 3)
{
if (board[x - 1][y - 1] == ’ ')
{
board[x - 1][y - 1] = ‘*’;
break;
}
else
{
printf(“坐标被占用,请重新选择\n”);

		}
	}

	else
	{
		printf("坐标非法,请重新输入\n");
		
	}
}

}

void computermove(char board[ROW][COL], int row, int col)
{
printf(“电脑下棋\n”);
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ’ ')
{
board[x][y] = ‘#’;
break;
}
}
}

char iswin(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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
	return board[1][1];
}
//棋盘满了,在上面几个判断完后
//到这里说明平局了
if (isfull(board, row, col))
{
	return 'q';
}
//上面都不满足游戏继续
return 'c';	

}


### 实现效果,待改进,不足之处


![在这里插入图片描述](https://img-blog.csdnimg.cn/ed20bab260354887b579bc8dce559393.png)


**1.电脑下棋是生成随机数随机落子,也就是它不会根据玩家的棋子位置进行堵棋,电脑赢不了玩家。。。**


**2.判断输赢部分写死了,只适合三子棋盘上进行三子棋的判断输赢,后面有时间我再研究改进更新!**




---


## 💻扫雷


### 实现思路


**(main.c)是主函数测试部分**  
 **(game.c)是游戏功能具体实现部分**  
 **(game.h)是函数声明部分**


![在这里插入图片描述](https://img-blog.csdnimg.cn/3d10a00268304fddafa451299dbe0d2a.png)  
 **这是一个扫雷的棋盘,同样的这样的棋盘实质上是一个数组,比如我们扫雷的棋盘是9 \* 9的大小,如果我们要排雷的位置位置不是雷的话,这个位置就显示周围一圈雷的个数,而如果将数组大小设置为9行9列的话,而排雷位置在边界,在计算周围雷的个数时就会出现数组越界的情况,所以为了方便这里我们将数组扩大一圈数组大小设置为11行11列,而布雷和排雷只在中间9 \* 9的范围内进行!  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d163c615b261445dbed9bd6dc1e0d2a7.png)  
 我们定义俩个不同的数组,一个是布雷的数组,一个是玩家排雷的数组,排雷过程中会计算布雷数组中的信息反馈到排雷数组中显示,屏幕上只显示排雷数组中的内容。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c9f990ddf14e4b249965037f7998a6ef.png)  
 定义好俩个数组后,对俩个数组中的内容进行初始化,未布雷的棋盘中初始化为字符’0’,而未排雷的棋盘中初始为字符’#'。**


**然后用rand函数随机布置雷(字符’1’),雷的个数不必写死,利用宏定义的标识符常量可以做到灵活设置雷的个数。**


**最后一部分实现排雷过程,排雷位置是雷则被炸死,游戏失败,不是雷则通过计算布置雷数组中位置周围雷的个数存放到排雷数组中并显示排雷数组中的内容;**


**这里介绍如何计算周维雷的个数:布雷的数组中’0’不是雷,'1’是雷,这里的0和1是字符,1 + ‘0’ = ‘1’,0 + ‘0’= ‘0’;所以我们将排雷坐标周围的八个字符加起来然后减去8 \* ‘0’得到的就是这个坐标周围雷的个数,这个结果再加上字符’0’,得到字符数字放到排雷的数组中。**


**还可以实现俩个功能,对位置进行标记 ‘-’ ,把没有雷的地方展开一片,这里展开一片功能的实现要用到递归,递归要满足3个条件:**


1. **该坐标不是雷**
2. **该坐标周围没有雷**
3. **该坐标没有被排查过**


**否则就会死递归!**


**判断输赢我这里这样实现:棋盘大小-雷的个数-不是 ‘\*’ 和 ‘-’ 等于0,就表明扫雷成功了!**


### game.h



#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//雷盘范围,可灵活更改
#define ROW 9
#define COL 9

//防止计算周围雷的个数时数组越界
#define ROWS ROW+2
#define COLS COL+2

//可更改雷的个数
#define EASY_COUNT 10

void initboard(char board[ROWS][COLS], int rows, int cols,char set);

void displayboard(char board[ROWS][COLS], int row, int col);

void setMine(char board[ROWS][COLS], int row, int col);

void findMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);


### main.c



#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void menu()
{
printf(“|------1.play------|\n”);
printf(“|------0.exit------|\n”);
}

void game()
{
//布置雷的棋盘
char mine[ROWS][COLS] = { 0 };
//玩家进行排雷的棋盘
char show[ROWS][COLS] = { 0 };
//初始化雷盘’0’
initboard(mine,ROWS,COLS,‘0’);
//初始化排雷棋盘’*’
initboard(show, ROWS, COLS, ‘*’);
//布置雷
setMine(mine, ROW, COL);
//显示雷盘,只显示排雷的棋盘
/*displayboard(mine,ROW,COL);*/
displayboard(show, ROW, COL);
//实现排雷过程
findMine(mine,show, ROW, COL);
}

int main()
{
srand((unsigned)time(NULL));
int input = 0;
//首先显示一个游戏菜单
do
{
menu();
printf(“请选择:>”);
scanf(“%d”, &input);

	switch (input)
	{
	case 1:
		//实现扫雷功能
		game();
		break;
	case 0:
		printf("退出游戏\n");
		break;
	default:
		printf("选择错误,请重新输入\n");
		break;
	}

} while (input);

return 0;

}


### game.c



#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}

void displayboard(char board[ROWS][COLS], int row, int col)
{
printf(“------扫雷游戏------\n”);
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf(“%d “, j);
}
printf(”\n”);
for (i = 1;i <= row;i++)
{
printf(“%d “, i);
for (j = 1; j <= col; j++)
{
printf(”%c “, board[i][j]);
}
printf(”\n”);

}
printf("------扫雷游戏------\n");

}

void setMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;

	if (board[x][y] == '0')
	{
		board[x][y] = '1';
		count--;
	}
}

}

int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
+ mine[x][y - 1] + mine[x][y + 1]
+ mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * ‘0’;

}

void sign(char show[ROWS][COLS])
{
int i = 0;
int x = 0, y = 0;
do
{
printf(“标记坐标?(1:是/0:否/2:对已标记的坐标取消)>”);
scanf(“%d”, &i);
switch (i)
{
case 0:
break;
case 1:
printf(“输入标记位置坐标:>”);
scanf(“%d%d”, &x, &y);
if (show[x][y] != ‘*’||show[x][y] == ‘-’)
{
printf(“这个位置再不能进行标记了\n”);
}
else
{
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
show[x][y] = ‘-’;
displayboard(show, ROW, COL);
}
else
{
printf(“坐标非法,请重新输入!\n”);
}
}
break;
case 2:
printf(“输入要取消标记的坐标:>”);
scanf(“%d%d”, &x, &y);
if (show[x][y] != ‘-’)
{
printf(“这个坐标未进行标记,重新输入\n”);
}
else
{
show[x][y] = ‘*’;
displayboard(show, ROW, COL);
}
break;
default:
printf(“选择错误,请重新输入\n”);
break;

	}
} while (i);

}

void unfold1(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
int i = 0;
int j = 0;
int flag = 1;
if (show[x][y] == ‘*’ || show[x][y] == ‘-’ )
{
flag = 0;//没有被排查过的
}
int count = get_mine_count(mine, x, y);
if (count == 0)
{
show[x][y] = ’ ';
}
else
{
show[x][y] = count + ‘0’;
}
if (flag == 0 && count == 0)
{
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)//对其周围的8个坐标递归
{

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

count + ‘0’;
}
if (flag == 0 && count == 0)
{
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)//对其周围的8个坐标递归
{

[外链图片转存中…(img-3LWT4Hgx-1715533487578)]
[外链图片转存中…(img-uoifUbww-1715533487579)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值