啊哈磊_编程从这里起步

标题: 推箱子 [打印本页]

作者: 森林木    时间: 2016-8-10 12:20
标题: 推箱子
啊哈C最后一课推箱子不会(TOT)

作者: 程序源代码    时间: 2016-8-10 12:20
下面是我自己额瞎写的,虽然不简洁,但是能用啊,全部复制进去就可以了
#include <stdio.h>
#include <stdlib.h>     
char move(p)
char p;
{
        char z;
    if(p=='S')z=' ';
    else z='*';
    return (z);
}
char now(p)
char p;
{        
    char z;
    if(p=='*'||p=='@')z='$';
    else z='S';
    return (z);
}
char box(p)
char p;
{
        char z;
    if(p==' ')z='O';
    else z='@';
    return (z);
}

main()
{
char a[7][11]={"##########",
               "##     ###",
               "##O###   #",
               "# S O  O #",
               "# **# O ##",
               "##**#   ##",
               "##########"};
int i,x,y;
char ch;
for(i=0;i<=6;i++)
    puts(a);
    x=3;y=2;
while(a[4][2]!='@'||a[4][3]!='@'||a[5][2]!='@'||a[5][3]!='@')
    {
    ch=getch();
    switch(ch)
                {
         case'w':if(a[x-1][y]!='#')               
                        {if(a[x-1][y]==' '||a[x-1][y]=='*')
                                {a[x][y]=move(a[x][y]);x--;a[x][y]=now(a[x][y]);}
             else if(a[x-2][y]!='#'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                                {a[x][y]=move(a[x][y]);x--;a[x][y]=now(a[x][y]);x--;a[x][y]=box(a[x][y]);x++;}
            }break;
         case's':if(a[x+1][y]!='#')
            {if(a[x+1][y]==' '||a[x+1][y]=='*')
                                {a[x][y]=move(a[x][y]);x++;a[x][y]=now(a[x][y]);}
              else if(a[x+2][y]!='#'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {a[x][y]=move(a[x][y]);x++;a[x][y]=now(a[x][y]);x++;a[x][y]=box(a[x][y]);x--;}
            }break;
         case'a':if(a[x][y-1]!='#')
            {if(a[x][y-1]==' '||a[x][y-1]=='*')
                                {a[x][y]=move(a[x][y]);y--;a[x][y]=now(a[x][y]);}
             else if(a[x][y-2]!='#'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                                {a[x][y]=move(a[x][y]);y--;a[x][y]=now(a[x][y]);y--;a[x][y]=box(a[x][y]);y++;}
             }break;
         case'd':if(a[x][y+1]!='#')
             {if(a[x][y+1]==' '||a[x][y+1]=='*')
                                {a[x][y]=move(a[x][y]);y++;a[x][y]=now(a[x][y]);}
             else if(a[x][y+2]!='#'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
                                {a[x][y]=move(a[x][y]);y++;a[x][y]=now(a[x][y]);y++;a[x][y]=box(a[x][y]);y--;}
             }break;
         }                     
    system("cls");
    for(i=0;i<=6;i++)
                puts(a);
    }
    system("cls");
    printf("you win!");
        system("pause");
}

推箱子.c

2.16 KB, 下载次数: 49


作者: 森林木    时间: 2016-8-11 21:21
算了— —我已经全知道了
作者: 森林木    时间: 2016-8-11 21:22
还没人???
作者: 程序源代码    时间: 2016-8-11 22:28
森林木 发表于 2016-8-11 21:21
算了— —我已经全知道了

额额,能不能发一下代码,交流一下
作者: 森林木    时间: 2016-8-12 08:27
我的:
    char a[15][15]={"       ###         ",
                           "       #*#         ",
                           "####O######",
                           "#*     OS  O  *#",
                           "#####O#####",
                           "        #  #        ",
                           "        #* #        ",
                           "        ###        ",};
作者: 森林木    时间: 2016-8-12 08:28
Sorry,打错了(TUT)
作者: 森林木    时间: 2016-8-12 08:30
第三四行什么意思
作者: 程序源代码    时间: 2016-8-12 10:35
森林木 发表于 2016-8-12 08:28
Sorry,打错了(TUT)

就是定义一个函数,可以在主函数中调用,你怎么定义这个函数,在调用时他就会按你的定义对括号里的数经行相应的操作,那个第三行和第四行的作用就是在能走动的情况下,把自己原来的位置改为空格或者星号,然后配合后面一个在自己前方打印一个S的函数,效果就像自己在往前走了
作者: 森林木    时间: 2016-8-12 11:04
我唯一不知道的就是*怎么变成@
作者: 程序源代码    时间: 2016-8-12 11:29
楼主,刚刚我把你的地图也加进去了,改几个数据就行了,不过不知道怎么把这些关卡连起来做个完整的游戏TAT
#include <stdio.h>
#include <stdlib.h>     
char move(p)
char p;
{
        char z;
    if(p=='S')z=' ';
    else z='*';
    return (z);
}
char now(p)
char p;
{       
    char z;
    if(p=='*'||p=='@')z='$';
    else z='S';
    return (z);
}
char box(p)
char p;
{
        char z;
    if(p==' ')z='O';
    else z='@';
    return (z);
}

main()
{
char a[15][15]={"   ###     ",
                 "   #*#     ",
                 "####O######",
                 "#*  OS O *#",
                 "#####O#####",
                 "    # #    ",
                 "    #*#    ",                 
                 "    ###    ",
                 };
int i,x,y;
char ch;
for(i=0;i<=7;i++)
    puts(a[i]);
    x=3;y=5;
while(a[1][4]!='@'||a[3][1]!='@'||a[3][9]!='@'||a[6][5]!='@')
    {
    ch=getch();
    switch(ch)
                {
         case'w':if(a[x-1][y]!='#')               
                        {if(a[x-1][y]==' '||a[x-1][y]=='*')
                                {a[x][y]=move(a[x][y]);x--;a[x][y]=now(a[x][y]);}
             else if(a[x-2][y]!='#'&&a[x-2][y]!='O'&&a[x-2][y]!='@')
                                {a[x][y]=move(a[x][y]);x--;a[x][y]=now(a[x][y]);x--;a[x][y]=box(a[x][y]);x++;}
            }break;
         case's':if(a[x+1][y]!='#')
            {if(a[x+1][y]==' '||a[x+1][y]=='*')
                                {a[x][y]=move(a[x][y]);x++;a[x][y]=now(a[x][y]);}
              else if(a[x+2][y]!='#'&&a[x+2][y]!='O'&&a[x+2][y]!='@')
                {a[x][y]=move(a[x][y]);x++;a[x][y]=now(a[x][y]);x++;a[x][y]=box(a[x][y]);x--;}
            }break;
         case'a':if(a[x][y-1]!='#')
            {if(a[x][y-1]==' '||a[x][y-1]=='*')
                                {a[x][y]=move(a[x][y]);y--;a[x][y]=now(a[x][y]);}
             else if(a[x][y-2]!='#'&&a[x][y-2]!='O'&&a[x][y-2]!='@')
                                {a[x][y]=move(a[x][y]);y--;a[x][y]=now(a[x][y]);y--;a[x][y]=box(a[x][y]);y++;}
             }break;
         case'd':if(a[x][y+1]!='#')
             {if(a[x][y+1]==' '||a[x][y+1]=='*')
                                {a[x][y]=move(a[x][y]);y++;a[x][y]=now(a[x][y]);}
             else if(a[x][y+2]!='#'&&a[x][y+2]!='O'&&a[x][y+2]!='@')
                                {a[x][y]=move(a[x][y]);y++;a[x][y]=now(a[x][y]);y++;a[x][y]=box(a[x][y]);y--;}
             }break;
         }                     
    system("cls");
    for(i=0;i<=6;i++)
                puts(a[i]);
    }
    system("cls");
    printf("you win!");
        system("pause");
}   

推箱子2.c

2.25 KB, 下载次数: 9


作者: 森林木    时间: 2016-8-12 11:31
可以把这些写到一块
作者: 程序源代码    时间: 2016-8-12 11:34
森林木 发表于 2016-8-12 11:04
我唯一不知道的就是*怎么变成@

就是第三个函数,box(p)那个,前面是空格就还是箱子,因为如果箱子前面是#或者还是箱子就不能走了,所以只剩下一种情况:前面是*,我懒得写了,就用了else,在这种情况下,把O改为@
作者: 程序源代码    时间: 2016-8-12 11:39
森林木 发表于 2016-8-12 11:31
可以把这些写到一块

你试试,我一下没会过来@—@
作者: 森林木    时间: 2016-8-12 11:39
在You Win后面按一个键到下一关
作者: 程序源代码    时间: 2016-8-12 11:43
森林木 发表于 2016-8-12 11:39
在You Win后面按一个键到下一关

怎么给新地图赋值呢,因为操作是通用的,简单复制会导致增加不少内存,我想有没有一种办法把操作那一部分提出来,这样只用编写关卡就够了,每次需要操作时自动跳转到操作程序,看看goto语句可不可以

作者: 森林木    时间: 2016-8-12 12:38
必须有一个函数命令重新开始
作者: 森林木    时间: 2016-8-12 12:41
goto REDO;是不行的
作者: 森林木    时间: 2016-8-12 12:42
http://tieba.baidu.com/p/1791822628
作者: 邀请码    时间: 2016-8-12 15:47
程序源代码 发表于 2016-8-10 12:20
下面是我自己额瞎写的,虽然不简洁,但是能用啊,全部复制进去就可以了
#include
#include      

这个不是C语言旧标准的函数定义方式么
作者: wx_jQqoDqqO    时间: 2017-8-31 14:11
:loveliness::loveliness:
作者: bnm5489178    时间: 2017-10-18 16:21
程序源代码 发表于 2016-8-12 11:39
你试试,我一下没会过来@—@

可以 加下QQ吗? QQ1135438451




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2