| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 813 人关注过本帖
标题:最基础的东西来实现“推箱子控制”
只看楼主 加入收藏
cosam
Rank: 4
等 级:业余侠客
帖 子:146
专家分:259
注 册:2011-8-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
最基础的东西来实现“推箱子控制”
经典游戏"推箱子"的核心控制部份
"M"是被推的~箱子
"W"是推不动的~墙
"笑脸"是会推东西的"小人"
用wintc,写得有点散,因为边想边写的,后面再整理一下。
其实这里只用到判断和赋值,数组,外加循环控制,很基础的东西,不需要高深的指针,类或者说结构体来做,让大家看得明白。
觉得学以致用才是最重要的,程序也只是个工具。
图片附件: 游客没有浏览图片的权限,请 登录注册

tuixiangzi.rar (1.43 KB)

重在想法的实现,高手赐教
程序代码:
# include <stdio.h>
# include <stdlib.h>
# include  <bios.h>
char showstate[25][80];
int x = 14;
int y = 15;
void initstate();/*初始化屏幕*/
void move();/*移动小人*/
void drawhuman_YH(int x,int y);/*向上移动*/
void drawhuman_YD(int x,int y);/*向下移动*/
void drawhuman_XL(int x,int y);/*向左移动*/
void drawhuman_XR(int x,int y);/*向右移动*/
void initwall();/*定义箱子的位置*/
void showall();/*显示屏幕所有的元素*/
void initwow();/*定义墙壁的位置*/
int winning();/*游戏胜利*/
void setgoal();/*设置目标点*/
/*-----------程序入口-----------------*/
int main()
{
    initstate();
    initwall();
    initwow();
    move();
    getch();
    return 0;
}
/*---------初始化状态-------------------*/
void initstate()
{
  int i;
  int j;
  for(i=0;i<80;++i)
  {
    for(j=0;j<25;++j)
    {
        showstate[i][j] ='0';
    }
  }

    return;
}
/*-----------向上-----------------*/
void drawhuman_YH(int x,int y)
{
    clrscr();
    showall();
    gotoxy(x,y);
    printf("%c\b",2);
    if(showstate[x][y]=='M')
    {
        showstate[x][y-1]='M';
        gotoxy(x,y-1);
        printf("%c",showstate[x][y-1]);
        showstate[x][y]='0';
        gotoxy(x,y);
    }

    return;
}
/*------------向下----------------*/
void drawhuman_YD(int x,int y)
{
    clrscr();
    showall();
    gotoxy(x,y);
    printf("%c\b",2);
    if(showstate[x][y]=='M')
    {
        showstate[x][y+1]='M';
        gotoxy(x,y+1);
        printf("%c",showstate[x][y+1]);
        showstate[x][y]='0';
        gotoxy(x,y);
    }

    return;
}
/*------------向左----------------*/
void drawhuman_XL(int x,int y)
{
    clrscr();
    showall();
    gotoxy(x,y);
    printf("%c\b",2);
    if(showstate[x][y]=='M')
    {
        showstate[x-1][y]='M';
        gotoxy(x-1,y);
        printf("%c",showstate[x-1][y]);
        showstate[x][y]='0';
        gotoxy(x,y);
    }

    return;
}
/*------------向右----------------*/
void drawhuman_XR(int x,int y)
{
    clrscr();
    showall();
    gotoxy(x,y);
    printf("%c\b",2);
    if(showstate[x][y]=='M')
    {
        showstate[x+1][y]='M';
        gotoxy(x+1,y);
        printf("%c",showstate[x+1][y]);
        showstate[x][y]='0';
        gotoxy(x,y);
    }

    return;
}
/*------------控制总部----------------*/
void move()
{
    while(1)
    {
        switch(bioskey(0))
        {
            case 18432:
            if(showstate[x][y-2]=='W'&& showstate[x][y-1]=='M')
            {
               break;
            }
             if(showstate[x][y-2]=='M'&& showstate[x][y-1]=='M')
            {
               break;
            }
            else if(showstate[x][y-1]=='W')
            {
                break;
            }

            else
            {
                y = y-1;drawhuman_YH(x,y);
                break;
            }
            case 20480:
            if(showstate[x][y+2]=='W'&& showstate[x][y+1]=='M')
            {
               break;
            }
            if(showstate[x][y+2]=='M'&& showstate[x][y+1]=='M')
            {
               break;
            }
            else if(showstate[x][y+1]=='W')
            {
                break;
            }
            else
            {
                y = y+1;drawhuman_YD(x,y);break;
            }
            case 19200:
            if(showstate[x-2][y]=='W'&& showstate[x-1][y]=='M')
            {
               break;
            }
            if(showstate[x-2][y]=='M'&& showstate[x-1][y]=='M')
            {
               break;
            }
            else if(showstate[x-1][y]=='W')
            {
                break;
            }
            else
            {
                x = x-1;drawhuman_XL(x,y);break;
            }
            case 19712:
            if(showstate[x+2][y]=='W'&& showstate[x+1][y]=='M')
            {
               break;
            }
            if(showstate[x+2][y]=='M'&& showstate[x+1][y]=='M')
            {
               break;
            }
            else if(showstate[x+1][y]=='W')
            {
                break;
            }
            else
            {
                x = x+1;drawhuman_XR(x,y);break;
            }
        }
    }
    return;
}
/*----------定义箱子的位置------------------*/
void initwall()
{
    showstate[11][23] = 'M';
    showstate[8][7] = 'M';
    showstate[6][18] = 'M';
     showstate[3][12] = 'M';

    return;
}
/*----------- 定义墙壁的位置------------*/
void initwow()
{
    showstate[5][21] = 'W';
    showstate[5][5] = 'W';
    showstate[4][50] = 'W';
    showstate[12][8] = 'W';
/*--------------目标点---------
    showstate[10][21] = 'G';
    showstate[11][5] = 'G';
    showstate[15][50] = 'G';
    showstate[7][8] = 'G';

---------------*/
    return;
}
/*---------显示屏幕所有的元素-------------------*/
void showall()
{
    int i;
    int j;
    for(i=0;i<80;++i)
    {
        for(j=0;j<25;++j)
        {
            if(showstate[i][j]=='0')
            {   gotoxy(i,j);
                printf("\0",showstate[i][j]);
             }
             else
             {
                gotoxy(i,j);
                printf("%c",showstate[i][j]);
             }
        }
    }
    return;
}
int winning()
{
    int i,j;
    for(i=0;i<80;++i)
    {
        for(j=0;j<25;++j)
        {
            if(showstate[i][j]!='G')
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
    }

}




[ 本帖最后由 cosam 于 2011-10-7 11:32 编辑 ]
搜索更多相关主题的帖子: 推箱子 经典游戏 结构体 
2011-10-06 15:18
cosam
Rank: 4
等 级:业余侠客
帖 子:146
专家分:259
注 册:2011-8-25
收藏
得分:0 
小人:"笑脸"
箱子:"M"
墙壁:"W"
他们之间都存在碰撞了。
这里只要大家加上几句设定,在墙壁坐标设定那里定义几个坐标“G”
加个判断,"M"是与“G"重合,检测屏幕上有没有"G"就可以完成这个游戏。
在定义初始箱子的位置可以用来画地图,自己设计一个地图

[ 本帖最后由 cosam 于 2011-10-7 11:12 编辑 ]
2011-10-06 15:38
cosam
Rank: 4
等 级:业余侠客
帖 子:146
专家分:259
注 册:2011-8-25
收藏
得分:0 

wintc在哪生成exe ``= =~
2011-10-07 11:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:14 
生成了你不知道放哪了而已。凡是可运行的C程序,都必定是以.EXE的形式运行,这是基本原理。虽然有些号称可以解释执行C语言的综合环境软件,但WIN-TC似乎不是(我没用过)。

授人以渔,不授人以鱼。
2011-10-07 11:36
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
佩服楼主...

我就是真命天子,顺我者生,逆我者死!
2011-10-07 21:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
楼主把箱子的图案发给我尝试一下?

授人以渔,不授人以鱼。
2011-10-07 21:52
快速回复:最基础的东西来实现“推箱子控制”
数据加载中...
 
   



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

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