本部分包含数组练习题 落雷游戏。
代码部分:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS 11
#define COLS 11
void menu()
{
printf("****************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("****************\n");
}
//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int row, int col, char set)
{
for (int i = 0;i < row;i++)
{
for (int j = 0;j < col;j++)
{
arr[i][j] = set;
}
}
}
//打印棋盘
void displayBoard(char arr[ROWS][COLS], int row, int col)
{
printf("--扫雷游戏--\n");
for (int i = 0;i <= col;i++)
{
printf("%d", i);
}
printf("\n");
for (int i = 1;i <= row;i++)
{
printf("%d", i);
for (int j = 1;j < col;j++)
{
printf("%c", arr[i][j]);
}
printf("\n");
}
printf("--扫雷游戏--\n");
}
void setMined(char arr[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 10;
while (count != 0)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = 'x';
count--;
}
}
}
//检查周围有多少地雷
int findMinedCount(char mine[ROWS][COLS], int x, int y)
{
int count = 0;
for (int i = -1;i <= 1;i++)
{
for (int j = -1;j <= 1;j++)
{
if (mine[x + i][y + j] == 'x')
count++;
}
}
return count;
}
int findMined(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
printf("请输入排查坐标:");
scanf("%d %d", &x, &y);
//检查输入是否合法
if (x > 0 && x <= row && y > 0 && y <= col)
{
//1.炸死
if (mine[x][y] == 'x')
{
printf("被炸死啦\n");
show[x][y] = 'x';
displayBoard(show, ROW, COL);
return 0;
}
//2.没被炸死
else if (mine[x][y] == '0')
{
int count = 0;
//检查周围有多少地雷
count = findMinedCount(mine, x, y);
show[x][y] = '0' + count;
displayBoard(show, ROW, COL);
}
}
else
{
printf("输入不合法");
}
}
void game()
{
//创建棋盘
char landmine[ROWS][COLS] = { 0 };//存放地雷信息
char show[ROWS][COLS] = { 0 };//存放棋盘信息
//初始化棋盘
InitBoard(landmine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
displayBoard(show, ROW, COL);
//设置雷
setMined(landmine, ROW, COL);
displayBoard(landmine, ROW, COL);
//排查雷
int set = 1;
int win = 0;
while (set)
{
set = findMined(landmine, show, ROW, COL);
win++;
if (win == 71)
break;
}
printf("游戏胜利!!!");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:》");
scanf("%d", &input);
switch (input)
{
case 1:
printf("game扫雷开始\n");
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
代码实现:
笔记部分:
- 数组
- 5.1 概述
- 所谓数组,就是一个集合,里面存放了相同类型的数据元素
- 特点1:数组中的每个数据元素都是相同的数据类型
- 特点2:数组是由连续的内存位置组成的
- 例图:
- 5.2 一维数组
- 5.2.1 一维数组定义方式
- 一维数组定义的三种方式:
- 数据类型 数组名[ 数组长度 ];
- 数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
- 数据类型 数组名[ ] = { 值1,值2 ...};
- 图示:
- 注意:如果在初始化数据的时候,没有全部填写完,会用0来填补剩余数据+数组长度必须是常量
- 总结1:数组名的命名规范与变量名命名规范一致,不要和变量重名
- 总结2:数组中下标是从0开始索引
- 一维数组定义的三种方式:
- 5.2.2 一维数组数组名
- 一维数组名称的用途:
- 1.可以统计整个数组在内存中的长度
- 2.可以获取数组在内存中的首地址
- 注意:数组名是常量,因此不可以赋值
- 总结1:直接打印数组名,可以查看数组所占内存的首地址
- 总结2:对数组名进行sizeof,可以获取整个数组占内存空间的大小
- 一维数组名称的用途:
- 5.2.3 冒泡排序
- 作用: 最常用的排序算法,对数组内元素进行排序
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
- 重复以上的步骤,每次比较次数-1,直到不需要比较
- 作用: 最常用的排序算法,对数组内元素进行排序
- 5.2.1 一维数组定义方式
- 5.3 二维数组
- 二维数组就是在一维数组上,多加一个维度。
- 5.3.1 二维数组定义方式
- 二维数组定义的四种方式:
- 数据类型 数组名[ 行数 ][ 列数 ];
- 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
- 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
- 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};
- 建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性
- 总结:在定义二维数组时,如果初始化了数据,可以省略行数
- 二维数组定义的四种方式:
- 5.3.2 二维数组数组名
- 二维数组名称的用途:
- 1.查看二维数组所占内存空间
- 2.获取二维数组首地址
- 二维数组名称的用途:
- 5.4 数组&函数
- 传递数组给函数
- 可以通过指定不带下标(索引)的数组名来传递一个指向数组的指针
- 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址
- 数组作为参数的三种方式
- 1.形式参数是一个指针:void myFunction(int *param)
- 2.形式参数是一个已定义大小的数组:void myFunction(int param[10])
- 3.形式参数是一个未定义大小的数组:void myFunction(int param[])
- 从函数返回数组
- C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。
- 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数。
- 例子:int * myFunction()
- 传递数组给函数
- 5.1 概述