我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言实现推箱子功能汇总

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言实现推箱子功能汇总

本文实例为大家分享了C语言实现推箱子功能的具体代码,供大家参考,具体内容如下

前言:

先说说我写推箱子小游戏的过程。

第一版:没有图形化界面,不能选关。只有推箱子的最基础功能。
第二版:增加图形化界面,但是不能选择关卡。
最终版:增加选择关卡功能、播放/关闭音乐功能、退出游戏功能,捕获鼠标功能。

首先看一下最终版效果图

功能点分析:

打开/关闭音乐和退出游戏比较简单。
打开音乐所需调用的头文件


#include <graphics.h> //调用easyx图形库时所需增加的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")  //静态库资源

打开音乐调用的easyx内部函数


mciSendString("open 1.mp3", 0, 0, 0);//播放存放c代码同一路径的1.mp3音乐
mciSendString("play 1.mp3", 0, 0, 0);//循环播放音乐资源

关闭音乐调用的easyx内部函数


mciSendString("close 1.mp3", 0, 0, 0);

退出游戏功能:直接找一个图片,当鼠标点击退出游戏这个区域,那么就显示该退出游戏的图片,并退出控制台。

选择关卡可以用三维数组:

三维数组可以理解为多个二维数组。例如map[3][10][10]表示有三个10x10的二维数组。当我点击关卡1,那么就打印map[1][10][10]这个区域的地图。关卡二和关卡三类似。

捕获鼠标信息:

easyx图形库给我们提供了鼠标捕获函数getmessage(EM_MOUSE)。以及保存鼠标消息结构体:


// 鼠标消息的数据
struct
{
 bool ctrl  :1;  // Ctrl 键是否按下
 bool shift  :1;  // Shift 键是否按下
 bool lbutton :1;  // 鼠标左键是否按下
 bool mbutton :1;  // 鼠标中键是否按下
 bool rbutton :1;  // 鼠标右键
 short x;    // 鼠标的 x 坐标
 short y;    // 鼠标的 y 坐标
 short wheel;   // 鼠标滚轮滚动值,为 120 的倍数
};

整体代码:



#include <stdio.h>
#include <conio.h>  //键盘输入函数库
#include <stdlib.h> //这个头文件包含了清屏函数system("cls");
#include <graphics.h> //调用easyx图形库时所需增加的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")  //静态库资源

int flag;//0表示关卡1,1表示关卡2,2表示关卡3
EASYXMSG  m; // 定义消息变量
 
int map[3][10][10] = 
  {                  
   1,1,1,1,1,1,1,1,1,1,
       1,0,0,0,0,0,3,0,0,1,
       1,0,0,5,4,0,0,0,0,1,
       1,0,0,1,1,0,0,0,0,1,
       1,0,1,0,0,0,1,0,0,1,
       1,0,0,4,0,0,1,0,0,1,
       1,0,0,0,0,0,0,0,0,1,
       1,0,0,3,0,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,
   //关卡1

   
    1,1,1,1,1,1,1,1,1,1,
       1,0,0,1,0,0,0,0,0,1,
       1,0,0,1,4,0,3,0,0,1,
       1,0,0,0,0,0,0,0,0,1,
       1,0,1,0,0,0,1,0,0,1,
       1,0,1,4,0,0,1,0,0,1,
       1,0,1,0,0,0,0,0,0,1,
       1,3,0,0,0,0,5,0,0,1,
       1,0,0,0,0,0,0,0,0,1,
       1,1,1,1,1,1,1,1,1,1,//关卡2

    1,1,1,1,1,1,1,1,1,1,
       1,1,0,0,1,1,0,0,0,1,
       1,1,0,4,0,0,0,0,0,1,
       1,1,0,1,1,0,0,0,0,1,
       1,0,0,0,0,0,1,0,3,1,
       1,0,0,4,0,0,1,0,0,1,
       1,0,0,0,0,0,0,4,1,1,
       1,0,0,3,0,5,0,0,1,1,
       1,0,0,0,0,0,0,3,0,1,
       1,1,1,1,1,1,1,1,1,1,//关卡3
   
   
 };



IMAGE img[9];  //9张图片,9个名字
void loadResource()
{
 loadimage(img + 0, "0.bmp", 50, 50);//50表示图片长宽,可以自己调的
 loadimage(img + 1, "1.bmp", 50, 50);
 loadimage(img + 2, "3.bmp", 50, 50);
 loadimage(img + 3, "4.bmp", 50, 50);
 loadimage(img + 4, "5.bmp", 50, 50);
 loadimage(img + 5, "7.bmp", 50, 50);
 loadimage(img + 6, "8.jpeg", 500, 200);
 loadimage(img + 7, "9.jfif", 500, 500);//退出游戏
 loadimage(img + 8, "10.jfif", 500, 500);//恭喜过关
}



void Printmap()
{
 int i,j;

  for (i = 0; i < 10; i++)
  {
   for (j = 0; j < 10; j++)
   {
   int x,y;
   x =  j* 50;
   y =  i* 50;
   switch (map[flag][i][j])
   {             
   //0:空地 1:墙 3:箱子要放的位置 4:箱子 5:人   7:箱子到达目的地       8:人到达目的地
   
   case 0: putimage(x, y, img + 0); break; //把图片打印在控制台,从坐标点x,y开始显示图片
   case 1: putimage(x, y, img + 1); break;
   case 3: putimage(x, y, img + 2); break;
   case 4: putimage(x, y, img + 3); break;

   case 5:
   case 8: putimage(x, y, img + 4); break;

   case 7: putimage(x, y, img + 5); break;
   default:
    break;
    }
   } 

  printf("\n");
 }
}


void PlayGame()
{
    char temp;
    //遍历整个地图,找到人所在的坐标,并把坐标值赋给i,j这两个变量。
    int x,y;
    int i,j;
    for(x=0;x<10;x++)
    {
        for(y=0;y<10;y++)
        {
            if(map[flag][x][y] == 5 || map[flag][x][y] == 8)
            {
                i=x;
                j=y;
            }
        }
    }

    temp = _getch();//键盘输入无回显函数

    switch (temp)
    {
        case 'W':
  case 'w':
        if (map[flag][i - 1][j] == 0 || map[flag][i - 1][j] == 3) //如果下一步是空地 或者是 箱子要放的位置
        {
            map[flag][i][j] -= 5;
            map[flag][i - 1][j] += 5;
        }
        if (map[flag][i - 1][j] == 4 || map[flag][i - 1][j] == 7)//如果下一步是箱子 或者是 箱子到达目的地
        {
            if (map[flag][i - 2][j] == 0 || map[flag][i - 2][j] == 3)//如果继续下一步是空地 或者是 箱子要放的位置
            {
                map[flag][i][j] -= 5;
                map[flag][i - 1][j] += 1;
                map[flag][i - 2][j] += 4;
            }
        }
        break;

  case 'S':
  case 's':
        if (map[flag][i + 1][j] == 0 || map[flag][i + 1][j] == 3)
        {
            map[flag][i][j] -= 5;
            map[flag][i + 1][j] += 5;
        }
        if (map[flag][i + 1][j] == 4 || map[flag][i + 1][j] == 7)
        {
            if (map[flag][i + 2][j] == 0 || map[flag][i + 2][j] == 3)
            {
                map[flag][i][j] -= 5;
                map[flag][i + 1][j] += 1;
                map[flag][i + 2][j] += 4;
            }
        }
        break;

  case 'A':
  case 'a':
        if (map[flag][i][j - 1] == 0 || map[flag][i][j - 1] == 3)
        {
            map[flag][i][j] -= 5;
            map[flag][i][j - 1] += 5;
        }
        if (map[flag][i][j - 1] == 4 || map[flag][i][j - 1] == 7)
        {
            if (map[flag][i][j - 2] == 0 || map[flag][i][j - 2] == 3)
            {
                map[flag][i][j] -= 5;
                map[flag][i][j - 1] += 1;
                map[flag][i][j - 2] += 4;
            }
        }
        break;

  case 'D':
  case 'd':
        if (map[flag][i][j + 1] == 0 || map[flag][i][j + 1] == 3)
        {
            map[flag][i][j] -= 5;
            map[flag][i][j + 1] += 5;
        }
        if (map[flag][i][j + 1] == 4 || map[flag][i][j + 1] == 7)
        {
            if (map[flag][i][j + 2] == 0 || map[flag][i][j + 2] == 3)
            {
                map[flag][i][j] -= 5;
                map[flag][i][j + 1] += 1;
                map[flag][i][j + 2] += 4;
            }
        }
        break;

    default:
        break;
    }
}


int gamePass() //游戏通关
{
    //地图上没有箱子就可以结束
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (map[flag][i][j] == 4)
            {
                return 0;
            }
        }
    }
    return 1;
}


void draw_initgraph()//游戏首页界面
{
 initgraph(500, 500);//创建一个大小为500 x 500 的窗口
 loadResource();//加载资源函数
 putimage(0, 0, &img[6]);//图1的左上角的顶点为(0,0) 
    setbkmode(TRANSPARENT); //设置填制背景为透明,这样填充文字时背景才是图片的颜色                    
    //在左上角坐标为(x,y)处输出文字
 //outtextxy(215, 50, "推箱子");   
 outtextxy(120, 250, "关卡1");
 outtextxy(240, 250, "关卡2");
 outtextxy(360, 250, "关卡3");
 outtextxy(105, 300, "打开音乐");
 outtextxy(105, 350, "关闭音乐");
 outtextxy(345, 350, "退出游戏");

    //在左上角(x1,y1)和右下角(x2,y2)范围画一个矩形,这个是设置的鼠标点击各按键时的范围
 rectangle(100, 245, 175, 270);//关卡1    
 rectangle(220, 245, 295, 270);//关卡2 
 rectangle(340, 245, 415, 270);//关卡3 
 rectangle(100, 295, 175, 320);//打开音乐
 //rectangle(390, 295, 465, 320);
 rectangle(100, 345, 175, 370);//关闭音乐
 rectangle(340, 345, 415, 370);//退出游戏

}

int  main()
{ 
level:
 draw_initgraph();

    while (1)
    {
  m = getmessage(EM_MOUSE);//获取鼠标信息

  if (m.x >= 100 && m.x <= 175 && m.y >= 295 && m.y <= 320) 
  {//如果光标在打开音乐
   setlinecolor(RED);
   rectangle(95, 290, 180, 325);
   if (m.lbutton) 
   {  //如果按下鼠标左键实现相应功能.
    mciSendString("open 1.mp3", 0, 0, 0);//播放音乐
    mciSendString("play 1.mp3", 0, 0, 0);//循环播放音乐资源
   }
  }

  else if(m.x >= 100 && m.x <= 175 && m.y >= 345 && m.y <= 370)
  {//如果光标在关闭音乐
   setlinecolor(RED);
   rectangle(95, 340, 180, 375);
   if (m.lbutton) 
   {  //如果按下鼠标左键实现相应功能.
    mciSendString("close 1.mp3", 0, 0, 0);//关闭音乐
   }
  }

  else if(m.x >= 340 && m.x <= 415 && m.y >= 345 && m.y <= 370)
  {//如果光标在退出游戏
   setlinecolor(RED);
   rectangle(335, 340, 420, 375);
   if (m.lbutton) 
   {  //如果按下鼠标左键实现相应功能.
     putimage(0, 0, &img[7]);//图3的左上角的顶点为(0,0)
     Sleep(2000);
     closegraph();
     break;
   }
  }

  else if(m.x >= 100 && m.x <= 175 && m.y >= 245 && m.y <= 270)
  {//如果光标在关卡1
   setlinecolor(RED);
   rectangle(95, 240, 180, 275);
   flag = 0;
   if (m.lbutton) 
   {  //如果按下鼠标左键实现相应功能. 
       
    while(!gamePass())
    {    
     Printmap();
     PlayGame();
     system("cls");
    }
    putimage(0, 0, &img[8]);//图3的左上角的顶点为(0,0)
    Sleep(1500);
    goto level;
   }
  }

  else if(m.x >= 220 && m.x <= 295 && m.y >= 245 && m.y <= 270)
  {//如果光标在关卡2

   setlinecolor(RED);
   rectangle(215, 240, 300, 275);
   flag = 1;
   if (m.lbutton) 
   {  //如果按下鼠标左键实现相应功能.
    while(!gamePass())
    {   
     Printmap();
     PlayGame();
     system("cls");
    }
    putimage(0, 0, &img[8]);//图3的左上角的顶点为(0,0)
    Sleep(1500);
    goto level;
   }
  }


  else if(m.x >= 340 && m.x <= 415 && m.y >= 245 && m.y <= 270)
  {//如果光标在关卡3

   setlinecolor(RED);
   rectangle(335, 240, 420, 275);
   flag = 2;
   if (m.lbutton) 
   {  //如果按下鼠标左键实现相应功能.
    while(!gamePass())
    {     
     Printmap();
     PlayGame();
     system("cls");
    }
    putimage(0, 0, &img[8]);//图3的左上角的顶点为(0,0)
    Sleep(1500);
    goto level;
   }
  }

  else
  { //当鼠标不在目标位置就用背景色覆盖之前的蓝色边框.
   setlinecolor(BLACK); 
   rectangle(95, 290, 180, 325);

   setlinecolor(BLACK); 
   rectangle(95, 340, 180, 375);

   setlinecolor(BLACK); 
   rectangle(335, 340, 420, 375);   
   
   setlinecolor(BLACK); 
   rectangle(95, 240, 180, 275);

   setlinecolor(BLACK); 
   rectangle(215, 240, 300, 275);

   setlinecolor(BLACK); 
   rectangle(335, 240, 420, 275);
  }
    }

 //closegraph();//关闭窗口
 
 return 0;    
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言实现推箱子功能汇总

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用C语言实现推箱子

这篇文章主要介绍“怎么用C语言实现推箱子”,在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现推箱子”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-29

C语言如何实现推箱子小游戏

本篇内容介绍了“C语言如何实现推箱子小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了C语言实现推箱子代码的具体代码,
2023-06-20

如何使用C语言实现推箱子游戏

这篇文章主要为大家展示了“如何使用C语言实现推箱子游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C语言实现推箱子游戏”这篇文章吧。1.前言推箱子是c语言的一个经典的项目2.游戏效果展
2023-06-29

怎么用C++实现推箱子功能附加回撤

本篇内容介绍了“怎么用C++实现推箱子功能附加回撤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编码环境:VS2019 利用 链栈实现的回撤
2023-06-25

怎么用C语言实现游戏项目推箱子效果

本篇内容主要讲解“怎么用C语言实现游戏项目推箱子效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言实现游戏项目推箱子效果”吧!直接开始吧首先是我们用二维数组特定的数字描绘出这个地图i
2023-06-25

c语言怎么实现功能选择

在 c 语言中,可以使用 switch-case 语句实现功能选择。它允许根据提供的表达式(称为选择器)的值来执行不同的代码块。结构如下:switch (选择器) {}case 值1: 执行代码块 1break;case 值2: 执行代码块
c语言怎么实现功能选择
2024-05-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录