搜索
查看: 864|回复: 2
打印 上一主题 下一主题

高级推箱子(1)

[复制链接]
跳转到指定楼层
楼主
发表于 2016-9-25 16:39:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本推箱子游戏是用画图函数
特点是编辑地图超方便
先用txt文档把以下两个内容打出:
(复杂的命名为map2,简单的命名为map1)


8 8 12 0
1 1 1 1 1 1 1 1
1 0 3 3 3 0 0 1
1 0 4 4 4 4 3 1
1 3 4 0 0 4 3 1
1 3 4 0 6 4 3 1
1 3 4 4 4 4 0 1
1 0 0 3 3 3 0 1
1 1 1 1 1 1 1 1

11 13 5 1
2 2 2 1 1 1 1 1 1 1 2 2 2
1 1 1 1 0 0 0 0 0 1 2 2 2
1 0 0 0 3 1 1 1 0 1 2 2 2
1 0 1 0 1 0 0 0 0 1 1 2 2
1 0 1 0 4 0 4 1 3 0 1 2 2
1 0 1 0 0 7 0 0 1 0 1 2 2
1 0 3 1 4 0 4 0 1 0 1 2 2
1 1 0 0 0 0 1 0 1 0 1 1 1
2 1 0 1 1 1 3 0 0 0 0 6 1
2 1 0 0 0 0 0 1 1 0 0 0 1
2 1 1 1 1 1 1 1 1 1 1 1 1

记得把代码和地图放在一起


代码:


#include <stdio.h>      
#include <stdlib.h>      
#include <conio.h>
      
int map[50][50];
int row,col;
void Hrun();
void Erun();
void help();
void sitting();
  
//画图函数
void draw_map()  
{  
        int i,j;
    for(i=1;i<=row;i++){  
        for(j=1;j<=col;j++){  
            switch(map[j]){  
                    case 0:  printf("  ");break; //数字0代表道路  
                    case 1:  printf("");break; //数字1代表墙壁                    
                    case 2:  printf("  ");break; //数字2是游戏边框的空白部分  
                    case 3:  printf("·");break; //数字3代表目的地  
                    case 4:  printf("");break; //数字4代表箱子  
                    case 7:  printf("");break; //数字7代表箱子进入目的地  
                    case 6:  printf("");break; //数字6代表人  
                    case 9:  printf("");break; //数字9代表人进入目的地     
            }              
        }  
        printf("\n");    //分行输出  
    }  
}
int main()  
{  
   
    printf("推箱子\n\n");
        printf("开始(a)\n");
        printf("帮助(b)\n");
        printf("设置(c)\n\n");
        printf(":先把输入法调成英文");
        switch(getch())
        {  
                while(1)
                {       
                        case 'a':
                                Erun();
                                break;
                        case 'b':
                                help();
                                break;
                        case 'c':
                                sitting();
                                break;
                        default:
                                printf("错误");
                }
        }
        return 0;
}
void help()
{
        system("CLS");
        printf("本游戏使用英文 W S A D 控制\n");
        printf(":\n");
        printf(":\n");
        printf("箱子:\n");
        printf("目标点:·\n");
        printf("达到目标的箱子:\n\n");
        printf("任意键开始 . . .\n");
        getch();
                system("CLS");
                sitting();
   
}
void sitting()
{
        system("CLS");
        printf("简单(d)\n");
        printf("困难(e)\n");
        switch(getch())
        {
                while(1)
                {
                case 'd':
                        Erun();
                        break;
                case 'e':
                        Hrun();
                        break;
                default:
                        printf("错误");
                }
        }
}
void Erun()
{
        char input;     
    int i,j,target,count,a,book=0;   //定义记分变量  
   
        FILE *fin=fopen("map1.txt","r");
        if(fin==NULL){
                printf("read file error");
        }
        fscanf(fin,"%d%d%d%d",&row,&col,&target,&count);
        for(i=1;i<=row;i++)
                for(j=1;j<=col;j++)
                        fscanf(fin,"%d",&map[j]);
       
    while (1)   //死循环,等待用户命令  
    {  
        system("CLS");  
        draw_map(map);  
                printf("step:%d\n",book);
        printf("score%d/%d\n",count,target);  
        //找初始位置  
        for(i=1;i<=row;i++){  
            for(j=1;j<=col;j++){  
                if (map[j]==6||map[j]==9)  
                    break;  
            }  
            if (map[j]==6||map[j]==9)  
                break;  
        }  
        printf("coordinate%d%d)\n",i,j);   
                      
        input = getch();   //getch()函数无需回车确认地获取用户输入,用于控制行走方向。  
        switch (input)  
        {  
        case 'w':
                        book++;  
            //如果人前面是空地。  //0代表空地  6代表人  3代表目的地  
            if(map[i-1][j]==0)  
            {  
                map[i-1][j]=6+0; //人往前走一步,ID为人的ID加上空地的ID。  
                if(map[j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID加上目的地ID)。  
                    map[j]=3; //将人往前走一步后原地的ID修改为目的地ID。  
                else  
                    map[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[j]==9) //如果原地也是目的地(ID9)。  
                    map[j]=3; //人走后把原地ID修改回目的地ID。  
                else  
                    map[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[j]==9) //如果之前是目的地。  
                        map[j]=3; //人走了之后修改回目的地ID。  
                    else  
                        map[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[j]==9)  
                        map[j]=3;  
                    else  
                        map[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[j]==9)   
                        map[j]=3;  
                    else  
                        map[j]=0;  
                }  
                //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。  
                if(map[i-2][j]==3)  
                {  
                    map[i-2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。  
                    map[i-1][j]=9;   //人站在了目的地上。  
                    //下面是对人原先站立地进行判断,方法同上。  
                    if(map[j]==9)   
                        map[j]=3;  
                    else  
                        map[j]=0;  
                }  
            }  
            break;  
        case 's':  
                book++;
            //如果人前面是空地。  
            if(map[i+1][j]==0)  
            {  
                map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。  
                if(map[j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。  
                    map[j]=3; //将人往前走一步后原地的ID修改为空地ID()。  
                else  
                    map[j]=0;    //否则原地ID修改为空地ID 。        
            }  
            //如果人前面是目的地。  
            else if(map[i+1][j]==3)  
            {  
                map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。  
                if(map[j]==9) //如果原地也是目的地(ID为)。  
                    map[j]=3; //人走后把原地ID修改回目的地ID。  
                else  
                    map[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[j]==9) //如果之前是目的地。  
                        map[j]=3; //人走了之后修改回目的地ID。  
                    else  
                        map[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[j]==9)  
                        map[j]=3;  
                    else  
                        map[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[j]==9)   
                        map[j]=3;  
                    else  
                        map[j]=0;  
                }  
                //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。  
                if(map[i+2][j]==3)  
                {  
                    map[i+2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。  
                    map[i+1][j]=9;   //人站在了目的地上。  
                    //下面是对人原先站立地进行判断,方法同上。  
                    if(map[j]==9)   
                        map[j]=3;  
                    else  
                        map[j]=0;  
                }  
            }  
            break;  
        case 'a':  
                book++;
            //如果人前面是空地。  
            if(map[j-1]==0)  
            {  
                map[j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。  
                if(map[j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。  
                    map[j]=3; //将人往前走一步后原地的ID修改为空地ID()。  
                else  
                    map[j]=0;    //否则原地ID修改为空地ID 。        
            }  
            //如果人前面是目的地。  
            else if(map[j-1]==3)  
            {  
                map[j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。  
                if(map[j]==9) //如果原地也是目的地(ID为)。  
                    map[j]=3; //人走后把原地ID修改回目的地ID。  
                else  
                    map[j]=0; //否则原地ID修改为为空地ID  
            }  
            //如果人前面是箱子。  
            else if(map[j-1]==4)  
            {  
                //如果人前面是箱子,而箱子前面是空地。  
                if (map[j-2]==0)  
                {   
                    map[j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()  
                    //下面是对箱子原地进行判断  
                    if(map[j-1]==7) //如果箱子原地为目的地。  
                        map[j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。  
                    else  
                        map[j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。  
                    //下面是对人原地进行判断  
                    if(map[j]==9) //如果之前是目的地。  
                        map[j]=3; //人走了之后修改回目的地ID。  
                    else  
                        map[j]=0; //否则就是空地。  
                }  
                //如果人的前面是箱子,而箱子前面是目的地。  
                else if (map[j-2]==3)  
                {   
                    count++;  
                    map[j-2]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。  
                    //下面是对箱子原先位置的判断,同上。  
                    if(map[j-1]==7)  
                        map[j-1]=9;  
                    else  
                        map[j-1]=6;  
                    //下面是对人原先位置进行判断,同上。  
                    if(map[j]==9)  
                        map[j]=3;  
                    else  
                        map[j]=0;  
                }  
            }  
            //如果人前面是已经进入某目的地的箱子(ID=7)。  
            else if(map[j-1]==7)  
            {  
                //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。  
                if(map[j-2]==0)  
                {  
                    count--;  
                    map[j-2]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。  
                    map[j-1]=9;   //人自然而然的就站在了原先的目的地上了。  
                    //下面是对人原先地进行判断,方法同上。  
                    if(map[j]==9)   
                        map[j]=3;  
                    else  
                        map[j]=0;  
                }  
                //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。  
                if(map[j-2]==3)  
                {  
                    map[j-2]=7;   //把箱子推入了另一目的地,自然,ID也应是。  
                    map[j-1]=9;   //人站在了目的地上。  
                    //下面是对人原先站立地进行判断,方法同上。  
                    if(map[j]==9)   
                        map[j]=3;  
                    else  
                        map[j]=0;  
                }  
            }  
            break;  
(太长没打完)
        


































推荐
发表于 2017-8-15 15:17:15 | 只看该作者
4399APPLE 发表于 2016-9-30 19:12
这叫printf不叫画图函数真可笑

printf的专业用语就是画图函数
推荐
发表于 2016-9-30 19:12:19 | 只看该作者
这叫printf不叫画图函数真可笑
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表