今天早上学习了扫雷程序的编码,经过昨天三子棋的学习,今天学习过程比较顺利。
扫雷代码如下
//头文件
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
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 mine[ROWS][COLS],int row,int col);
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
//主函数文件
#include"game.h"
void menu()
{
printf("*****************\n");
printf("******1.paly*****\n");
printf("******0.exit*****\n");
printf("*****************\n");
}
void game()
{
//雷的信息存储
//1.布置好的雷的信息
char mine[ROWS][COLS]={0};
//2.排查出的雷的信息
char show[ROWS][COLS]={0};
//初始化
Initboard(mine,ROWS,COLS,'0');
Initboard(show,ROWS,COLS,'*');
//打印棋盘
//Displayboard(mine,ROW,COL);
Displayboard(show,ROW,COL);
//布置雷
Setmine(mine,ROW,COL);
//Displayboard(mine,ROW,COL);
//扫雷
Findmine(mine,show,ROW,COL);
}
void test()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
//自定义函数文件
#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)
{
int i=0;
int j=0;
printf("-------扫雷游戏------\n");
//打印列号
for(i=0;i<=col;i++)
{
printf("%d ",i);
}
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 mine[ROWS][COLS],int row,int col)
{
//布置十个雷
int count=EASY_COUNT;
while(count)
{
//生成随机下标
int x=rand()%row+1;
int y=rand()%col+1;
if(mine[x][y]=='0')
{
mine[x][y]='1';
count--;
}
}
}
//'1'-'0'=1,字符1减字符0为数字1
int get_mine_count(char mine[ROWS][COLS],int x,int y)
{
return mine[x-1][y]+
mine[x-1][y-1]+
mine[x][y-1]+
mine[x+1][y-1]+
mine[x+1][y]+
mine[x+1][y+1]+
mine[x][y+1]+
mine[x-1][y+1]-8*'0';
}
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x=0;
int y=0;
int win=0;
while(win<row*col-EASY_COUNT)
{
printf("请输入排查雷的坐标\n");
scanf("%d%d",&x,&y);
if(x>=1&&x<=row && y>=1&&y<=col)
{
//坐标合法
//1.踩雷
if(mine[x][y]=='1')
{
printf("很遗憾,你被炸死了\n");
Displayboard(mine,row,col);
break;
}
//2.不是雷
else
{
//计算xy周围有几个雷
int count= get_mine_count(mine,x,y);
show[x][y]=count+'0';//加字符‘0’是为了让返回的整型count变为字符‘1’
Displayboard(show,row,col);
win++;
}
}
else
{
printf("请重新输入\n");
}
if(win==row*col-EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
Displayboard(show,row,col);
}
}
}
除此之外今天还学习了操作符,其分类如下:
算术操作符、移位操作符
、位操作符
、赋值操作符
、单目操作符
、关系操作符
、逻辑操作符
、条件操作符
、逗号表式
、下标引用,函数调用和结构成员
- 算术操作符中需要注意的是:1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
- 移位操作符:分为 左移位<<(相当于乘2^n) 和 右移位>>(相当于除2^n)
右移位操作符分为①算术右移:右边丢弃,左边补原符号位
②逻辑右移:右边丢弃,左边补零
左移位操作符:左边丢弃,右边补0
- 位操作符:& //按位与 (需要都是整数)
| //按位或^ //按位异或
-
!逻辑操作符需要注意如下
int main() { int a=0; if(!a)//如果a为假,即0则打印hehe printf("hehe\n"); }
※ “~“是按位取反(二进制)
- 条件操作符 表达式:exp1 ? exp2 : exp3
例如int c=(a>b?a:b)//如果a大于b,则c=a,否则c=b
- 函数结构表达式
struct stu
{
char name[20];
}
int main()
{
struct stu s1={"张三"};
printf("%s",s1.name);
//或者如下
struct stu* ps=&s1;
printf("%s",(*ps).name);
//或者 结构体变量.成员名
printf("%s",ps->name);
// 结构体指针->成员名
}
- 整形提升 :C的整型算术运算总是至少以缺省整型类型的精度来进行的。 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
如1000 0001(补码) 提升后为 1111 1111 1111 1111 1111 1111 1000 0001
即是按照变量数据类型的符号位提升的,符号位补高位
- 算术转换
//排名从高到低 long double double float unsigned long int long int unsigned int int