| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1464 人关注过本帖
标题:推箱子~
取消只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:3 
推箱子~
昨天在网上上了C/C++的实践课~讲了关于推箱子的内容~于是九九就敲了一下~感觉效果不错~可以自己改改地图~

程序代码:
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#define N 10//地图规模大小

int Game_Print(int map[N][N],int man[]);
int Game_Play(int map[N][N],int x,int y);
int Game_Move();

int main()
{
    int map[N][N]=
    {
        {1,1,1,1,1,1,1,1,1,1},//0空地
        {1,0,0,0,0,0,0,0,0,1},//1墙
        {1,0,0,5,0,0,0,0,0,1},//3目的地
        {1,0,0,0,0,0,0,3,0,1},//4箱子
        {1,0,0,0,0,0,0,3,0,1},//7箱子+目的地
        {1,0,0,0,1,0,0,3,0,1},//8人+目的地
        {1,0,0,4,4,4,0,0,0,1},
        {1,0,0,0,1,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,1,1,1,1,1,1,1,1,1},
    };

    int man[2]={0};//初始化人物坐标
    int flag=Game_Print(map,man);//初始化地图

    while (flag)
        if (Game_Play(map,man[0],man[1]))
            flag=Game_Print(map,man);

    printf("恭喜过关!\n");

    return 0;
}
int Game_Print(int map[N][N],int man[])
{
    int i=0;
    int j=0;
    int flag=0;

    char p[]={" #!*@o!$&"};//地图元素

    for (system("cls");i!=N;++i)
        for (j=0;j!=N+1;++j)
        {
            if (map[i][j]==5||map[i][j]==8)//获取人物坐标
            {
                man[0]=i;
                man[1]=j;
            }

            flag+=(map[i][j]==4);//当地图有箱子时~
            putchar(j!=N?p[map[i][j]]:'\n');//输出数据
        }

    return flag;
}
int Game_Move()
{
    char move=getch();
    char a[]={'w','W',72,'s','S',80,'a','A',75,'d','D',77,'\0'};
    int k=strcspn(a,&move)/3+1;

    return (((k+1)/2)*(1-2*(k%2)))%3;
}
int Game_Play(int map[N][N],int x,int y)
{
    int move=Game_Move();//获取人物方向

    int* k0=&map[x][y];//人的位置
    int* k1=&map[x+move%2][y+(move+1)%2];//获取的前一个位置
    int* k2=(*k1==4||*k1==7)?&map[x+2*(move%2)][y+2*((move+1)%2)]:NULL;//获取人物的前面二个位置

    if (move==0)//如果无效输入
        return 0;

    if (*k1==0||*k1==3)//如果第一个位置是空地或者是目的地
    {
        *k0-=5;
        *k1+=5;
        return 1;//处理完毕
    }

    if ((*k1==4||*k1==7)&&(*k2==0||*k2==3))//如果第一个位置是箱子或者是箱子+目的地
    {
        *k0-=5;
        *k1+=1;
        *k2+=4;
        return 1;//处理完毕
    }

    return 0;//无效移动
}


[此贴子已经被作者于2017-2-23 03:28编辑过]

搜索更多相关主题的帖子: 网上 推箱子 
2017-02-22 10:55
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉Game_move函数还可以改进一下~主要是原版占的篇幅太大了~而且还要用switch结构~
原版的~
程序代码:
int Game_Move()
{

    switch(getch())
    {
        case 'w':
        case 'W':
        case 72:
        return -1;

        case 's':
        case 'S':
        case 80:
        return 1;

        case 'a':
        case 'A':
        case 75:
        return -2;

        case 'd':
        case 'D':
        case 77:
        return 2;

        default:
        return 0;
    }
}


改进后的~

程序代码:
int Game_Move()
{
    char move=getch();
    char a[]={'w','W',72,'s','S',80,'a','A',75,'d','D',77,'\0'};
    int k=strcspn(a,&move)/3+1;

    return ((k+1)/2)*(1-2*(k%2))%3;
}

效果一样~~~~~~~~

PS:啊~~~~~改进Game_Move函数不仅篇幅节省不少~而且还摆脱了switch结构~~~~

[此贴子已经被作者于2017-2-22 13:17编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-22 12:50
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 yuantkong
试试读取文件~过一关取一关~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-22 16:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
如果文件库地图大小规模一样的话好像没有必要~地图直接用现成数组处理~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-22 18:50
快速回复:推箱子~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015014 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved