用easyx做推箱子小游戏

发布于:2023-01-04 ⋅ 阅读:(443) ⋅ 点赞:(0)

学了一两个月C语言了,做完了黑窗口版本的推箱子,今天尝试用easyx图形库,收获很不错.其中还有很多可以改进的地方,希望大家能多多指导

 

 

 

 

推箱子游戏主要步骤

1.加载图片资源

 

2.绘制游戏地图

 

3.按键获取

 

 

4.游戏更新与判断是否过关

 

源码

#include <stdio.h>
#include <easyx.h>
#include <conio.h>
#include <stdbool.h>
#include <stdlib.h>

#define Bk 7
#define box 3
#define dest 2
#define wall 1
#define player 4
#define over 6
#define Okok 5 
#define Space 0 

IMAGE space;  //空地
IMAGE Box;  //箱子
IMAGE Dest; //目的地
IMAGE Player; //玩家
IMAGE Wall;   //墙
IMAGE Over;   //玩家进入目的地
IMAGE okok;   //箱子进入目的地
IMAGE bk;  //背景

void load();  //加载地图
void showmap();  //输出地图
void getkey();//获取按键
bool isok();   //判断游戏中是否还有箱子
void init();   //重置地图
int level=0;
//初始地图
int map[3][10][10] =
{
    {
       {7,7,7,7,7,7,7,7,7,7},
       {7,7,7,1,1,1,7,7,7,7},
       {7,7,7,1,2,1,7,7,7,7},
       {7,7,7,1,3,1,1,1,1,7},
       {7,1,1,1,0,0,3,2,1,7},
       {7,1,2,3,4,3,1,1,1,7},
       {7,1,1,1,1,0,1,7,7,7},
       {7,7,7,7,1,2,1,7,7,7},
       {7,7,7,7,1,1,1,7,7,7},
       {7,7,7,7,7,7,7,7,7,7}
       },
    {

        {7,7,7,7,7,7,7,7,7,7},
        {7,7,1,1,7,7,1,1,7,7},
        {7,1,2,0,1,1,0,2,1,7},
        {1,0,0,0,3,0,0,3,0,1},
        {1,0,3,0,4,0,0,0,0,1},
        {7,1,2,0,3,0,3,0,1,7},
        {7,7,1,0,0,0,2,1,7,7},
        {7,7,7,1,2,0,1,7,7,7},
        {7,7,7,7,1,1,7,7,7,7},
        {7,7,7,7,7,7,7,7,7,7}
     },
    {
        {7,7,7,7,7,7,7,7,7,7},
        {7,1,1,1,1,1,1,1,1,7},
        {7,1,2,0,0,0,3,2,1,7},
        {7,1,0,3,0,0,0,0,1,7},
        {7,1,0,0,0,4,0,0,1,7},
        {7,1,0,3,0,0,0,0,1,7},
        {7,1,0,0,0,0,0,3,1,7},
        {7,1,2,0,0,0,0,2,1,7},
        {7,1,1,1,1,1,1,1,1,7},
        {7,7,7,7,7,7,7,7,7,7}
    }
};
//预留一个地图,方便通关后重新继续游戏
int map1[3][10][10] =
{
    {
       {7,7,7,7,7,7,7,7,7,7},
       {7,7,7,1,1,1,7,7,7,7},
       {7,7,7,1,2,1,7,7,7,7},
       {7,7,7,1,3,1,1,1,1,7},
       {7,1,1,1,0,0,3,2,1,7},
       {7,1,2,3,4,3,1,1,1,7},
       {7,1,1,1,1,0,1,7,7,7},
       {7,7,7,7,1,2,1,7,7,7},
       {7,7,7,7,1,1,1,7,7,7},
       {7,7,7,7,7,7,7,7,7,7}
       },
    {

        {7,7,7,7,7,7,7,7,7,7},
        {7,7,1,1,7,7,1,1,7,7},
        {7,1,2,0,1,1,0,2,1,7},
        {1,0,0,0,3,0,0,3,0,1},
        {1,0,3,0,4,0,0,0,0,1},
        {7,1,2,0,3,0,3,0,1,7},
        {7,7,1,0,0,0,2,1,7,7},
        {7,7,7,1,2,0,1,7,7,7},
        {7,7,7,7,1,1,7,7,7,7},
        {7,7,7,7,7,7,7,7,7,7}
     },
    {
        {7,7,7,7,7,7,7,7,7,7},
        {7,1,1,1,1,1,1,1,1,7},
        {7,1,2,0,0,0,3,2,1,7},
        {7,1,0,3,0,0,0,0,1,7},
        {7,1,0,0,0,4,0,0,1,7},
        {7,1,0,3,0,0,0,0,1,7},
        {7,1,0,0,0,0,0,3,1,7},
        {7,1,2,0,0,0,0,2,1,7},
        {7,1,1,1,1,1,1,1,1,7},
        {7,7,7,7,7,7,7,7,7,7}
    }
};

int main()
{
        load();
        showmap();
        getkey();
    return 0;

}

//绘制游戏画面
void showmap()
{

    int x = -1, y = -1;
    
            for (int i = 0; i < 10; i++)
            {
                y = i * 60;
                for (int j = 0; j < 10; j++)
                {
                    x = j * 60;
                    switch (map[level][i][j])
                    {
                    case Bk:
                        putimage(x, y, &bk);
                        break;
                    case wall:
                        putimage(x, y, &Wall);
                        break;
                    case dest:
                        putimage(x, y, &Dest);
                        break;
                    case box:
                        putimage(x, y, &Box);
                        break;
                    case player:
                        putimage(x, y, &Player);
                        break;
                    case over:
                        putimage(x, y, &Over);
                        break;
                    case Okok:
                        putimage(x, y, &okok);
                        break;

                    case Space:
                        putimage(x, y, &space);
                        break;
                    }
                }
                printf("\n ");
            }
    
}
//加载图片资源
void load()
{

    initgraph(600,600);
    loadimage(&bk, "space.png", 60, 60);
    loadimage(&Box,"box.png", 60, 60);
    loadimage(&Dest, "dest.png", 60, 60);
    loadimage(&Player, "player.png", 60, 60);
    loadimage(&Over, "over.png", 60, 60);
    loadimage(&Wall, "wall.png", 60, 60);
    loadimage(&okok, "wallokok.png", 60, 60);
    loadimage(&space, "bk.png", 60, 60); 

}
//按键获取。。。。游戏更新
void getkey()
{
        
    while (true)
    {
        int c = 0, e = 0;
        for (int i = 0; i < 10; i++)
        {
            for (int k = 0; k < 10; k++)
            {
                if (map[level][i][k] == player)
                {
                    c = i;
                    e = k;

                }
            }
        }
        char userKey = _getch();

        switch (userKey)
        {
        case 72:
        case 'w':
        case 'W':
            if (map[level][c - 1][e] == Space||map[level][c-1][e]==dest)
            {
                map[level][c - 1][e] += player;
                map[level][c][e] -= player;
            }
            else if (map[level][c - 1][e]==box||map[level][c-1][e]==Okok)
            {
                if (map[level][c - 2][e] == Space || map[level][c - 2][e] == dest)
                {
                    map[level][c - 2][e] += box;
                    map[level][c - 1][e] -= box;
                    map[level][c - 1][e] += player;
                    map[level][c][e] -= player;
                }
            }
            break;
        case 80:
        case 'S':
        case 's':
            if (map[level][c + 1][e] == Space || map[level][c + 1][e] == dest)
            {
                map[level][c + 1][e] += player;
                map[level][c][e] -= player;
            }
            else if (map[level][c + 1][e] == box || map[level][c + 1][e] == Okok)
            {
                if (map[level][c + 2][e] == Space || map[level][c + 2][e] == dest)
                {
                    map[level][c + 2][e] += box;
                    map[level][c + 1][e] -= box;
                    map[level][c + 1][e] += player;
                    map[level][c][e] -= player;
                }
            }
            break;
        case 75:
        case 'a':
        case 'A':
            if (map[level][c][e-1] == Space || map[level][c][e-1] == dest)
            {
                map[level][c][e-1] += player;
                map[level][c][e] -= player;
            }
            else if (map[level][c][e-1] == box || map[level][c][e-1] == Okok)
            {
                if (map[level][c][e-2] == Space || map[level][c][e-2] == dest)
                {
                    map[level][c][e-2] += box;
                    map[level][c][e-1] -= box;
                    map[level][c][e-1] += player;
                    map[level][c][e] -= player;
                }
            }
            break;
        case 77:
        case 'd':
        case 'D':
            if (map[level][c][e + 1] == Space || map[level][c][e + 1] == dest)
            {
                map[level][c][e + 1] += player;
                map[level][c][e] -= player;
            }
            else if (map[level][c][e + 1] == box || map[level][c][e + 1] == Okok)
            {
                if (map[level][c][e + 2] == Space || map[level][c][e + 2] == dest)
                {
                    map[level][c][e + 2] += box;
                    map[level][c][e + 1] -= box;
                    map[level][c][e + 1] += player;
                    map[level][c][e] -= player;
                }
            }
            break;
        default:
            break;
        }
        system("cls");
        showmap();
        if (isok())
        {
            if (level > 2)
            {
                level = -1;
                init();
            }
            printf("恭喜你!过关了!\n");
            level++;

        }
    }
}
//判断是否过关
bool isok()
{
    
        for (int i = 0; i < 10; i++)
        {
            for (int k = 0; k < 10; k++)
            {
                if (map[level][i][k] == box)
                {
                    return false;
                }
            }
        }
    

    return true;
}
//重置地图
void init()
{
    for (int l = 0; l < 3; l++)
    {
        for (int i = 0; i < 10; i++)
        {
            for (int k = 0; k < 10; k++)
            {
                map[l][i][k] = map1[l][i][k];
            }
        }
    }
}

素材及源码链接:https://pan.baidu.com/s/1G-a4hAF_hsQuir795YLefg 
提取码:8888 
 


网站公告

今日签到

点亮在社区的每一天
去签到