⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pushes the box.c

📁 推箱子基本的游戏开发
💻 C
字号:
//连接头文件部分
#include "stdio.h"
#include "conio.h"
#define XMAX 20   //最大宽度
#define YMAX 20   //最大长度

//主角的当前状态
struct Lead
{
      int x; //列坐标
      int y; //行坐标
}Condition={10,5}; //初始化主角坐标

//地图原型
char Map[XMAX][YMAX] =
{

{'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'},
{'|','s','0','s','0','|','s','0','0','0','|','0','0','s','|','0','s','o','|'},
{'|','0','o','0','0','|','0','0','e','0','|','o','0','0','|','0','0','0','|'},
{'|','0','0','0','0','|','o','0','0','0','|','0','e','0','|','e','0','0','|'},
{'|','0','0','0','0','|','0','0','0','0','0','0','0','0','0','0','0','0','|'},
{'|','0','-','-','-','|','-','-','-','0','0','0','0','0','0','0','0','0','|'},
{'|','0','0','0','0','0','0','0','0','0','|','0','o','o','|','0','0','s','|'},
{'|','0','-','-','-','-','-','-','0','-','|','0','0','0','|','-','-','-','|'},
{'|','0','e','0','0','|','0','o','0','0','|','0','0','0','|','0','0','0','|'},
{'|','0','0','0','0','|','0','0','0','0','|','s','0','s','0','0','0','o','|'},
{'|','0','o','0','0','|','0','e','0','0','|','-','-','0','0','0','0','0','|'},
{'|','0','0','0','0','|','0','0','0','0','|','0','0','0','|','0','0','0','|'},
{'|','0','0','-','-','-','-','-','-','0','0','0','0','0','|','-','-','0','|'},
{'|','0','o','0','0','0','0','0','0','0','0','e','e','0','|','0','o','0','|'},
{'|','0','0','-','-','|','0','0','0','0','|','0','0','0','|','o','0','0','|'},
{'|','0','0','0','0','|','o','0','e','0','|','0','0','0','|','0','e','0','|'},
{'|','0','e','0','0','|','0','0','0','0','|','0','s','0','|','0','0','0','|'},
{'|','0','0','e','0','|','s','0','0','0','|','e','0','0','|','e','0','0','|'},
{'|','0','0','0','0','|','0','0','0','0','|','0','0','0','|','0','s','0','|'},
{'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'}

};

//初始化地图
int Cartography (void)

{
      int x,y,i,j;  //坐标变量
      for (x=0,i=2;x<XMAX;++x,++i)
      {
            for (y=0,j=2;y<YMAX-1;++y,++j)
            {
                  gotoxy (j,i);   //定位光标
                  switch (Map[x][y])   //绘制地图
                  {
                        case '-': printf ("%c",45);  delay (5000); break;
                        case '|': printf ("%c",179); delay (5000); break;
                        case 'e': printf ("%c",254); delay (5000); break;
                        case 'o': printf ("%c",35);  delay (5000); break;
                        case 's': printf ("%c",3);   delay (5000); break;
                        case '0': break; //空地的情况下
                        default : printf ("Map Error!"); break; //地图错误
                  }
            }
      }
      return 0;  //返回
}

//构造主角模块
int Character (void)

{
      gotoxy (Condition.x,Condition.y); //得到主角初始位置
      printf ("%c",2);  //打印主角
      return 0;
}

//显示信息模块
int Show (void)

{
      gotoxy (30,4);  delay (5000); printf ("小游戏 - 推箱子\tBy:帕帕 To:2007/4/22");
      gotoxy (30,6);  delay (5000); printf ("Checkpoint:");  //当前关卡
      gotoxy (30,8);  delay (5000); printf ("Your Score:");  //分数
      gotoxy (30,10); delay (5000); printf ("Has used the time:"); //使用时间
      return 0;
}

//键盘控制模块
int Control (void)

{
      char temp;   //临时单元
      while (1)    //死循环
      {
            if (kbhit ()) //检测键盘是否有键被按下
            {
                  temp = bdos (7,0,0); //ascii码存入temp
                  switch (temp) //按下的是什么键
                  {
                        case 'H':  //按下上方向键
                        if (Map[Condition.x][Condition.y-1] == '-' || Map[Condition.x][Condition.y-1] == '|')  //前方是墙壁
                        {
                              break;  //什么都不做
                        }
                        else
                        {
                              if (Map[Condition.x][Condition.y-1] == 'e' && Map[Condition.x][Condition.y-2] == 0) //前方是箱子,有足够空格
                              {
                                    gotoxy (Condition.x,Condition.y);   //定位当前坐标
                                    printf ("%c",0);   //清除当前主角
                                    gotoxy (Condition.x,Condition.y-1); //定位箱子坐标
                                    printf ("%c",2);   //主角覆盖箱子
                                    gotoxy (Condition.x,Condition.y-2); //定位新箱子坐标
                                    printf ("%c",254); //打印新箱子
                                    Condition.y-=1;    //保存当前坐标
                              }
                              else //判断前方是箱子还是空地
                              {
                                    if (Map[Condition.x][Condition.y-1] != 'e') //前方是空地
                                    {
                                          gotoxy (Condition.x,Condition.y);
                                          printf ("%c",0);
                                          gotoxy (Condition.x,Condition.y-1);
                                          printf ("%c",2);
                                          Condition.y-=1; //更新主角坐标
                                    }
                                    else //前方是箱子,但没足够空地移动
                                    {
                                          break;
                                    }
                              }
                        }
                        break; //跳出分支结构

                        case 'P': //按下下方向键
                        if (Map[Condition.x][Condition.y+1] == '-' || Map[Condition.x][Condition.y+1] == '|')  //前方是墙壁
                        {
                              break;  //什么都不做
                        }
                        else
                        {
                              if (Map[Condition.x][Condition.y+1] == 'e' && Map[Condition.x][Condition.y+2] == 0) //前方是箱子,有足够空格
                              {
                                    gotoxy (Condition.x,Condition.y);   //定位当前坐标
                                    printf ("%c",0);   //清除当前主角
                                    gotoxy (Condition.x,Condition.y+1); //定位箱子坐标
                                    printf ("%c",2);   //主角覆盖箱子
                                    gotoxy (Condition.x,Condition.y+2); //定位新箱子坐标
                                    printf ("%c",254); //打印新箱子
                                    Condition.y+=1;    //保存当前坐标
                              }
                              else //判断前方是箱子还是空地
                              {
                                    if (Map[Condition.x][Condition.y+1] != 'e') //前方是空地
                                    {
                                          gotoxy (Condition.x,Condition.y);
                                          printf ("%c",0);
                                          gotoxy (Condition.x,Condition.y+1);
                                          printf ("%c",2);
                                          Condition.y+=1; //更新主角坐标
                                    }
                                    else //前方是箱子,但没足够空地移动
                                    {
                                          break;
                                    }
                              }
                        }
                        break;

                        case 'K': //按下左方向键
                        if (Map[Condition.x-1][Condition.y] == '-' || Map[Condition.x-1][Condition.y] == '|')  //前方是墙壁
                        {
                              break;  //什么都不做
                        }
                        else
                        {
                              if (Map[Condition.x-1][Condition.y] == 'e' && Map[Condition.x-2][Condition.y] == 0) //前方是箱子,有足够空格
                              {
                                    gotoxy (Condition.x,Condition.y);   //定位当前坐标
                                    printf ("%c",0);   //清除当前主角
                                    gotoxy (Condition.x-1,Condition.y); //定位箱子坐标
                                    printf ("%c",2);   //主角覆盖箱子
                                    gotoxy (Condition.x-2,Condition.y); //定位新箱子坐标
                                    printf ("%c",254); //打印新箱子
                                    Condition.x-=1;    //保存当前坐标
                              }
                              else //判断前方是箱子还是空地
                              {
                                    if (Map[Condition.x-1][Condition.y] != 'e') //前方是空地
                                    {
                                          gotoxy (Condition.x,Condition.y);
                                          printf ("%c",0);
                                          gotoxy (Condition.x-1,Condition.y);
                                          printf ("%c",2);
                                          Condition.x-=1; //更新主角坐标
                                    }
                                    else //前方是箱子,但没足够空地移动
                                    {
                                          break;
                                    }
                              }
                        }
                        break;

                        case 'M':  //按下右方向键
                        if (Map[Condition.x+1][Condition.y] == '-' || Map[Condition.x+1][Condition.y] == '|')  //前方是墙壁
                        {
                              break;  //什么都不做
                        }
                        else
                        {
                              if (Map[Condition.x+1][Condition.y] == 'e' && Map[Condition.x+2][Condition.y] == 0) //前方是箱子,有足够空格
                              {
                                    gotoxy (Condition.x,Condition.y);   //定位当前坐标
                                    printf ("%c",0);   //清除当前主角
                                    gotoxy (Condition.x+1,Condition.y); //定位箱子坐标
                                    printf ("%c",2);   //主角覆盖箱子
                                    gotoxy (Condition.x+2,Condition.y); //定位新箱子坐标
                                    printf ("%c",254); //打印新箱子
                                    Condition.x+=1;    //保存当前坐标
                              }
                              else //判断前方是箱子还是空地
                              {
                                    if (Map[Condition.x+1][Condition.y] != 'e') //前方是空地
                                    {
                                          gotoxy (Condition.x,Condition.y);
                                          printf ("%c",0);
                                          gotoxy (Condition.x+1,Condition.y);
                                          printf ("%c",2);
                                          Condition.x+=1; //更新主角坐标
                                    }
                                    else //前方是箱子,但没足够空地移动
                                    {
                                          break;
                                    }
                              }
                        }
                        break;

                        case 32: Cartography (); Character (); Show (); Control (); break;

                        case 27: clrscr (); printf ("游戏结束 ^_^\n"); getch (); exit (0);

                  }
            }
      }
      return 0;
}

int main (void) //程序入口地址

{
      Cartography (); //绘制地图
      Character ();   //打印人物
      Show ();        //打印附加信息
      Control ();     //键盘控制
      getch ();
      return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -