2021-07-07

#include <iostream>
#include <stdlib.h>//system()
//#include <studio.h>//46行
#define  INITSHOW 0x80//1000 0000初始化@
#define  MAKEMINE 0x40//0100 0000炸弹#
#define  MINESHOW 0x20//0010 0000显示炸弹
#define  MAKESUM  0x10//0001 0000显示炸弹个数
#define  CLSINIT 0x7f//0111 1111
#define  PRINTSUM 0x0F//0000 1111  15=F
#define  MINENUM  25//一个字节8个二进制位,128个ASII码,用7个表示
#define  ROWSIZE  10
#define  COLSIZE  10
typedef unsigned Grid[ROWSIZE + 2][COLSIZE + 2];
using namespace std;

/*void Init_Num(Grid ar, int row, int col)
{

}

void Init_Mine(Grid ar, int row, int col)
{

}

void Init_InitShow(Grid ar, int row, int col)
{
	for (int i = 1; i <= row; ++i)//行,将第0行剔除
	{
		for (int j = 1; j <= col; ++j)//列
		{
			   ar[i][j] = INITSHOW;//初始化,1000 0000
		}
	}
}*/
void Init_Ar(Grid ar, int row, int col)//埋雷
{//将最高二进制设为1
	for (int i = 1; i <= row; ++i)//行,将第0行剔除
	{
		for (int j = 1; j <= col; ++j)//列
		{
			ar[i][j] = INITSHOW;//初始化,1000 0000
		}
	}
	//将第六位数设为1,即雷
	int i = 0;
	while (i < MINENUM)
	{
		int r = rand() % ROWSIZE + 1;
		int c = rand() % COLSIZE + 1;//随机抽位置
		if (!(ar[r][c] & MAKEMINE))//如果无雷,(ar[r][c] & MAKEMINE)==0
		{                                                //0100 0000      
			ar[r][c] = (ar[r][c] | MAKEMINE);
			++i;//循环
		}	
	}
	//计算旁边雷的个数
	for (int r = 1; r <= row; ++r)
	{
		
		for (int c = 1; c <= col; ++c)
		{
			if (!(ar[r][c] & MAKEMINE))//无雷
			{
				int num = 0;
			for (int i = r - 1; i <= r + 1; ++i)//为什么没有else?
				{
					for (int j = c - 1; j <= c + 1; ++j)//三宫格式,9个
					{
						if (ar[i][j] & MAKEMINE)//(ar[i][j] & MAKEMINE)!=0,有雷
						{
							num += 1;
						}
					}
				}
				ar[r][c]=(ar[r][c] | MAKESUM);//0011 0000 &0000 1111
				ar[r][c] =ar[r][c]|( num & PRINTSUM);//0000 0000,初始化@|0100 0000=0100 0000
			}                                        //该有雷的还是有,清除高4位
		}
	}
}

//将旁边雷的个数输出
void Print_Ara(Grid ar, int row, int col)
{
	//system("cls");
	printf("  ");//将第一个空出(0,0),左角空格,两个英式空格
	for (int i = 1; i <= col; ++i)
	{
		printf("%2d", i);
	}//输出行上的数字,1~10
	printf("\n");
		for (int i = 1; i <= row; ++i)
		{
			printf("%2d", i);//输出列上的数字,1~10
		for (int j = 1; j <= col; ++j)
		{
			if (ar[i][j] & MINESHOW)//!=0,有雷
			{
				printf("%2c", '#');
			}
			else if (ar[i][j] & INITSHOW)//与初始化相同的,输出@
			{
				printf("%2c",'@');
			}
			else
			{
                printf("%2d", ar[i][j] & PRINTSUM);//输出雷的个数
			}
		}
		printf("\n");
	}
		printf("\n");
}

int main()
{
	Grid ar = {};//数组
	Init_Ar(ar, ROWSIZE, COLSIZE);//调用
	int num = 0;
	int r, c;
	char ch;
	while (num < MINENUM)
	{
		system("cls");//清屏操作
		Print_Ara(ar, ROWSIZE, COLSIZE);
		printf("input row col select(#,0,@\n)");
		scanf_s("%d %d %c", &r, &c, &ch);
		if (r >= 1 && r <= ROWSIZE && c >= 1 && c<= COLSIZE)
		{
			if (ch == '0')//#,0,@
			{
				if (ar[r][c] & MAKEMINE)//!=0,有雷
				{
					printf("炸死了");
					getchar();//得ch
					break;
				}
				ar[r][c] = (ar[r][c] & CLSINIT);//1000 0000 & 0111 111=0000 0000,显现后回归@
			}
			else if (ch == '#')
			{
				if (ar[r][c] & MAKEMINE)//!=0
				{
					num += 1;
					ar[r][c] = (ar[r][c] & CLSINIT);//0000 0000
					ar[r][c] = (ar[r][c] | MINESHOW);//=0100 0000,显现个数
				}
			}
			else if (ch == '@')
			{

			}
			else
			{
				printf("select error\n");
			}
		}
		else
		{
			printf("row col error\n");
		}
	}
	return 0;
}

C语言的关键字:
1.数据类型的关键字
   char:声明字符型变量或函数
   double:声明双精度变量或函数
   enum:声明枚举类型
   float:声明浮点型变量或函数
   int:声明整型变量或函数
   long:声明长整型变量或函数
   short:声明短整型变量或函数
   signed:声明有符号类型变量或函数
   struct:声明结构体变量或函数
   union:声明共用体(联合)数据类型
   unsigned:声明无符号类型变量或函数
   void:声明函数无返回值或无参数,声明无类型指针
2.控制语句的关键字:变量或函数
A.循环语句
   for:一种循环语句
   do:循环语句的循环体
   while:循环语句的循环条件
   break:跳出当前循环
   contine:结束当前循环,开始下一轮循环
B.条件语句
   if:条件语句
   else:条件语句否定分支
   goto:声明无条件
C.开关语句
  switch:用于开关语句
  case:开关语句分句
  default:开关语句中的‘其他’分支
D:返回语句:
  return:子程序返回语句
3.存储类型关键字:
  auto:声明自动变量,一般不使用
  extern:声明其他变量在文件正声明
  register:声明寄存器变量
  static:声明静态变量
4.其他关键字:
  const:声明只读变量
  sizeof:计算数据类型长度
  typedef:用以给数据类型取别名
  volatile:说明变量在程序执行过程中可被隐含的改变
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值