| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1432 人关注过本帖
标题:推箱子~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:9 
推箱子~
昨天在网上上了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
qdcs
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:171
专家分:458
注 册:2016-12-22
收藏
得分:4 
好玩


我是硬件工程师
2017-02-22 13:26
yuantkong
Rank: 2
等 级:论坛游民
威 望:3
帖 子:82
专家分:86
注 册:2016-5-17
收藏
得分:4 
可以,很娱乐。

如何建立一个地图库, 然后过关后直接切换


2017-02-22 16:44
九转星河
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
yuantkong
Rank: 2
等 级:论坛游民
威 望:3
帖 子:82
专家分:86
注 册:2016-5-17
收藏
得分:0 
程序代码:
#define _CRT_SECURE_NO_WARNINGS

#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] = { '\0' };
    FILE *fp;
    fp = fopen("map.txt", "r");
    
    if (fp == NULL)
    {
        printf("No find");

    }
        int i, j;
        while (!EOF==0)
        {
            for (i = 0; i < N; i++)
                for (j = 0; j < N; j++)
                {
                    fscanf(fp, "%d", &map[i][j]);
                }

            int man[2] = { 0 };//初始化人物坐标

            int flag = 1;

            flag = Game_Print(map, man);//初始化地图

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

            printf("恭喜过关!\n");
            printf("点击任意键进入下一关\n");
            _getch();
        }
    return 0;
}
int Game_Print(int map[N][N], int man[])
{
    int i = 0;
    int j = 0;
    int flag = 0;

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

    system("cls");

    for (; 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;
            }

            if (map[i][j] == 4)
                flag = 1;//当地图有箱子时~

            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 = NULL;//预先申明人物的前面二个位置

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

    if (*k1 == 4 || *k1 == 7)//判断是否有越界的可能
        k2 = &map[x + 2 * (move % 2)][y + 2 * ((move + 1) % 2)];


    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-02-22 17:18
九转星河
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
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:4 
经典游戏。适合练习算法
2017-02-23 13:40
wx595882506
Rank: 1
等 级:新手上路
帖 子:3
专家分:8
注 册:2017-2-20
收藏
得分:4 
请教一下,Game_Move函数里
 char a[] = { 'w','W',72,'s','S',80,'a','A',75,'d','D',77,'\0' };
里面的72,80,75,77是什么意思?
另外
return (((k+1)/2)*(1-2*(k%2)))%3;
这么表达式怎么算出来的,没看明白
2017-02-23 18:29
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:4 

Code is my life.
2017-02-23 19:47
快速回复:推箱子~
数据加载中...
 
   



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

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