返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么用C++实现推箱子功能附加回撤
  • 768
分享到

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

2023-06-25 12:06:50 768人浏览 八月长安
摘要

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

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

编码环境:VS2019 

利用 链栈实现的回撤功能。

LinkStack.h

#pragma once#ifdef _cplusplusextern "C"{#endif #include <fstream>#include <iOStream>#include<stdbool.h>using namespace std; #define OK 1#define ERROR 0#define OVERFLOW -2//typedef int Data; struct Point{    int r;    int c;    int data;}; typedef struct _State{    Point pos[3];}Data,State; typedef struct Stacknode{    Data data;    struct StackNode* next;} StackNode, * LinkStack; //算法1 链栈的初始化(无头节点)void InitStack(LinkStack& S){ // 构造一个空栈 S,栈顶指针置空    S = NULL;   // return OK;} //算法2 链栈的入栈void Push(LinkStack& S, Data e){ //在栈顶插入元素e    LinkStack p;    p = new StackNode; //生成新结点    p->data = e;       //将新结点数据域置为e    p->next = S;       //将新结点插入栈顶(类似与前插法,只不过没有头节点)    S = p;             //修改栈顶指针为p    printf("ok\n");    //return OK;} //算法3链栈的出栈void Pop(LinkStack& S){ //删除S的栈顶元素,用e返回其值    LinkStack p;    if (S == NULL)        return ; //栈空   // e = S->data;      //将栈顶元素赋给e    p = S;            //用p临时保存栈顶元素空间,以备释放    S = S->next;      //修改栈顶指针    delete p;         //释放原栈顶元素的空间   // return OK;}//算法4 取链栈的栈顶元素Data GetTop(LinkStack S){                       //返回S的栈顶元素,不修改栈顶指针    if (S != NULL)      //栈非空        return S->data; //返回栈顶元素的值,栈顶指针不变} bool empty(LinkStack& S) {    if (S == NULL)        return true;     else return false;}////void empty(LinkStack& S) {////} #ifdef _cplusplus}#endif

cpp文件

#include<cstdlib>#include<iostream>#include<time.h>#include<time.h>#include<math.h>#include<coNIO.h>#include <windows.H>#include<graphics.h>  //包含IMAGE数组#include"LinkStack.h" using namespace std; #define SIZE 10#define TOTAL_LEVEL 3 LinkStack ls; //?? enum MINE {    SPACE,    WALL,    DEST,    BOX,    PLAYER, }; //LinkStack* ls; int x;int y;int level;IMAGE all_image[6];//空地0 墙1 目的地2 箱子3 玩家4 //PLAYER+DEST 5   BOX+DEST:6//a75  d77 72w 80s int map[TOTAL_LEVEL][SIZE][SIZE] = {    {        {0,0,0,0,0,0,0,0,0,0},        {0,0,0,1,1,1,0,0,0,0},        {0,0,0,1,2,1,0,0,0,0},        {0,0,0,1,3,1,1,1,1,0},        {0,1,1,1,0,0,3,2,1,0},        {0,1,2,3,4,0,1,1,1,0},        {0,1,1,1,1,3,1,0,0,0},        {0,0,0,0,1,2,1,0,0,0},        {0,0,0,0,1,1,1,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,1,1,1,1,1,1,0,0},        {0,0,1,0,2,0,0,1,0,0},        {0,0,1,0,0,3,0,1,0,0},        {0,0,1,0,0,0,0,1,0,0},        {0,0,1,0,0,4,0,1,0,0},        {0,0,1,1,1,1,1,1,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,0,0,0,0},        {0,1,1,1,0,0,0,0,0,0},        {0,1,2,1,0,0,0,0,0,0},        {0,1,3,1,0,0,0,0,0,0},        {0,1,4,1,0,0,0,0,0,0},        {0,1,1,1,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,0,0,0,0,0,0,0,0}    } }; void loadIMG(){     for (int i = 0; i < 6; i++)    {        char file[20] = "";        sprintf(file, "./image/%d.bmp", i);        loadimage(all_image + i, file, 64, 64);//IMAGE *pDstImg(// 保存图像的 IMAGE 对象指针),         //e.g.loadimage(all_image + i,"0.bmp",64,64); //LPCTSTR pImgFile,图片文件名                                             //int nWidth = 0, int nHeight = 0, bool bResize = false);        //putimage(i*64,0,all_image + i); //坐标原点为左上角。注意x,y坐标     } } void upMove() {    if (map[level][x - 1][y] == SPACE || map[level][x - 1][y] == DEST) {        map[level][x - 1][y] += PLAYER;        map[level][x][y] -= PLAYER;    }    else if (map[level][x - 1][y] == BOX || map[level][x - 1][y] == BOX + DEST) {        if (map[level][x - 2][y] == SPACE || map[level][x - 2][y] == DEST) {            map[level][x - 2][y] += BOX;            map[level][x - 1][y] = map[level][x - 1][y] + PLAYER - BOX;            map[level][x][y] -= PLAYER;        }     } } void downMove() {    if (map[level][x + 1][y] == SPACE || map[level][x + 1][y] == DEST) {        map[level][x + 1][y] += PLAYER;        map[level][x][y] -= PLAYER;    }    else if (map[level][x + 1][y] == BOX || map[level][x + 1][y] == BOX + DEST) {        if (map[level][x + 2][y] == SPACE || map[level][x + 2][y] == DEST) {            map[level][x + 2][y] += BOX;            map[level][x + 1][y] = map[level][x + 1][y] + PLAYER - BOX;            map[level][x][y] -= PLAYER;        }     } } void leftMove() {    if (map[level][x][y - 1] == SPACE || map[level][x][y - 1] == DEST) {        map[level][x][y - 1] += PLAYER;        map[level][x][y] -= PLAYER;    }    else if (map[level][x][y - 1] == BOX || map[level][x][y - 1] == BOX + DEST) {        if (map[level][x][y - 2] == SPACE || map[level][x][y - 2] == DEST) {            map[level][x][y - 2] += BOX;            map[level][x][y - 1] = map[level][x][y - 1] + PLAYER - BOX;            map[level][x][y] -= PLAYER;        }     } } void rightMove() {    if (map[level][x][y + 1] == SPACE || map[level][x][y + 1] == DEST) {        map[level][x][y + 1] += PLAYER;        map[level][x][y] -= PLAYER;    }    else if (map[level][x][y + 1] == BOX || map[level][x][y + 1] == BOX + DEST) {        if (map[level][x][y + 2] == SPACE || map[level][x][y + 2] == DEST) {            map[level][x][y + 2] += BOX;            map[level][x][y + 1] = map[level][x][y + 1] + PLAYER - BOX;            map[level][x][y] -= PLAYER;        }     } } void gameDraw() {    for (int i = 0; i < SIZE; i++)    {        for (int j = 0; j < SIZE; j++)        {            switch (map[level][i][j])            {            case SPACE:                putimage(j * 64, i * 64, all_image);                break;            case WALL:                putimage(j * 64, i * 64, all_image + 1);                break;            case DEST:                putimage(j * 64, i * 64, all_image + 2);                break;            case BOX:                putimage(j * 64, i * 64, all_image + 3);                break;            case PLAYER:                x = i;                y = j;                putimage(j * 64, i * 64, all_image + 4);                break;            case PLAYER + DEST:                putimage(j * 64, i * 64, all_image + 4);                x = i;                y = j;                break;            case BOX + DEST:                putimage(j * 64, i * 64, all_image + 5);                break;            default:                break;            }         }        cout << endl;     } } //对应的ASC码值//W w:119,87  Dd:100,68 Ww:119,87 Ss:115,83 空格:32void saveState(int x, int y, int dir) {//player的坐标,以及keyevent    //State t;    State t;    memset(&t, 0, sizeof(State));    switch (dir)    {    case 119://w    case 87:        for (int i = 0; i < 3; i++)        {            t.pos[i].r = x - i;  //依次记录 player 、player的下一格、以及player的下下一格 的行列坐标以及data            t.pos[i].c = y;            t.pos[i].data = map[level][t.pos[i].r][t.pos[i].c];         }        Push(ls, t);        break;    case 115://s    case 83:        for (int i = 0; i < 3; i++)        {            t.pos[i].r = x + i;  //依次记录 player 、player的下一格、以及player的下下一格 的行列坐标以及data            t.pos[i].c = y;            t.pos[i].data = map[level][t.pos[i].r][t.pos[i].c];         }        Push(ls, t);        Data p = GetTop(ls);        break;     case 97://a    case 65:        for (int i = 0; i < 3; i++)        {            t.pos[i].r = x;  //依次记录 player 、player的下一格、以及player的下下一格 的行列坐标以及data            t.pos[i].c = y - i;            t.pos[i].data = map[level][t.pos[i].r][t.pos[i].c];        }        Push(ls, t);        break;     case 100://d    case 68:        for (int i = 0; i < 3; i++)        {            t.pos[i].r = x;  //依次记录 player 、player的下一格、以及player的下下一格 的行列坐标以及data            t.pos[i].c = y + i;            t.pos[i].data = map[level][t.pos[i].r][t.pos[i].c];         }        Push(ls, t);        break;    default:        break;    }    } void rollBack() {    if (empty(ls))    {        return;    }    State t = GetTop(ls);    for (int i = 0; i < 3; i++)    {        map[level][t.pos[i].r][t.pos[i].c] = t.pos[i].data;    }    Pop(ls);} void keyEvent() {    char event = _getch();    if (event != 32  && event != -32) {        saveState(x, y, event);    }    switch (event)    {    case 'W':    case 'w':        upMove();        break;     case 's':    case 'S':        downMove();        break;     case 'A':    case 'a':        leftMove();        break;    case 'd':    case 'D':        rightMove();        break;    case 32:        rollBack();        break;    default:        break;    }  } bool judge_pass() {    for (int i = 0; i < SIZE; i++)    {        for (int j = 0; j < SIZE; j++)        {            if (map[level][i][j] == BOX)            {                return false;            }         }     }     return true;} int main() {    InitStack(ls);    initgraph(SIZE * 64, SIZE * 64, TRUE);    loadIMG();    //system("mode con lines=20 cols=25");    level = 0;    while (level < TOTAL_LEVEL)    {        //system("cls");        gameDraw();        keyEvent();         if (judge_pass())        {            if (level == TOTAL_LEVEL - 1) {                //system("cls");                gameDraw();            }            level++;            while (!empty(ls))            {                Pop(ls);            }         }     }     MessageBox(NULL, TEXT("CONGRATULATIONS!"), TEXT("GAME OVER"), MB_OK);     // getchar();      return 0;}

“怎么用C++实现推箱子功能附加回撤”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么用C++实现推箱子功能附加回撤

本文链接: https://lsjlt.com/news/304360.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用C++实现推箱子功能附加回撤
    本篇内容介绍了“怎么用C++实现推箱子功能附加回撤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编码环境:VS2019 利用 链栈...
    99+
    2023-06-25
  • C++实现推箱子功能附加回撤示例
    跟着B站老师 做的,链接[C/C++]180行代码,推箱子就是这么简单~抄详细,学不会我还不信了,关卡切换和回退都实现了哦_哔哩哔哩_bilibili 编码环境:VS2019&nbs...
    99+
    2024-04-02
  • C语言实现推箱子功能汇总
    本文实例为大家分享了C语言实现推箱子功能的具体代码,供大家参考,具体内容如下 前言: 先说说我写推箱子小游戏的过程。 第一版:没有图形化界面,不能选关。只有推箱子的最基础功能。 第二...
    99+
    2024-04-02
  • 怎么用C语言实现推箱子
    这篇文章主要介绍“怎么用C语言实现推箱子”,在日常操作中,相信很多人在怎么用C语言实现推箱子问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现推箱子”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-29
  • C语言怎么实现推箱子
    本文小编为大家详细介绍“C语言怎么实现推箱子”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现推箱子”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体代码如下#inc...
    99+
    2024-04-02
  • 详解C语言实现推箱子的基本功能
    目录1.前言2.游戏效果展示3.项目分析4.地图实现4.1存储地图4.2打印地图5.控制角色移动5.1找到控制的角色5.2实现移动6.判断胜利总结1.前言 首先推箱子是c语言的一个经...
    99+
    2024-04-02
  • C++怎么实现推箱子小游戏
    这篇文章主要介绍“C++怎么实现推箱子小游戏”,在日常操作中,相信很多人在C++怎么实现推箱子小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现推箱子小游戏”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • 详解C语言实现推箱子的基本功能(2)
    目录1.前言2.地图代码修改成函数3.角色移动修改成函数3.1寻找角色函数3.2角色移动函数4.判断胜利修改成函数5.主体函数的实现6.推箱子能实现基本功能的源码总结1.前言 本文章...
    99+
    2024-04-02
  • 用C++实现推箱子小游戏
    前言 推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,用的是vs编译器。 代码还有很多可以优化的地方,为了更直观了解函数的形参和实参,所以地图没有用全局变量声明了,其...
    99+
    2024-04-02
  • 使用C/C++怎么实现一个推箱子小游戏
    这篇文章给大家介绍使用C/C++怎么实现一个推箱子小游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何实现首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组。2.定义小猪,箱子,墙,空地等信息在三维数组...
    99+
    2023-06-15
  • 如何用C++实现推箱子小游戏
    本篇内容主要讲解“如何用C++实现推箱子小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用C++实现推箱子小游戏”吧!前言推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,...
    99+
    2023-06-20
  • 用C语言实现推箱子游戏实例
    目录前言游戏效果图游戏开发思路游戏逻辑的分析源代码实现 头文件PushBackGame.c文件test.c文件总结前言 本游戏需要用到的核心技术,如下:二维数组分支语句 技...
    99+
    2024-04-02
  • Python怎么实现推箱子游戏
    小编给大家分享一下Python怎么实现推箱子游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.游戏规则推箱子游戏是一款可玩性极高的策略解谜手游,游戏中玩家将扮...
    99+
    2023-06-22
  • 怎么用C语言实现游戏项目推箱子效果
    本篇内容主要讲解“怎么用C语言实现游戏项目推箱子效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言实现游戏项目推箱子效果”吧!直接开始吧首先是我们用二维数组特定的数字描绘出这个地图i...
    99+
    2023-06-25
  • 如何使用C语言实现推箱子游戏
    这篇文章主要为大家展示了“如何使用C语言实现推箱子游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C语言实现推箱子游戏”这篇文章吧。1.前言推箱子是c语言的一个经典的项目2.游戏效果展...
    99+
    2023-06-29
  • 怎么用Immutable.js实现撤销重做功能
    这篇文章主要介绍了怎么用Immutable.js实现撤销重做功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Immutable.js实现撤销重做功能文章都会有所收获,下...
    99+
    2024-04-02
  • 怎么用Python代码实现微信消息撤回捕捉功能
    本篇内容介绍了“怎么用Python代码实现微信消息撤回捕捉功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1,模块介绍首先的话要实现消息撤...
    99+
    2023-06-16
  • 使用C/C++怎么制作一个推箱子小游戏
    使用C/C++怎么制作一个推箱子小游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。运行示例:以下为完整代码:#include <stdio.h>#inc...
    99+
    2023-06-15
  • 怎么使用Java+MySQL实现附近功能
    小编给大家分享一下怎么使用Java+MySQL实现附近功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在移动互联网广泛发展的今天,APP开发成为许多企业进入...
    99+
    2023-05-30
    java mysql
  • 怎么实现JavaScript沙箱的基础功能
    这篇文章主要介绍“怎么实现JavaScript沙箱的基础功能”,在日常操作中,相信很多人在怎么实现JavaScript沙箱的基础功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JavaScript沙...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作