数组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;
}

	
posted @ 2020-11-24 13:30  kisfly  阅读(52)  评论(0编辑  收藏  举报