C/C++项目实战-推箱子小游戏

这篇具有很好参考价值的文章主要介绍了C/C++项目实战-推箱子小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <graphics.h>
#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
using namespace std;

#define LINE 9 //行数
#define COLUMN 12 //列数
#define RATIO 61 //图片大小
#define START_X 64  //行偏移量
#define START_Y 60 //列偏移量
#define SCREEN_WIDTH 860 //屏幕的宽
#define SCREEN_HEIGHT 668 //屏幕的高
#define isValid(pos) pos.x>=0 && pos.x<LINE && pos.y>=0 && pos.y < COLUMN

//控制键 上下左右控制方向 按‘q’退出
#define KEY_UP 'W'
#define KEY_DOWN 'S'
#define KEY_LEFT 'A'
#define KEY_RIGHT 'D'
#define KEY_QUIT 'Q'

/*游戏地图*/
//墙: 0,地板: 1,箱子目的地: 2, 小人: 3, 箱子: 4, 箱子命中目标: 5
int map[LINE][COLUMN] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 },
{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
struct _POS {
    int x;            //小人所在二维数组的行
    int y;            //小人所在二维数组的列
};
enum _PROPS { //枚举常量 道具
    WALL,//
    FLOOR,//地板
    BOX_DES,//箱子目的地
    MAN,//
    BOX,//箱子
    HIT,//箱子命中目标
    ALL
};
enum _DIRECTION { //游戏方向控制
    UP,
    DOWN,
    LEFT,
    RIGHT
};
IMAGE images[ALL];
struct _POS man;
struct _POS box_des1;//临时的箱子目的地存放点
struct _POS box_des2;
void changeMap(struct _POS *man, enum _PROPS prop) {
    map[man->x][man->y] = prop;
    putimage(START_X + man->y * RATIO, START_Y + man->x * RATIO, &images[prop]);
}
/**********************************************
*实现游戏四个方向(上、下、左、右)的控制
* 输入:
* direct - 人前进方向
* 输出: 无
**********************************************/
void gameControl(enum _DIRECTION direct) {
    struct _POS next_pos = man;
    struct _POS next_next_pos = man;
    switch (direct)
    {
    case UP:
        next_pos.x--;
        next_next_pos.x -= 2;
        break;
    case DOWN:
        next_pos.x++;
        next_next_pos.x += 2;
        break;
    case LEFT:
        next_pos.y--;
        next_next_pos.y -= 2;
        break;
    case RIGHT:
        next_pos.y++;
        next_next_pos.y += 2;
        break;
    }
    if (isValid(next_pos) && map[next_pos.x][next_pos.y] == FLOOR) {//人的前方是地板
        if (map[man.x][man.y] == map[box_des1.x][box_des1.y] || map[man.x][man.y] == map[box_des2.x][box_des2.y]) { //如果人所在的位置是箱子目的地
            changeMap(&next_pos, MAN);
            changeMap(&man, BOX_DES);
            man = next_pos;
        }
        else {
            changeMap(&next_pos, MAN); //小人前进一格
            changeMap(&man, FLOOR);
            man = next_pos;
        }
    }
    else if (map[next_pos.x][next_pos.y] == BOX_DES) {//如果人的前方是箱子目的地
        box_des1.x = next_pos.x;
        box_des1.y = next_pos.y;
        changeMap(&next_pos, MAN);
        changeMap(&man, FLOOR);
        man = next_pos;
    }
    else if (map[next_pos.x][next_pos.y] == HIT) {//如果人的前方是HIT
        changeMap(&next_next_pos, BOX);
        changeMap(&next_pos, MAN); //小人前进一格
        changeMap(&man, FLOOR);
        man = next_pos;
        box_des2.x = next_pos.x;
        box_des2.y = next_pos.y;
    }
    else if (map[next_pos.x][next_pos.y] == BOX) {//人的前方是箱子
        //两种情况,箱子前面是地板或者是箱子目的地
        if (map[next_next_pos.x][next_next_pos.y] == FLOOR) {
            changeMap(&next_next_pos, BOX);
            changeMap(&next_pos, MAN); //小人前进一格
            changeMap(&man, FLOOR);
            man = next_pos;
        }
        else if (map[next_next_pos.x][next_next_pos.y] == BOX_DES) {
            
            changeMap(&next_next_pos, HIT);
            changeMap(&next_pos, MAN); //小人前进一格
            changeMap(&man, FLOOR);
            man = next_pos;
        }
    }
}
/**********************************************
* *游戏结束场景,在玩家通关后显示
*输入:
* bg - 背景图片变量的指针
*返回值: 无
**********************************************/
void gameOverScene(IMAGE* bg) {
    putimage(0, 0, bg);
    settextcolor(WHITE);
    RECT rec = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
    settextstyle(20, 0, _T("宋体"));
    drawtext(_T("恭喜您~ \n 您终于成为了一个合格的搬箱子老司机!"),
        &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
void isGameFailed(IMAGE* bg) {
    putimage(0, 0, bg);
    settextcolor(WHITE);
    RECT rec = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
    settextstyle(20, 0, _T("宋体"));
    drawtext(_T("GameOver!你这个小垃圾哈哈哈哈!"),
        &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
/**********************************************
*判断游戏是否结束,如果不存在任何一个箱子目的地,就代表游戏结束
*输入: 无
*返回值:
* true - 游戏结束 false - 游戏继续
**********************************************/
bool isGameOver() {
    for (int i = 0; i < LINE; i++) {
        for (int j = 0; j < COLUMN; j++) {
            if (map[i][j] == BOX_DES) return false;
        }
    }
    return true;
}
int main() {
    IMAGE bg_img; //背景图片
    int num = 0;//统计步数
    initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
    loadimage(&bg_img,_T("blackground.bmp"), SCREEN_WIDTH, SCREEN_HEIGHT,true);
    putimage(0, 0, &bg_img);

    //加载道具图标
    loadimage(&images[WALL], _T("wall_right.bmp"), RATIO, RATIO, true);
    loadimage(&images[FLOOR], _T("floor.bmp"), RATIO, RATIO, true);
    loadimage(&images[BOX_DES], _T("des.bmp"), RATIO, RATIO, true);
    loadimage(&images[MAN], _T("man.bmp"), RATIO, RATIO, true);
    loadimage(&images[BOX], _T("box.bmp"), RATIO, RATIO, true);
    loadimage(&images[HIT], _T("box.bmp"), RATIO, RATIO, true);

    for (int i = 0; i < LINE; i++) {
        for (int j = 0; j < COLUMN; j++) {
            if (map[i][j] == 3) {
                man.x = i;
                man.y = j;
            }
            putimage(START_X + j * RATIO, START_Y + i * RATIO,
                &images[map[i][j]]);
        }
    }
    //游戏开始环节
    bool isQuit = false;
    ExMessage msg;

    do {
        //if (_kbhit()) {//如果玩家点击键盘 //win11用不了此操作
        //    char ch = _getch();
        //    switch (ch)
        //    {
        //    case KEY_UP:
        //        gameControl(UP);
        //    case KEY_DOWN:
        //        gameControl(DOWN);
        //    case KEY_LEFT:
        //        gameControl(LEFT);
        //    case KEY_RIGHT:
        //        gameControl(RIGHT);
        //    case KEY_QUIT:
        //        isQuit = true;
        //    if (isGameOver()) {
        //        gameOverScene(&bg_img);
        //        isQuit = true;
        //    }
        //    }
        //    Sleep(100);
        //}

        //WM_LBUTTONDOWN 鼠标左键按下
        //WM_KEYDOWN 键盘按键按下 

        if (peekmessage(&msg) && msg.message == WM_KEYDOWN)
        {
            char ch = msg.vkcode;
            num++;
            switch (ch)
            {
            case KEY_UP:
                gameControl(UP);
                break;
            case KEY_DOWN:
                gameControl(DOWN);
                break;
            case KEY_LEFT:
                gameControl(LEFT);
                break;
            case KEY_RIGHT:
                gameControl(RIGHT);
                break;
            case KEY_QUIT:
                if (isGameOver()) {
                    gameOverScene(&bg_img);
                    isQuit = true;
                }
                break;
            }
            Sleep(100);
            if (num > 80) {
                isGameFailed(&bg_img);
                isQuit = true;
            }
            if (isGameOver()) {
                gameOverScene(&bg_img);
                isQuit = true;
            }
        }

    } while (!isQuit);

    system("pause");
    return 0;
}

C/C++项目实战-推箱子小游戏

C/C++项目实战-推箱子小游戏

C/C++项目实战-推箱子小游戏文章来源地址https://www.toymoban.com/news/detail-710473.html

到了这里,关于C/C++项目实战-推箱子小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python小游戏——推箱子代码开源

    ♥️ 作者:小刘在这里 ♥️ 每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️ 夕阳下,是最美的,绽放,愿所有的美好,再疫情结束后如约而至。 目录 一.效果呈现  二.主代码 三.cfg 四.README \\\'\\\'\\\'配置文件\\\'\\\'\\\' imp

    2024年02月02日
    浏览(30)
  • 【HTML小游戏】推箱子网页版(附完整源码)

    最近刚刚更新完了HTML,CSS的万字总结 ,有很多人已经学习完了文章,感觉反馈还不错,今天,用HTML,CSS,JS的知识编写了一个童年经典游戏 - 推箱子,供学习参考。 游戏主界面展示: 游戏界面展示: 经典的推箱子是一个非常古老游戏,甚至是80,90年代的回忆,目的是在训

    2024年02月04日
    浏览(37)
  • python毕设分享 python推箱子小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 推箱子小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月05日
    浏览(27)
  • 手把手教你使用Python实现推箱子小游戏(附完整源码)

    我们这个项目是一个基于Python实现的推箱子小游戏,名叫Sokoban: 这个游戏的目的是让玩家,也就是大写的 P ,推着箱子 # ,填充用小写的 o 标记的地面上的洞 该版本的Sokoban的规则如下: 游戏在矩形的二维网格上举行,其 原点(0,0) 位于左上方 网格上的每个单元格可以随时包

    2024年02月03日
    浏览(40)
  • 简单的推箱子游戏实战

    目录 项目分析  地图初始化 背景图片 游戏场景图片: 热键控制  按键设置 确定人物位置 实现人物移动(非箱子,目的地) 推箱子控制 游戏结束 最终代码 合法性判断: 墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5 但是一直执行循环块很占用CPU ,消耗很大很严重资源(使用

    2024年01月22日
    浏览(28)
  • 使用Python语言写一个推箱子游戏

    本游戏旨在提供一个趣味性的益智游戏,玩家需要通过推动箱子到指定位置来过关。 玩家需要推动一个或多个箱子到指定位置,才能过关。 箱子只能向前推,不能拉回来。 箱子不允许被推到障碍物、墙壁或其他箱子上。 玩家可以通过 UNDO 按钮来撤回上一步操作,最多可以撤

    2024年02月05日
    浏览(31)
  • Unity游戏源码分享-3d机器人推箱子游戏

    Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏    工程地址:https://download.csdn.net/download/Highning0007/88098014

    2024年02月15日
    浏览(37)
  • 怎样使用Pyglet库给推箱子游戏画关卡地图

    目录 pyglet库 画图事件 按键事件 程序扩展 关卡地图 是一个跨平台的Python多媒体库,提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染和音频播放的项目

    2024年02月22日
    浏览(28)
  • 毕业设计 单片机推箱子游戏(AT89C51)

    一、电路设计 此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。 LCD12864显示模块 带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置

    2024年02月21日
    浏览(43)
  • 【c语言】推箱子

    所需知识:c语言枚举,数组,for循环,while循环,switch,case语句,图形库相关函数 将printmap()在main中调用 为了让程序不会输入字符后退出,加上while循环 为了保证游戏的美观性,我们将对应的数字转化为好看的图案 使用两层循环遍历二维数组,在使用switch已经将对应的数字用

    2024年02月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包