数组2与推箱子
数组2==推箱子
include<conio.h>===>getch()//获取键盘上的输入
冒泡排序:
给数组排序
1. 算法步骤
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要
例子:
时长={20,60,30,50,10}
要让时长从长到短:
第一轮 第二轮
1.20<60》60,20,30,50,10 1.60>30》不交换
2.20<30》60,30,20,50,10 2.30<50》60,50,30,20,10
3.20<50==》60,30,50,20,10 冒泡结束
结果完成排序
时长=={60,50,30,20,10}
编程实现:
通过两层循环嵌套使用
外层循环执行一次,一趟
内层循环执行一次,一次==》需要通过外层循环控制内层循环的次数,从而减少不必要的比较次数,提高效率
注意
1.每多排好一个元素,内层循环可以减少一次
2.总共n个元素,只需要比较n-1趟
代码示例:
int time[5] = { 20,60,30,50,10 }; int t;
for (int k = 0; k < 4; k++) //外层循环控制排序次数
{
for (int i = 0; i < 4 - k; i++)//内层循环控制每次比较的次数
{
if (time[i] < time[i + 1])
{
t = time[i]; //将两个数交换,大的在前,小的在后
time[i] = time[i + 1];
time[i + 1] = t;
/*
用异或交换两个数的大小
time[i]=time[i]^time[i+1];
time[i+1]=time[i]^time[i+1];
time[i]time[i]^time[i+1];
}
}
}
for (int i = 0; i < 5; i++) // 最后输出交换后的时间排序
{
printf("%d ", time[i]);
}
while (1);
return 0;
二维数组
int str[3][4];
//表示定义了一个二维数组
//3行4列
1.内存
1.二维数组的内存也是连续的
2.总内存=单个元素内存 * (元素个数) 元素个数=行数 * 列数
3.二维数组的每一行可以理解为一个一维数组
4.二维数组可以理解为元素类型为一维数组的一维数组
2.初始化与赋值
//按行初始化
//赋值
int str1[3][4]={
{0,1,2,3},
{5,6,4,8},
{8,6,3,4}
};
//把值给满
int str2[3][4]={
{5,2},
{6,3,4},
{5,6,9,7}
};
//没有给值的,默认为0
//连续初始化
int arr1[3][4]={2,5,8,6,3,5,4,5,2,3,12,5};
//从前往后给值
//不给行数,只给列数==》必须初始化
int arr1[][4]={2,5,8,6,3,5,4,5,2,3,12};
//11个元素,每行4列,行数:11/4=2...2===>3行
int str1[][4]={
{0,1,2,3},
{5,6,4,8},
{8,6,3,4},
{}
};
//有几个大括号就有几行
3.访问
//二维数组,数组名[行下标][列下标]
//注意都是从0行0列开始的
int str1[3][4]={
{0,1,2,3},
{5,6,4,8},
{8,6,3,4}
};
cout << str1[0][0] << endl;
cout << str1[2][3] << endl;
cout << str1[0][4] << endl;//打印的是5
cout << str1[1][-2] << endl;//打印的是2
遍历二维数组
使用循环嵌套,控制行列下标,实现遍历
实现遍历后,可以进行赋值,打印等操作
注意:不要越界
int str1[3][4]={
{0,1,2,3},
{5,6,4,8},
{8,6,3,4}
};
for(int i=0;i<3;i++)
{
for(int k=0;k<4;k++)
{
// printf("%3d",str1[i][k]);
// cout << str1[i][k] << " ";
}
//printf("\n");
//cout << endl;
}
推箱子游戏
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#define LAND 0
#define WALL 1
#define HERO 2
#define BOX_ 3
#define WIN_ 4
int Map[10][10] = {
{1,1,1,1,1,1,1,1,1,1 },
{1,0,0,0,1,0,0,0,0,1 },
{1,0,0,0,1,0,0,0,0,1 },
{1,0,0,0,1,0,0,0,0,1 },
{1,0,0,0,1,4,0,0,0,1 },
{1,0,0,0,0,0,0,0,0,1 },
{1,1,1,0,0,3,0,0,0,1 },
{1,0,0,0,0,0,0,0,0,1 },
{1,0,0,0,0,2,0,0,0,1 },
{1,1,1,1,1,1,1,1,1,1 }
};
void Box_()
{
bool isBOX_ = false;
while (1)
{
isBOX_ = false;
for (int i = 0; i < sizeof(Map) / sizeof(Map[0]); i++)
{
for (int j = 0; j < sizeof(Map[0]) / sizeof(int); j++)
{
if (BOX_ == Map[i][j])
{
isBOX_ = true;
}
}
}
if (!isBOX_)
{
printf("你赢了\n");
Sleep(2000);
system("cls");
for (int a = 0; a < 5; a++)
{
if (a == 2)
{
printf("■ 游戏结束 ■");
}
for (int b = 0; b < 7; b++)
{
if (a == 0 || a == 4)
{
printf("■");
}
else if (a == 2)
{
}
else
{
if (b == 0 || b == 5)
{
printf("■");
}
printf(" ");
}
}
printf("\n");
}
break;
}
system("cls");
//遍历数组 打印地图
for (int i = 0; i < sizeof(Map) / sizeof(Map[0]); i++)
{
for (int j = 0; j < sizeof(Map[0]) / sizeof(int); j++)
{
//printf("%2d", Map[i][j]);
switch (Map[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
case 2:
printf("♀");
break;
case 3:
printf("●");
break;
case 4:
printf("☆");
break;
case BOX_ + WIN_://箱子在成功上
printf("★");
break;
case HERO + WIN_://人在成功点上
printf("♀");
default:
break;
}
}
printf("\n");
}
//确定人物位置
int posX = 0, posY = 0;
for (int i = 0; i < sizeof(Map) / sizeof(Map[0]); i++)
{
for (int j = 0; j < sizeof(Map) / sizeof(int); j++)
{
if (HERO == Map[i][j] ||
HERO + WIN_ == Map[i][j])
{
posX = i;
posY = j;
}
}
}
switch (_getch())
{
case 'w':
case 'W':
/*向上的逻辑
人的上面可能是 空地 箱子 墙壁 成功点*/
if (LAND == Map[posX - 1][posY] ||
WIN_ == Map[posX - 1][posY])//成功点 空地,直接走过去
{
//当前位置人离开
Map[posX][posY] -= HERO;//人走后变成了空地
//上一格人过来
Map[posX - 1][posY] += HERO;
//Map[posX-1][posY]=Map[posX-1][posY]+HERO
//Map[posX-1][posY]就是上一格
}
else if (BOX_ == Map[posX - 1][posY])//如果是箱子
{
if (LAND == Map[posX - 2][posY] ||
WIN_ == Map[posX - 2][posY])//箱子前如果是 空地 成功点 直接推过去
{
//当前位置人离开
Map[posX][posY] -= HERO;//人走后变成了空地
//上一格箱子离开
Map[posX - 1][posY] -= BOX_;
//上一格人过来
Map[posX - 1][posY] += HERO;
//Map[posX-1][posY]=Map[posX-1][posY]+HERO
//Map[posX-1][posY]就是上一格
//上上格箱子过来
Map[posX - 2][posY] += BOX_;
}
}
break;
case 's':
case 'S':
if (LAND == Map[posX + 1][posY] ||
WIN_ == Map[posX + 1][posY])
{
Map[posX][posY] -= HERO;
Map[posX + 1][posY] += HERO;
}
else if (BOX_ == Map[posX + 1][posY])
{
if (WIN_ == Map[posX + 2][posY] ||
LAND == Map[posX + 2][posY])
{
Map[posX][posY] -= HERO;
Map[posX + 1][posY] += HERO;
Map[posX + 1][posY] -= BOX_;
Map[posX + 2][posY] += BOX_;
}
}
break;
case 'a':
case 'A':
if (LAND == Map[posX][posY - 1] ||
WIN_ == Map[posX][posY - 1])
{
Map[posX][posY] -= HERO;
Map[posX][posY - 1] += HERO;
}
else if (BOX_ == Map[posX][posY - 1])
{
if (LAND == Map[posX][posY - 2] ||
WIN_ == Map[posX][posY - 2])
{
Map[posX][posY] -= HERO;
Map[posX][posY - 1] += HERO;
Map[posX][posY - 1] -= BOX_;
Map[posX][posY - 2] += BOX_;
}
}
break;
case 'd':
case 'D':
if (LAND == Map[posX][posY + 1] ||
WIN_ == Map[posX][posY + 1])
{
Map[posX][posY] -= HERO;
Map[posX][posY + 1] += HERO;
}
else if (BOX_ == Map[posX][posY + 1])
{
if (LAND == Map[posX][posY + 2] ||
WIN_ == Map[posX][posY + 2])
{
Map[posX][posY] -= HERO;
Map[posX][posY + 1] += HERO;
Map[posX][posY + 1] -= BOX_;
Map[posX][posY + 2] += BOX_;
}
}
break;
}
}
}
int main()
{
for (int a = 0; a < 5; a++)
{
if (a == 2)
{
printf("■ 开始游戏 ■");
}
for (int b = 0; b < 7; b++)
{
if (a == 0 || a == 4)
{
printf("■");
}
else if (a == 2)
{
}
else
{
if (b == 0 || b == 5)
{
printf("■");
}
printf(" ");
}
}
printf("\n");
}
//printf("按任意键进入游戏");
//char tx;
//scanf("%c", &tx);
system("pause");
system("cls");
if (getch())
{
Box_();
}
while (1);
return 0;
}