C++推箱子(全)

1

#include <stdio.h>  
#include <conio.h>
#include<stdlib.h> 
int map[9][11] = {
{0,1,1,1,1,1,1,1,1,1,0},  //0代表空地
{0,1,0,0,0,1,0,0,0,1,0},  //1代表墙
{0,1,0,4,4,4,4,4,0,1,0},  //3代表目的地
{0,1,0,4,0,4,0,4,0,1,1},  //4代表箱子
{0,1,0,0,0,0,0,0,4,0,1},  //5代表人 
{1,1,0,1,1,1,1,0,4,0,1},
{1,0,8,3,3,3,3,1,0,0,1},  //2 3 4 5 6 7 8 9 1 0
{1,0,3,3,3,3,3,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,0} };
//绘制地图  //二维数组+switch()
void DrawMap()
{
//遍历二维数组  //0 打印空格  //1 墙   //3 目的地  //什么结构?
for (int i = 0; i < 9; i++)
{
    for (int j = 0; j < 11; j++)
    {
        //if  else  switch
        switch (map[i][j])
        {
        case 0:
            printf("  ");
            break;
        case 1:
            printf("■");
            break;
        case 3:
            printf("☆");
            break;
        case 4:
            printf("□");
            break;
        case 5:
            printf("♀");  //5人
            break;
        case 7:     //4 + 3  箱子在目的地中
            printf("★");
            break;
        case 8:     // 5 + 3  人在目的地当中   人?
            printf("♀");
            break;
        }
    }
    printf("\n");
}
}
void PlayGame()
{
int r, c;  //人的下标  //
for (int i = 0; i < 9; i++)
{
    for (int j = 0; j < 11; j++)
    {
        if (map[i][j] == 5||map[i][j]==8)   //i j 人的下标?
        {
            r = i;
            c = j;
        }
    }
}
 char ch;  //字符变量
ch = getch();  //键盘的输入保存到字符中
// getch()     getchar()  接收键盘字符
// getch()直接接收 不显示回文   getchar()显示回文可以修改 enter键结束
 //根据不同的按键  改变不同的值. 分支.
switch (ch)
{
case 'W':  //W A S D方向   72  80  75  77 虚拟键值 ascii  windowVK_UP VK_TAB VK_RETUNE
case 'w':
case 72:
    if (map[r - 1][c] == 0|| map[r - 1][c] == 3) 
    {
        map[r - 1][c] += 5;
        map[r][c] -= 5;
    }
    else if (map[r - 1][c] == 4 || map[r - 1][c] == 7)
    {
        if (map[r - 2][c] == 0 || map[r - 2][c] == 3)
        {
            map[r - 2][c] += 4;
            map[r - 1][c] += 1;
            map[r][c] -= 5;
        }
    }

     break;
 case 'S':  //enter按键的作用  确认 返回
case 's':
case 80:
    if (map[r + 1][c] == 0 || map[r + 1][c] == 3)
    {
        map[r + 1][c] += 5;
        map[r][c] -= 5;
    }
    else if (map[r + 1][c] == 4 || map[r+ 1][c] == 7)
    {
        if (map[r + 2][c] == 0 || map[r + 2][c] == 3)
        {
            map[r + 2][c] += 4;
            map[r + 1][c] += 1;
            map[r][c] -= 5;
        }
    }
    break;
 case 'A':
case 'a':
case 75:
    if (map[r ][c - 1] == 0 || map[r ][c - 1] == 3)
    {
        map[r ][c - 1] += 5;
        map[r][c] -= 5;
    }
    else if (map[r][c - 1] == 4 || map[r][c - 1] == 7)
    {
        if (map[r ][c - 2] == 0 || map[r ][c - 2] == 3)
        {
            map[r ][c - 2] += 4;
            map[r ][c - 1] += 1;
            map[r][c] -= 5;
        }
    }
    break;
 case 'D':
case 'd':
case 77:
    if (map[r][c + 1] == 0 || map[r][c + 1] == 3)
    {
        map[r][c + 1] += 5;
        map[r][c] -= 5;
    }
    else if (map[r][c + 1] == 4 || map[r][c + 1] == 7)
    {
        if (map[r][c + 2] == 0 || map[r][c + 2] == 3)
        {
            map[r][c + 2] += 4;
            map[r][c + 1] += 1;
            map[r][c] -= 5;
        }
    }
    break;
}
}
int main()  //主函数
{
while (1)
{
    system("cls");
    DrawMap();
    PlayGame();
}
 return 0;
}
//通过按键来实现游戏  ---> 通过按键来改变二维数组的排列顺序.
//思考一个问题? 地图是二维数组来决定的. 人在哪里  二维数组来决定?
/************************************************
//人推箱子  
可以动.    怎么办.  改变元素
    1.人的前面是空地
    2.人的前面是目的地
    3.人的前面是箱子
        3.1 箱子的前面是空地
        3.2 箱子的前面是目的地

        //盘断二维数组中有几个7
        //没有目的地  不对..  人站在目的地
        //有没有4.
****************************************/

2

#include <stdio.h>     
#include <stdlib.h>    
#include <conio.h>     
int i,j; 
void draw_map(int map[10][12]); //声明画图函数
int main()
{
system("title 額………………");
char input;   
int count=0;   //定义记分变量
int map[10][12] = {{2,2,2,2,2,1,1,1,1,1,2,2},
    {1,1,1,1,2,1,0,0,0,1,1,2},
    {1,0,0,1,1,1,0,1,0,0,1,2},
    {1,0,4,3,3,3,3,3,1,0,1,1},
    {1,0,0,1,1,3,3,3,4,0,0,1},
    {1,0,0,0,0,4,1,1,4,1,0,1},
    {1,0,4,1,4,0,0,0,4,0,0,1},
    {1,1,0,6,0,1,1,1,4,1,0,1},
    {2,1,1,1,1,1,2,1,0,0,0,1},
    {2,2,2,2,2,2,2,1,1,1,1,1}
};
while (1)   //死循环,等待用户命令
{
    system("CLS");
    for (i=0;i<12;i++)
    {
        printf("%d",i);
    }
    printf("\n");
    /*for (i=1;i<10;i++)
    {
        printf("%d\n",i);
    }*/
    printf("\n");
    draw_map(map);
    printf("当前得分:%d\n",count);
    //找初始位置
    for (i=0;i<10;i++)
    {
        for (j=0;j<12;j++)
        {
            if (map[i][j]==6||map[i][j]==9)
                break;
        }
        if (map[i][j]==6||map[i][j]==9)
            break;
    }
    printf("您的当前坐标(%d,%d)",i,j);        
    input = getch();   //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。
    switch (input)
    {
    case 'w':
        //如果人前面是空地。  //0代表空地  6代表人  //3代表目的地
        if(map[i-1][j]==0)
        {
            map[i-1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
            if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
                map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
            else
                map[i][j]=0;    //否则原地ID修改为空地ID 。      
        }
        //如果人前面是目的地。
        else if((map[i-1][j]==3)||(map[i-1][j]==9))
        {
            map[i-1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
            if(map[i][j]==9) //如果原地也是目的地(ID为)。
                map[i][j]=3; //人走后把原地ID修改回目的地ID。
            else
                map[i][j]=0; //否则原地ID修改为为空地ID
        }
        //如果人前面是箱子。//4代表箱子   //7箱子进入目的地
        else if(map[i-1][j]==4)
        {
            //如果人前面是箱子,而箱子前面是空地。
            if (map[i-2][j]==0)
            { 
                map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
                //下面是对箱子原地进行判断
                if(map[i-1][j]==7) //如果箱子原地为目的地。
                    map[i-1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
                else
                    map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
                //下面是对人原地进行判断
                if(map[i][j]==9) //如果之前是目的地。
                    map[i][j]=3; //人走了之后修改回目的地ID。
                else
                    map[i][j]=0; //否则就是空地。
            }
            //如果人的前面是箱子,而箱子前面是目的地。
            else if (map[i-2][j]==3)
            { 
                map[i-2][j]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
                count++;
                //下面是对箱子原先位置的判断,同上。
                if(map[i-1][j]==7)
                    map[i-1][j]=9;
                else
                    map[i-1][j]=6;
                //下面是对人原先位置进行判断,同上。
                if(map[i][j]==9)
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        //如果人前面是已经进入某目的地的箱子(ID=7)。
        else if(map[i-1][j]==7)
        {
            //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
            if(map[i-2][j]==0)
            {
                count--;
                map[i-2][j]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
                map[i-1][j]=9;   //人自然而然的就站在了原先的目的地上了。
                //下面是对人原先地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
            //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
            if(map[i-2][j]==3)
            {
                map[i-2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。
                map[i-1][j]=9;   //人站在了目的地上。
                //下面是对人原先站立地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        break;
    case 's':
        //如果人前面是空地。
        if(map[i+1][j]==0)
        {
            map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
            if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
                map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
            else
                map[i][j]=0;    //否则原地ID修改为空地ID 。      
        }
        //如果人前面是目的地。
        else if(map[i+1][j]==3)
        {
            map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
            if(map[i][j]==9) //如果原地也是目的地(ID为)。
                map[i][j]=3; //人走后把原地ID修改回目的地ID。
            else
                map[i][j]=0; //否则原地ID修改为为空地ID
        }
        //如果人前面是箱子。
        else if(map[i+1][j]==4)
        {
            //如果人前面是箱子,而箱子前面是空地。
            if (map[i+2][j]==0)
            { 
                map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
                //下面是对箱子原地进行判断
                if(map[i+1][j]==7) //如果箱子原地为目的地。
                    map[i+1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
                else
                    map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
                //下面是对人原地进行判断
                if(map[i][j]==9) //如果之前是目的地。
                    map[i][j]=3; //人走了之后修改回目的地ID。
                else
                    map[i][j]=0; //否则就是空地。
            }
            //如果人的前面是箱子,而箱子前面是目的地。
            else if (map[i+2][j]==3)
            { 
                map[i-2][j]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
                count++;
                //下面是对箱子原先位置的判断,同上。
                if(map[i+1][j]==7)
                    map[i+1][j]=9;
                else
                    map[i+1][j]=6;
                //下面是对人原先位置进行判断,同上。
                if(map[i][j]==9)
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        //如果人前面是已经进入某目的地的箱子(ID=7)。
        else if(map[i+1][j]==7)
        {
            //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
            if(map[i+2][j]==0)
            {
                count--;
                map[i+2][j]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
                map[i+1][j]=9;   //人自然而然的就站在了原先的目的地上了。
                //下面是对人原先地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
            //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
            if(map[i+2][j]==3)
            {
                map[i+2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。
                map[i+1][j]=9;   //人站在了目的地上。
                //下面是对人原先站立地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        break;
    case 'a':
        //如果人前面是空地。
        if(map[i][j-1]==0)
        {
            map[i][j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
            if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
                map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
            else
                map[i][j]=0;    //否则原地ID修改为空地ID 。      
        }
        //如果人前面是目的地。
        else if(map[i][j-1]==3)
        {
            map[i][j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
            if(map[i][j]==9) //如果原地也是目的地(ID为)。
                map[i][j]=3; //人走后把原地ID修改回目的地ID。
            else
                map[i][j]=0; //否则原地ID修改为为空地ID
        }
        //如果人前面是箱子。
        else if(map[i][j-1]==4)
        {
            //如果人前面是箱子,而箱子前面是空地。
            if (map[i][j-2]==0)
            { 
                map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
                //下面是对箱子原地进行判断
                if(map[i][j-1]==7) //如果箱子原地为目的地。
                    map[i][j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
                else
                    map[i][j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
                //下面是对人原地进行判断
                if(map[i][j]==9) //如果之前是目的地。
                    map[i][j]=3; //人走了之后修改回目的地ID。
                else
                    map[i][j]=0; //否则就是空地。
            }
            //如果人的前面是箱子,而箱子前面是目的地。
            else if (map[i][j-2]==3)
            { 
                count++;
                map[i][j-2]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
                //下面是对箱子原先位置的判断,同上。
                if(map[i][j-1]==7)
                    map[i][j-1]=9;
                else
                    map[i][j-1]=6;
                //下面是对人原先位置进行判断,同上。
                if(map[i][j]==9)
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        //如果人前面是已经进入某目的地的箱子(ID=7)。
        else if(map[i][j-1]==7)
        {
            //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
            if(map[i][j-2]==0)
            {
                count--;
                map[i][j-2]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
                map[i][j-1]=9;   //人自然而然的就站在了原先的目的地上了。
                //下面是对人原先地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
            //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
            if(map[i][j-2]==3)
            {
                map[i][j-2]=7;   //把箱子推入了另一目的地,自然,ID也应是。
                map[i][j-1]=9;   //人站在了目的地上。
                //下面是对人原先站立地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        break;
    case 'd':
        //如果人前面是空地。
        if(map[i][j+1]==0)
        {
            map[i][j+1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
            if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
                map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
            else
                map[i][j]=0;    //否则原地ID修改为空地ID 。      
        }
        //如果人前面是目的地。
        else if(map[i][j+1]==3)
        {
            map[i][j+1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
            if(map[i][j]==9) //如果原地也是目的地(ID为)。
                map[i][j]=3; //人走后把原地ID修改回目的地ID。
            else
                map[i][j]=0; //否则原地ID修改为为空地ID
        }
        //如果人前面是箱子。
        else if(map[i][j+1]==4)
        {
            //如果人前面是箱子,而箱子前面是空地。
            if (map[i][j+2]==0)
            { 
                map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
                //下面是对箱子原地进行判断
                if(map[i][j+1]==7) //如果箱子原地为目的地。
                    map[i][j+1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
                else
                    map[i][j+1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
                //下面是对人原地进行判断
                if(map[i][j]==9) //如果之前是目的地。
                    map[i][j]=3; //人走了之后修改回目的地ID。
                else
                    map[i][j]=0; //否则就是空地。
            }
            //如果人的前面是箱子,而箱子前面是目的地。
            else if (map[i][j+2]==3)
            { 
                count++;
                map[i][j+2]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
                //下面是对箱子原先位置的判断,同上。
                if(map[i][j+1]==7)
                    map[i][j+1]=9;
                else
                    map[i][j+1]=6;
                //下面是对人原先位置进行判断,同上。
                if(map[i][j]==9)
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        //如果人前面是已经进入某目的地的箱子(ID=7)。
        else if(map[i][j+1]==7)
        {
            //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
            if(map[i][j+2]==0)
            {
                count--;
                map[i][j+2]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
                map[i][j+1]=9;   //人自然而然的就站在了原先的目的地上了。
                //下面是对人原先地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
            //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
            if(map[i][j+2]==3)
            {
                map[i][j+2]=7;   //把箱子推入了另一目的地,自然,ID也应是。
                map[i][j+1]=9;   //人站在了目的地上。
                //下面是对人原先站立地进行判断,方法同上。
                if(map[i][j]==9) 
                    map[i][j]=3;
                else
                    map[i][j]=0;
            }
        }
        break;
    }
    if(count==8)   //如果分数达到分
    {
        system("CLS"); //清屏
        draw_map(map); 
        break;    //退出死循环
    }
}
printf("\n恭喜你,过关了!!\n"); //过关提示
return 0;
}
void draw_map(int map[10][12])
{

for(i=0;i<10;i++)
{
    for(j=0;j<12;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 7:
            printf("$"); //数字代表箱子进入目的地
            break;
        case 6:
            printf("@"); //数字代表人
            break;
        case 9:
            printf("@"); //数字代表人进入目的地
            break;
        }            
    }
    printf("\n");    //分行输出
}
}
//这个显示不太好
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<windows.h>
#include<conio.h>
using namespace std;
bool b[101];
int MAX[101],step;
char map[101][101][101]={{" ######"," #....#","###ZZZ.#","#H.Z**.#","#.Z***##","####..# "," #### "},
{" #### #####","##..# #...#","#.Z.####Z..#","#..Z****.Z.#","##....#.H.##"," ########## "},
{" ##### ","###..H# ","#..Z*.##","#..*Z*.#","###.ZZ.#"," #...##"," ##### "},
{" #### "," #**# "," ##.*## "," #..Z*# ","##.Z..##","#..#ZZ.#","#..H...#","########"},
{"########","#..#...#","#.Z**Z.#","#HZ*Z.##","#.Z**Z.#","#..#...#","########"},
{" ###### ","##....##","#.Z.ZZ.#","#******#","#.ZZ.Z.#","###.H###"," #### "},
{" ###### "," #....###"," #.Z....#","###.Z.##.#","#***.Z...#","#***Z#Z.##","####.#.Z.#"," #...H.#"," #######"},
{"###### ","#....# ","#.ZZZ## ","#..#**###","##..**Z.#"," #.H....#"," ########"},
{" ########"," #...#*.#"," ##..Z***#"," #..Z.#Z*#","##.##Z#.##","#...Z..Z.#","#...#....#","#######H.#"," ####"},
{" ####### "," #****.# ","###***Z###","#..Z#Z.Z.#","#.ZZ..#Z.#","#....#...#","####.H.###"," ##### "}};
char MAP[101][101][101]={{" ######"," #....#","###ZZZ.#","#H.Z**.#","#.Z***##","####..# "," #### "},
{" #### #####","##..# #...#","#.Z.####Z..#","#..Z****.Z.#","##....#.H.##"," ########## "},
{" ##### ","###..H# ","#..Z*.##","#..*Z*.#","###.ZZ.#"," #...##"," ##### "},
{" #### "," #**# "," ##.*## "," #..Z*# ","##.Z..##","#..#ZZ.#","#..H...#","########"},
{"########","#..#...#","#.Z**Z.#","#HZ*Z.##","#.Z**Z.#","#..#...#","########"},
{" ###### ","##....##","#.Z.ZZ.#","#******#","#.ZZ.Z.#","###.H###"," #### "},
{" ###### "," #....###"," #.Z....#","###.Z.##.#","#***.Z...#","#***Z#Z.##","####.#.Z.#"," #...H.#"," #######"},
{"###### ","#....# ","#.ZZZ## ","#..#**###","##..**Z.#"," #.H....#"," ########"},
{" ########"," #...#*.#"," ##..Z***#"," #..Z.#Z*#","##.##Z#.##","#...Z..Z.#","#...#....#","#######H.#"," ####"},
{" ####### "," #****.# ","###***Z###","#..Z#Z.Z.#","#.ZZ..#Z.#","#....#...#","####.H.###"," ##### "}};
char under[101][10][2]={{{3,4},{5,3},{4,3},{4,4},{5,4}},
{{4,3},{5,3},{6,3},{7,3}},
{{4,2},{3,3},{5,3},{4,4}},
{{3,1},{4,1},{4,2},{5,3}},
{{3,2},{4,2},{3,3},{4,3},{3,4},{4,4}},
{{1,3},{2,3},{3,3},{4,3},{5,3},{6,3}},
{{1,4},{2,4},{3,4},{1,5},{2,5},{3,5}},
{{4,3},{4,4},{5,4},{5,3}},
{{7,1},{6,2},{7,2},{8,2},{7,3},{8,3}},
{{2,1},{3,1},{4,1},{5,1},{3,2},{4,2},{5,2}}};
int zl[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 
int total,game=1,all[101]={5,4, 4, 4, 6, 6, 6, 4, 6,7};
char Chinese[]="推箱子游戏正在努力加载中......";
int length[101][2]={{6,7},
{5,11},
{6,7},
{7,7},
{6,7},
{6,7},
{8,9},
{6,8},
{8,9},
{8,9}};
int x[101]={3,
4, 1, 6, 3, 5, 7, 5, 7, 6}; int y[101]={1,8, 5, 3, 1, 4, 7, 3, 7, 5}; int X[101]={3,4, 1, 6, 3, 5, 7, 5, 7, 6}; 
int Y[101]={1,8, 5, 3, 1, 4, 7, 3, 7,5};
char ch;
int way;
void main_print(){
while(true)
{
system("cls");
printf("    主菜单\n");
for(int i=1;i<=10;i++)
{
if(game==i)
printf(" >> %d关 ",i+9);
else
printf(" %d关 ",i+9);
if(b[i]==true)
printf("已通过 ");
else
printf("未通过 ");
printf("最高纪录:%d步\n",MAX[i]);
}
ch=getch();
if(ch=='s' || ch=='S')
{
if(game<=9)
game++;
}
else if(ch=='w' || ch=='W')
{
if(game>=2)
game--;
}
else if(ch==' ')
break;
}
}
bool check(int i,int j){
for(int number=1;number<=all[game-1];number++)
if(under[game-1][number-1][0]==j && under[game-1][number-1][1]==i)
return true;
return false;
}
void OK(){
total=0;
for(int i=0;i<=length[game-1][0];i++)
for(int j=0;j<=length[game-1][1];j++)
if(check(i,j)==true)
if(map[game-1][i][j]=='Z')
total++;
}
void map_print(){
system("cls");
for(int i=0;i<=length[game-1][0];i++)
{
for(int j=0;j<=length[game-1][1];j++)
{
if(check(i,j)==true)
{
if(map[game-1][i][j]=='H')
printf("①");
else if(map[game-1][i][j]=='Z')
printf("㊣");
else if(map[game-1][i][j]=='.' || map[game-1][i][j]=='*')
printf("★");
}
else
{
if(map[game-1][i][j]=='H')
printf("①");
else if(map[game-1][i][j]=='Z')
printf("□");
else if(map[game-1][i][j]=='.')
printf(" ");
else if(map[game-1][i][j]=='*')
printf("★");
else if(map[game-1][i][j]=='#')
printf("█");
else if(map[game-1][i][j]==' ')
printf(" ");
}
}
printf("\n");
}
OK();
}
void move(){
ch=getch();
if(ch=='w' || ch=='W')
way=0;
else if(ch=='s' || ch=='S')
way=1;
else if(ch=='a' || ch=='A')
way=2;
else if(ch=='d' || ch=='D')
way=3;
else if(ch==' ')
{
main_print();
return;
}
else
{
for(int i=0;i<=length[game-1][0];i++)
strcpy(map[game-1][i],MAP[game-1][i]);
x[game-1]=X[game-1];
y[game-1]=Y[game-1];
step=0;
map_print();
return;
}
if(map[game-1][x[game-1]+zl[way][0]][y[game-1]+zl[way][1]]=='.' || map[game-1][x[game-1]+zl[way][0]][y[game-1]+zl[way][1]]=='*')
{
map[game-1][x[game-1]][y[game-1]]='.';
map[game-1][x[game-1]+zl[way][0]][y[game-1]+zl[way][1]]='H';
x[game-1]+=zl[way][0];
y[game-1]+=zl[way][1];
step++;
}
else if(map[game-1][x[game-1]+zl[way][0]][y[game-1]+zl[way][1]]=='Z' && map[game-1][x[game-1]+zl[way][0]+zl[way][0]][y[game-1]+zl[way][1]+zl[way][1]]!='Z' && map[game-1][x[game-1]+zl[way][0]+zl[way][0]][y[game-1]+zl[way][1]+zl[way][1]]!='#')
{
map[game-1][x[game-1]][y[game-1]]='.';
map[game-1][x[game-1]+zl[way][0]][y[game-1]+zl[way][1]]='H';
map[game-1][x[game-1]+zl[way][0]+zl[way][0]][y[game-1]+zl[way][1]+zl[way][1]]='Z';
x[game-1]+=zl[way][0];
y[game-1]+=zl[way][1];
step++;    
}
map_print();
}
void print(){
for(int t=1;t<=5;t++)
{
for(int i=0;Chinese[i];i+=2)
{
cout<<Chinese[i]<<Chinese[i+1];
Sleep(50);
}
system("cls");
}
system("cls");
}
int main(){
system("color 6");
print();
while(true)
{
bool p=false;
main_print();
while(game<=10)
{
map_print();
while(total!=all[game-1])
{
move();
if(p==true)
break;
}
if(p==true)
break;
MAX[game]=max(MAX[game],step);
b[game]=true;
total=0;
step=0;
game++;
}
}
return 0; 
}

4

#include<iostream>
#include<stdio.h>
#include<conio.h>
#include <windows.h>
using namespace std;
void Game_Menu(HANDLE hout);
void Game_description(HANDLE hout);
void gotoxy(HANDLE hout, int x, int y);
int DrawMap(HANDLE hout);
void Move(HANDLE hout);
int finish();
void setmap(int n);
void color(int m);
bool flag = true;
int pass = 1;
#define R 10
#define C 10
#define framex 20
#define framey 14 
int map[R][C] = {0};
//关卡1 
int map1[R][C] = {
{ 0,0,1,1,1,0,0,0 },
{ 0,0,1,3,1,0,0,0 },
{ 0,0,1,0,1,1,1,1 },
{ 1,1,1,0,0,4,3,1 },
{ 1,3,4,4,0,1,1,1 },
{ 1,1,1,5,4,1,0,0 },
{ 0,0,0,1,3,1,0,0 },
{ 0,0,0,1,1,1,0,0 }
};
//地图 2(关卡2)
int map2[R][C]={
{1,1,1,1,1,0,0,0,0,0},
{1,5,0,0,1,0,0,0,0,0},
{1,0,4,4,1,0,1,1,1,0},
{1,0,4,0,1,0,1,3,1,0},
{1,1,1,0,1,1,1,3,1,0},
{0,1,1,0,0,0,0,3,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,1,1,0,0,0,0}
};
//地图 3(关卡3)
int map3[R][C]={
{ 0,0,0,1,1,1,1,1,1,1 },
{ 0,0,1,1,0,0,1,0,5,1 },
{ 0,0,1,0,0,0,1,0,0,1 },
{ 0,0,1,4,0,4,0,4,0,1 },
{ 0,0,1,0,4,1,1,0,0,1 },
{ 1,1,1,0,4,0,1,0,1,1 },
{ 1,3,3,3,3,3,0,0,1,0 },
{ 1,1,1,1,1,1,1,1,1,0 },
};
void Game_Menu(HANDLE hout){//游戏开始菜单 
  system("cls");
  gotoxy(hout, framex, 1);
  cout << "*******************";
  gotoxy(hout, framex, 3);
  cout << "   推箱子    ";
  gotoxy(hout, framex, 5);
  cout << "  按s或S开始   ";
  gotoxy(hout, framex, 7);
  cout << "  按q或Q退出   ";
  gotoxy(hout, framex, 9);
  cout << "游戏前关闭中文输入 ";
  gotoxy(hout, framex, 11);
  cout << "*******************";
  _getch();
};
void Game_description(HANDLE hout){//操作提示 
  system("cls");
  gotoxy(hout, framex, 1);
  cout << "*****************************";
  gotoxy(hout, framex, 3);
  cout << "   按方向键上下左右移动  ";
  gotoxy(hout, framex, 5);
  cout << " 所有箱子到达目的地游戏胜利 ";
  gotoxy(hout, framex, 7);
  cout << "     按q或Q退出     ";
  gotoxy(hout, framex, 9);
  cout << "*****************************";
};
void gotoxy(HANDLE hout, int x, int y){
  COORD pos;
  pos.X = x;
  pos.Y = y;
  SetConsoleCursorPosition(hout, pos);
};
void print(int i){//根据map值输出相应的图形 
  switch(i){
        case 0:
          color(0x7);
          cout << " "; //空地■★□?◇◆??¤
          break;
          case 1:
          color(8);
          cout << "■";//墙体
          break;
          case 3:
          color(0xE);
          cout << "◇";//目的地
          break;
          case 4:
          color(4);
          cout << "□";//箱子 
          break;
          case 5:
          color(3);
          cout << "♀"; //人
          break;
          case 7:   //4+3  箱子到达目的地
          color(6);  
          cout << "◆";
          break;
          case 8:   //5+3 人与目的地重合
          color(3);
          cout << "♀";
          break;
          default:
          break;
        }
}
int DrawMap(HANDLE hout){//新的关卡开始时载入地图 
  //HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
  gotoxy(hout, framex + C, framey - 3);
  color(0xF);
  cout << "第" << pass << "关";
  //printf("第%d关", pass); 
  for(int i = 0; i < R; i++){
    gotoxy(hout, framex, framey + i);
    for(int j = 0; j < C; j++){

      print(map[i][j]);
    }
  }
  return 0;
};
void Move(HANDLE hout){//移动小人 
  int x = 0, y = 0;
  for(int i = 0; i < R; i++){
    for(int j = 0; j < C; j++){
      if(map[i][j] == 5 || map [i] [j] == 8){
        x = i;
        y = j;
        break;
      }
    }
  }
  gotoxy(hout, framex, framey + R);
  color(0xF);
  printf("当前位置:(%d, %d)", x, y);
  int ch = _getch();

  switch(ch){

    case 'w':
    case 'W':
    case 72:
      if(map[x - 1][y] == 0 || map[x - 1][y] == 3){
        map[x][y] -= 5;
        gotoxy(hout, framex + 2 * y, framey + x);
        print(map[x][y]);
        map[x - 1][y] += 5;
        gotoxy(hout, framex + 2 * y, framey + x - 1);
        print(map[x - 1][y]);
      }
      else if(map[x - 1][y] == 4 || map[x - 1][y] == 7){
        if(map[x - 2][y] == 0 || map[x - 2][y] == 3){
          map[x][y] -= 5;
          gotoxy(hout, framex + 2 * y, framey + x);
          print(map[x][y]);
          map[x - 1][y] += 1;
          gotoxy(hout, framex + 2 * y, framey + x - 1);
          print(map[x - 1][y]);
          map[x - 2][y] += 4;
          gotoxy(hout, framex + 2 * y, framey + x - 2);
          print(map[x - 2][y]);
        }
      }
      break;

    case 's':
    case 'S':
    case 80:
      if(map[x + 1][y] == 0 || map[x + 1][y] == 3){
        map[x][y] -= 5;
        gotoxy(hout, framex + 2 * y, framey + x);
        print(map[x][y]);
        map[x + 1][y] += 5;
        gotoxy(hout, framex + 2 * y, framey + x + 1);
        print(map[x + 1][y]);
      }
      else if(map[x + 1][y] == 4 || map[x + 1][y] == 7){
        if(map[x + 2][y] == 0 || map[x + 2][y] == 3){
          map[x][y] -= 5;
          gotoxy(hout, framex + 2 * y, framey + x);
          print(map[x][y]);
          map[x + 1][y] += 1;
          gotoxy(hout, framex + 2 * y, framey + x + 1);
          print(map[x + 1][y]);
          map[x + 2][y] += 4;
          gotoxy(hout, framex + 2 * y, framey + x + 2);
          print(map[x + 2][y]);
        }
      }
      break;

    case 'a':
    case 'A':
    case 75:
      if(map[x][y - 1] == 0 || map[x][y - 1] == 3){
        map[x][y] -= 5;
        gotoxy(hout, framex + 2 * y, framey + x);
        print(map[x][y]);
        map[x][y - 1] += 5;
        gotoxy(hout, framex + 2 * y - 2, framey + x);
        print(map[x][y - 1]);
      }
      else if(map[x][y - 1] == 4 || map[x][y - 1] == 7){
        if(map[x][y - 2] == 0 || map[x][y - 2] == 3){
          map[x][y] -= 5;
          gotoxy(hout, framex + 2 * y, framey + x);
          print(map[x][y]);
          map[x][y - 1] += 1;
          gotoxy(hout, framex + 2 * y - 2, framey + x);
          print(map[x][y - 1]);
          map[x][y - 2] += 4;
          gotoxy(hout, framex + 2 * y - 4, framey + x);
          print(map[x][y - 2]);
        }
      }
      break;

    case 'd':
    case 'D':
    case 77:
      if(map[x][y + 1] == 0 || map[x][y + 1] == 3){
        map[x][y] -= 5;
        gotoxy(hout, framex + 2 * y, framey + x);
        print(map[x][y]);
        map[x][y + 1] += 5;
        gotoxy(hout, framex + 2 * y + 2, framey + x);
        print(map[x][y + 1]);
      }
      else if(map[x][y + 1] == 4 || map[x][y + 1] == 7){
        if(map[x][y + 2] == 0 || map[x][y + 2] == 3){
          map[x][y] -= 5;
          gotoxy(hout, framex + 2 * y, framey + x);
          print(map[x][y]);
          map[x][y + 1] += 1;
          gotoxy(hout, framex + 2 * y + 2, framey + x);
          print(map[x][y + 1]);
          map[x][y + 2] += 4;
          gotoxy(hout, framex + 2 * y + 4, framey + x);
          print(map[x][y + 2]);
        }
      }
      break;
    case 'q':
    case 'Q':
      flag = false;
    default:
      break;  
  }
};
int finish(){//判断游戏结束 
  for(int i = 0; i < R; i++){
    for(int j = 0; j < C; j++){
      if(map[i][j] == 4)return 0;
    }
  }
  return 1;
};
void setmap(int n){
  switch(n){
    case 1:
      memcpy(map, map1, sizeof(map1));
      break;
    case 2:
      memcpy(map, map2, sizeof(map2));
      break;
    case 3:
      memcpy(map, map3, sizeof(map3));
      break;
  }
};
void color(int m){//改变输出符号的颜色 
  HANDLE consolehend;
  consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(consolehend, m); 
};
int main(){
  HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);

  Game_Menu(hout);
  char ch = getch();
  setmap(pass);
  Game_description(hout);
  DrawMap(hout);
  if(ch == 'q' || ch == 'Q'){
    return 0;
  }
  while(flag){
    Move(hout);
    if(finish()){  
      DrawMap(hout);
      gotoxy(hout, framex, framey + R);
      cout << " 恭喜,成功过关!";
      gotoxy(hout, framex, framey + R + 2);
      cout << "重玩(R)";
      ch = getch();
      system("cls");
      pass++;
      if(ch == 'r' || ch == 'R')pass--;
      if(pass > 3) { 
        gotoxy(hout, framex, framey);
        cout << " 您已通过全部关卡!";
        getch();
        flag = false;
      } 
      else{
        setmap(pass);
        Game_description(hout);
        DrawMap(hout);
      }
    }
  }
  return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值