c语言入门 day8

今天早上学习了扫雷程序的编码,经过昨天三子棋的学习,今天学习过程比较顺利。

扫雷代码如下

//头文件
#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值