#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:说明变量在程序执行过程中可被隐含的改变
*/