zoukankan      html  css  js  c++  java
  • 数组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("
    ");
        //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("你赢了
    ");
    			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("
    ");
    			}
    			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("
    ");
    		}
    
    
    		//确定人物位置
    		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("
    ");
    	}
    	//printf("按任意键进入游戏");
    	//char tx;
    	//scanf("%c", &tx);
    	system("pause");
    	system("cls");
    	if (getch())
    	{
    		Box_();
    	}	
    	while (1);
    	return 0;
    }
    
    	
    
  • 相关阅读:
    linux 命令行远程登录 后台运行命令的方法
    再议perl写多线程端口扫描器
    perl 函数参数传递与返回值(一)
    Linux 删除带有特殊字符的文件
    桌面云的四大协议解析
    RemoteBox 1.6 发布,VirtualBox 管理工具
    gsoap
    Open Compute Project
    基于 Arduino 开发板,这款插座是可编程且开源的
    minnowboard
  • 原文地址:https://www.cnblogs.com/Kissfly123/p/14029786.html
Copyright © 2011-2022 走看看