精华内容
下载资源
问答
  • c语言小游戏推箱子

    2021-03-22 11:17:40
    c语言实现的小游戏 说明: @:代表小老鼠 $:代表箱子 O:代表终点 #:代表墙 代码展示: #include <stdio.h> #include <stdlib.h> #include <getch.h> int main(int argc,const char* argv[]) { char...

    **说明:

    **
    @:代表小老鼠
    $:代表箱子
    O:代表终点
    #:代表墙
    代码展示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <getch.h>
    
    int main(int argc,const char* argv[])
    {
    	char map[8][8] =
            {
                {0,0,3,3,3,3,0,0},
                {0,0,3,5,5,3,0,0},
                {0,3,3,0,5,3,3,0},
                {0,3,0,0,4,5,3,0},
                {3,3,0,4,0,0,3,3},
                {3,0,0,3,4,4,0,3},
                {3,0,0,2,0,0,0,3},
                {3,3,3,3,3,3,3,3}
            };
    	char m_x = 6, m_y = 3;
    	
    	for(;;)
    	{
    		system("clear");
    		int cnt = 0;
    		for(int i=0; i<8; i++)
    		{
    			for(int j=0; j<8; j++)
    			{
    				switch(map[i][j])
    				{
    					case 0:	printf("  ");	break;
    					case 2:	printf("@ ");	break;
    					case 3:	printf("# ");	break;
    					case 4:	printf("$ ");	break;
    					case 5:	printf("O ");	break;
    					case 7:	printf("@ ");	break;
    					case 9:	printf("$ ");cnt++;	break;
    				}
    			}
    			printf("\n");
    		}
    		//判断是否结束
    		if(4 == cnt)
    		{
    			printf("游戏胜利\n");
    			return 0;
    		}
    
    		switch(getch())
    		{
    			case 183:
    				//前方是路或者空目标
    				if(0 == map[m_x-1][m_y] || 5 == map[m_x-1][m_y])
    				{
    					map[m_x-1][m_y] += 2;
    					map[m_x][m_y] -= 2;
    					m_x--;
    				}
    				//前方是箱子
    				else if(4 == map[m_x-1][m_y] || 9 == map[m_x-1][m_y])
    				{
    					if(0 == map[m_x-2][m_y] || 5 == map[m_x-2][m_y])
    					{
    						map[m_x-2][m_y] += 4;
    						map[m_x-1][m_y] -= 2;
    						map[m_x][m_y] -= 2;
    						m_x--;
    					}
    				}
    				break;	
    			case 184:
    				//前方是路或者空目标
    				if(0 == map[m_x+1][m_y] || 5 == map[m_x+1][m_y])
    				{
    					map[m_x+1][m_y] += 2;
    					map[m_x][m_y] -= 2;
    					m_x++;
    				}
    				//前方是箱子
    				else if(4 == map[m_x+1][m_y] || 9 == map[m_x+1][m_y])
    				{
    					if(0 == map[m_x+2][m_y] || 5 == map[m_x+2][m_y])
    					{
    						map[m_x+2][m_y] += 4;
    						map[m_x+1][m_y] -= 2;
    						map[m_x][m_y] -= 2;
    						m_x++;
    					}
    				}
    				break;	
    			case 185:
    				//前方是路或者空目标
    				if(0 == map[m_x][m_y+1] || 5 == map[m_x][m_y+1])
    				{
    					map[m_x][m_y+1] += 2;
    					map[m_x][m_y] -= 2;
    					m_y++;
    				}
    				//前方是箱子
    				else if(4 == map[m_x][m_y+1] || 9 == map[m_x][m_y+1])
    				{
    					if(0 == map[m_x][m_y+2] || 5 == map[m_x][m_y+2])
    					{
    						map[m_x][m_y+2] += 4;
    						map[m_x][m_y+1] -= 2;
    						map[m_x][m_y] -= 2;
    						m_y++;
    					}
    				}
    				break;	
    			case 186:
    				//前方是路或者空目标
    				if(0 == map[m_x][m_y-1] || 5 == map[m_x][m_y-1])
    				{
    					map[m_x][m_y-1] += 2;
    					map[m_x][m_y] -= 2;
    					m_y--;
    				}
    				//前方是箱子
    				else if(4 == map[m_x][m_y-1] || 9 == map[m_x][m_y-1])
    				{
    					if(0 == map[m_x][m_y-2] || 5 == map[m_x][m_y-2])
    					{
    						map[m_x][m_y-2] += 4;
    						map[m_x][m_y-1] -= 2;
    						map[m_x][m_y] -= 2;
    						m_y--;
    					}
    				}
    				break;	
    		}
    	}
    }
    
    
    
    
    
    
    

    实现效果
    在这里插入图片描述

    展开全文
  • 之前发了测试版的代码,随后我自己发现了bug,然后删了文章,下午又研究了会最后做出了正式版,我也是学生,也在学习C语言,一起加油~(暂时地图制作只允许由坐标到大坐标)* 更新日志: LV2.0正式版 ~1、优化...

    前言:

    • 之前发了测试版的代码,随后我自己发现了bug,然后删了文章,下午又研究了会最后做出了正式版,我也是学生,也在学习C语言,一起加油~(暂时地图制作只允许由小坐标到大坐标)*

    更新日志:

    LV2.0正式版
    ~1、优化函数,兼容动态数组。
    ~2、修改回原始字符,因技术原因暂不得使用多字节字符。
    ~3、新增函数(go)(makemap)。
    ~4、新增地图编辑器,可保存地图。
    ~5、新增读取地图功能,制作的地图有用啦。
    ——BUG:
    ~1、暂无。

    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓代码↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    #include <stdio.h>
    #include <Windows.h>
    #include <string.h>
    
    using namespace std;
    
    //全部向下注释,也就是注释的是下面的代码
    //“*”是墙,“X”是终点,“@”是箱子,“O”是玩家.“.”是地板
    
    int  man_x = 0, man_y = 0, man_z = 0, man_x1 = 0, man_y1 = 0, x, y, dtszx, dtszy, dtszz = 1, mapnum = 1;
    char map[100][100][1] =
    {
    { {'*'}, {'*'}, {'*'}, {'*'}, {'*'}, {'*'} },
    { {'*'}, {'.'}, {'@'}, {'X'}, {'X'}, {'*'} },
    { {'*'}, {'.'}, {'*'}, {'*'}, {'.'}, {'*'} },
    { {'*'}, {'.'}, {'.'}, {'@'}, {'.'}, {'*'} },
    { {'*'}, {'O'}, {'*'}, {'.'}, {'.'}, {'*'} },
    { {'*'}, {'*'}, {'*'}, {'*'}, {'*'}, {'*'} },
    };
    char map1[100][100][1], map2[100][100][1], CharQ[1] = { '*' }, CharL[1] = { '.' }, CharXZ[1] = { '@' }, CharR[1] = { 'O' }, CharZD[1] = { 'X' };
    char*** dtsz;
    FILE* fpRead, * fpWrite;
    
    //声明函数,若先定义的函数用到了后定义的函数那么要声明后定义的函数,否则报错
    
    void load();
    void readmap();
    void sevemap();
    
    //写一个showmap函数来显示游戏地图,也就是输出数组
    
    //此函数为修改输出字符颜色:1蓝色,4红色,7白色(默认颜色),8灰色,10浅绿色,12粉红色,13紫色,14肉色
    
    void color(int x)
    {
        HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(h, x);
    }
    
    void showmap()
    {
        int i, j, k;
        system("cls");
    
        //按照行和列输出,我的x和y可能是相反的,知道概念就行
    
        for (i = 0;i < dtszy;i++)
        {
            for (j = 0;j < dtszx; j++)
                for (k = 0;k < dtszz;k++)
                {
                    printf("%2c", dtsz[i][j][k]);
                    if (dtsz[i][j][k] == NULL)
                        break;
                }
            printf("%2d", i);
            printf("\n");
        }
        for (i = 0;i < dtszx;i++)
        {
            if ((i + 2) % 2 == 0)
                color(1);
            else color(12);
            printf("%2d", i);
        }
        printf("\n");
        color(14);
        printf("2.0测试版\t请输入“w”“a”“s”“d”来操作方向,“h”为回退,只能回退一步,“r”为重新开始,输入“end”结束游戏\n");
        color(7);
    }
    
    //地图编辑器的输出地图函数
    
    void showmap2()
    {
        int i, j, k;
        system("cls");
        for (i = 0;i < dtszy;i++)
        {
            for (j = 0;j < dtszx;j++)
            {
                for (k = 0;k < dtszz;k++)
                    printf("%2c", dtsz[i][j][k]);
            }
            printf("%2d", i);
            printf("\n");
        }
        for (i = 0;i < dtszx;i++)
        {
            if ((i + 2) % 2 == 0)
                color(1);
            else color(12);
            printf("%2d", i);
        }
        printf("\n");
        color(7);
    }
    
    void copymap1()
    {
        for (int i = 0;i < dtszy;i++)
            for (int j = 0;j < dtszx; j++)
                for (int k = 0;k < dtszz; k++)
                    map1[i][j][k] = dtsz[i][j][k];
        man_x1 = man_x;
        man_y1 = man_y;
    }
    
    //左移函数,下面三个移动函数同理,判断人物移动方向的字符是什么,然后替换字符,调用加载终点函数和输出地图函数
    
    void left()//完成
    {
        for (int k = 0;k < dtszz;k++)
        {
            if (dtsz[man_y][man_x - 1][k] == CharL[k] || dtsz[man_y][man_x - 1][k] == CharZD[k])
            {
                copymap1();
                dtsz[man_y][man_x][k] = CharL[k];
                dtsz[man_y][man_x - 1][k] = CharR[k];
                man_x--;
                load();
                showmap();
            }
            else if (dtsz[man_y][man_x - 1][k] == CharXZ[k])
                if (dtsz[man_y][man_x - 2][k] == CharL[k] || dtsz[man_y][man_x - 2][k] == CharZD[k])
                {
                    copymap1();
                    dtsz[man_y][man_x - 2][k] = CharXZ[k];
                    dtsz[man_y][man_x - 1][k] = CharR[k];
                    dtsz[man_y][man_x][k] = CharL[k];
                    man_x--;
                    load();
                    showmap();
                }
                else
                    MessageBoxA(0, "推不动啦", "警告", MB_OK);
            else
                MessageBoxA(0, "走不动啦", "警告", MB_OK);
        }
    }
    
    void right()//完成
    {
        for (int k = 0;k < dtszz;k++)
        {
            if (dtsz[man_y][man_x + 1][k] == CharL[k] || dtsz[man_y][man_x + 1][k] == CharZD[k])
            {
                copymap1();
                dtsz[man_y][man_x][k] = CharL[k];
                dtsz[man_y][man_x + 1][k] = CharR[k];
                man_x++;
                load();
                showmap();
            }
            else if (dtsz[man_y][man_x + 1][k] == CharXZ[k])
                if (dtsz[man_y][man_x + 2][k] == CharL[k] || dtsz[man_y][man_x + 2][k] == CharZD[k])
                {
                    copymap1();
                    dtsz[man_y][man_x + 2][k] = CharXZ[k];
                    dtsz[man_y][man_x + 1][k] = CharR[k];
                    dtsz[man_y][man_x][k] = CharL[k];
                    man_x++;
                    load();
                    showmap();
                }
                else
                    MessageBoxA(0, "推不动啦", "警告", MB_OK);
            else
                MessageBoxA(0, "走不动啦", "警告", MB_OK);
        }
    }
    
    void up()//完成
    {
        for (int k = 0;k < dtszz;k++)
        {
            if (dtsz[man_y - 1][man_x][k] == CharL[k] || dtsz[man_y - 1][man_x][k] == CharZD[k])
            {
                copymap1();
                dtsz[man_y][man_x][k] = CharL[k];
                dtsz[man_y - 1][man_x][k] = CharR[k];
                man_y--;
                load();
                showmap();
            }
            else if (dtsz[man_y - 1][man_x][k] == CharXZ[k])
                if (dtsz[man_y - 2][man_x][k] == CharL[k] || dtsz[man_y - 2][man_x][k] == CharZD[k])
                {
                    copymap1();
                    dtsz[man_y - 2][man_x][k] = CharXZ[k];
                    dtsz[man_y - 1][man_x][k] = CharR[k];
                    dtsz[man_y][man_x][k] = CharL[k];
                    man_y--;
                    load();
                    showmap();
                }
                else
                    MessageBoxA(0, "推不动啦", "警告", MB_OK);
            else
                MessageBoxA(0, "走不动啦", "警告", MB_OK);
        }
    }
    
    void down()//完成
    {
        for (int k = 0;k < dtszz;k++)
        {
            if (dtsz[man_y + 1][man_x][k] == CharL[k] || dtsz[man_y + 1][man_x][k] == CharZD[k])
            {
                copymap1();
                dtsz[man_y][man_x][k] = CharL[k];
                dtsz[man_y + 1][man_x][k] = CharR[k];
                man_y++;
                load();
                showmap();
            }
            else if (dtsz[man_y + 1][man_x][k] == CharXZ[k])
                if (dtsz[man_y + 2][man_x][k] == CharL[k] || dtsz[man_y + 2][man_x][k] == CharZD[k])
                {
                    copymap1();
                    dtsz[man_y + 2][man_x][k] = CharXZ[k];
                    dtsz[man_y + 1][man_x][k] = CharR[k];
                    dtsz[man_y][man_x][k] = CharL[k];
                    man_y++;
                    load();
                    showmap();
                }
                else
                    MessageBoxA(0, "推不动啦", "警告", MB_OK);
            else
                MessageBoxA(0, "走不动啦", "警告", MB_OK);
        }
    }
    
    //回退函数,返回上一个操作符,就是用一个备用数组保存操作前的地图,然后回退时赋值回去
    
    void ht()
    {
        for (int i = 0;i < dtszy;i++)
            for (int j = 0;j < dtszx; j++)
                for (int k = 0;k < dtszz; k++)
                    dtsz[i][j][k] = map1[i][j][k];
    
        man_y = man_y1;
        man_x = man_x1;
        showmap();
    }
    
    //重新开始函数,原理与回退一致
    
    void ag()
    {
        for (int i = 0;i < dtszy;i++)
            for (int j = 0;j < dtszx; j++)
                for (int k = 0;k < dtszz; k++)
                {
                    dtsz[i][j][k] = map2[i][j][k];
                    if (map2[i][j][0] == NULL)
                        break;
                }
    
        man_y = y;
        man_x = x;
        showmap();
    }
    
    //加载终点函数,时刻与最初的地图做对比,如果原本终点的位置被玩家占有后变成空地那么该地点就还原为终点
    
    void load()
    {
        int i, j, k;
        for (i = 0;i < dtszy;i++)
            for (j = 0;j < dtszx;j++)
                for (k = 0;k < dtszz;k++)
                    if (map2[i][j][0] == 'X')
                        if (dtsz[i][j][k] != map2[i][j][k] && dtsz[i][j][k] == '.')
                            dtsz[i][j][k] = map2[i][j][k];
    }
    
    //制作地图函数
    
    void makemap()
    {
        int i, j, k, mkmapx1, mkmapy1, mkmapx2, mkmapy2, xz = NULL, mannum = 0, xznum = 0, zdnum = 0;
        char fx = '1';
        dtszx = 200;
        dtszy = 200;
        while (dtszx > 60 || dtszy > 45 || dtszx < 6 || dtszy < 6)
        {
            system("cls");
            printf("输入地图大小:列数和行数min:6*6 max:60*45\n");
            scanf_s("%d %d", &dtszx, &dtszy);
        }
    
        //调用windows头文件执行代码,创建窗口
    
        MessageBoxA(0, "现在将窗口调至最大", "友情提示", MB_OK);
    
        //动态数组创建,开辟空间
    
        dtsz = new char** [dtszy];
        for (int i = 0; i < dtszy; ++i)
        {
            dtsz[i] = new char* [dtszx];
            for (int j = 0; j < dtszx; ++j)
            {
                dtsz[i][j] = new char[1];
            }
        }
        for (i = 0;i < dtszy;i++)
            for (j = 0;j < dtszx;j++)
                for (k = 0;k < dtszz;k++)
                {
                    dtsz[i][j][k] = CharL[k];
                    if (i == 0 || j == 0 || i == dtszy - 1 || j == dtszx - 1)
                    {
                        dtsz[i][j][k] = CharQ[k];
                    }
                }
    
        //以下是在地图编辑器中的操作
    
        while (xz != 8)
        {
            system("cls");
            showmap2();
            printf("输入坐标加数字改变位置或区域属性,如:修改坐标(10,10)到(11,11)的值为墙则输入“");
            color(4);
            printf("10.10 11.11 1");
            color(7);
            printf("”人物只能由第一个坐标决定位置\n1、墙“*”。2、路“.”。3、玩家“O”。4、箱子“@”。5、箱子终点“X”。6、保存(");
            color(4);
            printf("仅可保存一张图");
            color(7);
            printf(")。7、游玩。8、退出。(即使退出也需填写坐标)\n");
            scanf_s("%d.%d %d.%d %d", &mkmapx1, &mkmapy1, &mkmapx2, &mkmapy2, &xz);
            switch (xz)
            {
            case 1:
            {
                for (i = mkmapy1;i <= mkmapy2;i++)
                    for (j = mkmapx1;j <= mkmapx2;j++)
                        for (k = 0;k < dtszz;k++)
                            dtsz[i][j][k] = CharQ[k];break;
            }
            case 2:
            {
                for (i = mkmapy1;i <= mkmapy2;i++)
                    for (j = mkmapx1;j <= mkmapx2;j++)
                        for (k = 0;k < dtszz;k++)
                            dtsz[i][j][k] = CharL[k];break;
            }
            case 3:
            {
                if (mannum < 1)
                {
                    for (i = mkmapy1;i <= mkmapy1;i++)
                        for (j = mkmapx1;j <= mkmapx1;j++)
                            for (k = 0;k < dtszz;k++)
                                dtsz[i][j][k] = CharR[k];
                }
                else MessageBoxA(0, "已经存在一个人物", "警告", MB_OK);break;
            }
            case 4:
            {
                for (i = mkmapy1;i <= mkmapy2;i++)
                    for (j = mkmapx1;j <= mkmapx2;j++)
                        for (k = 0;k < dtszz;k++)
                            dtsz[i][j][k] = CharXZ[k];break;
            }
            case 5:
            {
                for (i = mkmapy1;i <= mkmapy2;i++)
                    for (j = mkmapx1;j <= mkmapx2;j++)
                        for (k = 0;k < dtszz;k++)
                            dtsz[i][j][k] = CharZD[k];break;
            }
            case 6://保存,对文件的操作
            {
                if (xznum != zdnum)
                {
                    MessageBoxA(0, "箱子数量不等于终点数量", "警告", MB_OK);
                    xz = 0;
                }
                else if (mannum == 0)
                {
                    MessageBoxA(0, "缺少玩家", "警告", MB_OK);
                    xz = 0;
                }
                else if (xznum < 1 || zdnum < 1)
                {
                    MessageBoxA(0, "缺少箱子或者终点", "警告", MB_OK);
                    xz = 0;
                }
                else
                {
                    sevemap();
                    xz = 0;break;
                }
            }
            case 7://结束前判断
            {
                if (xznum != zdnum)
                {
                    MessageBoxA(0, "箱子数量不等于终点数量", "警告", MB_OK);
                    xz = 0;
                }
                else xz = 8;break;
            }
            case 8:
            {
                if (xznum != zdnum)
                {
                    MessageBoxA(0, "箱子数量不等于终点数量", "警告", MB_OK);
                    xz = 0;
                }
                else if (mannum == 0)
                {
                    MessageBoxA(0, "缺少玩家", "警告", MB_OK);
                    xz = 0;
                }
                else if (xznum < 1 || zdnum < 1)
                {
                    MessageBoxA(0, "缺少箱子或者终点", "警告", MB_OK);
                    xz = 0;
                }
                else xz = 8;
                break;
            }
            }
            mannum = zdnum = xznum = 0;
            for (i = 0;i < dtszy;i++)
                for (j = 0;j < dtszx;j++)
                    for (k = 0;k < dtszz;k++)
                    {
                        if (dtsz[i][j][k] == CharR[k])
                            mannum++;
                        if (dtsz[i][j][k] == CharXZ[k])
                            xznum++;
                        if (dtsz[i][j][k] == CharZD[k])
                            zdnum++;
                    }
        }
        MessageBoxA(0, "点击确定游戏", "开始游戏", MB_OK);
    }
    
    //正常开始游戏的函数
    
    void go()
    {
        int i, j, k;
        dtszx = 6;
        dtszy = 6;
        dtsz = new char** [dtszy];
        for (int i = 0; i < dtszy; ++i)
        {
            dtsz[i] = new char* [dtszx];
            for (int j = 0; j < dtszx; ++j)
                dtsz[i][j] = new char[1];
        }
    
        for (i = 0;i < dtszy;i++)
            for (j = 0;j < dtszx;j++)
                for (k = 0;k < dtszz;k++)
                {
                    if (map[i][j][k] == NULL)
                        break;
                    dtsz[i][j][k] = map[i][j][k];
                }
    }
    
    void choice()
    {
        int choice;
        color(4);
        printf("请选择:\n\t");
        color(14);
        printf("1、开始游戏。\n\t2、地图编辑器。\n\t3、读取地图\n\t");
        color(7);
        scanf_s("%d", &choice);
        switch (choice)
        {
        case 1:go();break;
        case 2:makemap();break;
        case 3:readmap();break;
        }
    }
    
    void readmap()
    {
        int i, j, k;
        char b[1];
    
        fopen_s(&fpRead, "map.txt", "r");
    
        for (i = 0;b[0] != '$';i++)
            fscanf_s(fpRead, "%c", &b[0], 10);
        fscanf_s(fpRead, "%d\t%d\n", &dtszy, &dtszx);
    
        dtsz = new char** [dtszy];
        for (int i = 0; i < dtszy; ++i)
        {
            dtsz[i] = new char* [dtszx];
            for (int j = 0; j < dtszx; ++j)
                dtsz[i][j] = new char[dtszz];
        }
    
        for (i = 0;i < dtszy;i++)
        {
            for (j = 0;j < dtszx;j++)
                for (k = 0;k < dtszz;k++)
                    fscanf_s(fpRead, "%c", &dtsz[i][j][k], 10);
            fscanf_s(fpRead, "%c", &b[0], 10);//这里,读取换行符
        }
        fclose(fpRead);
    }
    
    void sevemap()
    {
        int i, j, k;
        fopen_s(&fpWrite, "map.txt", "w");
        fprintf(fpWrite, "$\t%d\t%d\n", dtszy, dtszx);
        for (i = 0;i < dtszy;i++)
        {
            for (j = 0;j < dtszx;j++)
                for (k = 0;k < dtszz;k++)
                    fprintf(fpWrite, "%c", dtsz[i][j][k]);
            fprintf(fpWrite, "\n");
        }
        fprintf(fpWrite, "\n");
        fclose(fpWrite);
        MessageBoxA(0, "已经保存", "警告", MB_OK);
    }
    
    int main()
    {
        int i = 0, j = 0, k = 0, end = 0, zdx = 0, zdy = 0, zdnum = 0, zdnum2;
        char fx, bj1[1] = { '0' };
        system("mode con cols=150 lines=49");
    
        choice();
        MessageBoxA(0, "点击确定游戏", "开始游戏", MB_OK);
        showmap();
    
        for (i = 0;i < dtszy;i++)
            for (j = 0;j < dtszx; j++)
                for (k = 0;k < dtszz; k++)
                    map2[i][j][k] = dtsz[i][j][k];
    
        for (i = 0;i < dtszy;i++)
            for (j = 0;j < dtszx; j++)
                for (k = 0;k < dtszz; k++)
                    if (dtsz[i][j][k] == CharR[k])
                    {
                        man_y = i;
                        y = i;
                        man_x = j;
                        x = j;
                        map2[i][j][k] = dtsz[i][j][k];
                    }
    
        for (i = 0;i < dtszy;i++)
            for (j = 0;j < dtszx;j++)
                for (k = 0;k < dtszz;k++)
                {
                    if (dtsz[i][j][k] == CharZD[k])
                    {
                        zdnum++;
                        zdnum2 = zdnum;
                    }
                }
    
        while (zdnum != 0)
        {
            scanf_s("%c", &fx, 2);
    
            if (fx == 'w' && end == 0)
                up();
            if (fx == 's' && end == 0)
                down();
            if (fx == 'a' && end == 0)
                left();
            if (fx == 'd' && end == 0)
                right();
            if (fx == 'h' && end == 0)
                ht();
            if (fx == 'r' && end == 0)
                ag();
            if (fx == 'e')
            {
                end = 1;
                showmap();
            }
            if (fx == 'n' && end == 1)
            {
                end = 2;
                showmap();
            }
            if (fx == 'd' && end == 2)
                break;
            load();
            zdnum = zdnum2;
            for (i = 0;i < 100;i++)
                for (j = 0;j < 100;j++)
                    for (k = 0;k < dtszz;k++)
                        if (map2[i][j][k] == 'X')
                            if (dtsz[i][j][k] == '@')
                                zdnum--;
        }
        if (zdnum == 0)
            MessageBoxA(0, "胜利!!", "", MB_OK);
        else MessageBoxA(0, "游戏结束", "", MB_OK);
    
        delete[]dtsz;
    }
    
    

    ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑代码↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    在这里插入图片描述
    还会继续更新!有bug记得反馈哦~
    度盘:
    链接:https://pan.baidu.com/s/1xTPZ0udYOZLm9VNQMIDffg
    提取码:2ufq
    如果不允许贴连接我就认了,也是方便大家~

    展开全文
  • QQ20150709-1 一、创建游戏地图1 2 3 4 5 6 7 8 9 10 11 12 13 14 15define ROWS 11define COLS 12char map[ROWS][COLS] = { “###########”, “# #”, “#O #”, “# X# # @#

    技术交流QQ:3123905931
    一、创建游戏地图

    define ROWS 11

    define COLS 12

    char map[ROWS][COLS] = {
    “###########”,
    “# #”,
    “#O #”,
    “# X# # @#”,
    “# # # #”,
    “# # # #”,
    “# # # #”,
    “# #”,
    “# #”,
    “###########”
    };
    因为推箱子游戏地图是由多个格子组成的,所以我们可以使用二维字符数组或字符串数组创建地图。我们可以改变数组中的元素来对游戏功能进行实现。例如:小人移动方向无障碍物,就是小人原来位置的数组元素设置为路,移动后的元素设置为小人。这样就实现了小人移动功能,箱子也是同理。

    二、初始化位置和游戏开关
    //游戏开关
    int flag = 1;

    //人的坐标
    int renRows = 2;
    int renCols = 1;

    //箱子的坐标
    int xiangRows = 3;
    int xiangCols = 2;
    因为整个游戏操作都是放在循环里的,所以我们先定义一个全局开关,然后用while(开关)来控制游戏的结束。并且在判断用户输入方向前,我们需要先确定小人和箱子的初始位置,再根据用户输入进行判断。

    三、接收用户输入方向
    printf(“W.前 S.后 A.左 D.右 Q.退出\n”);
    char enterInput = ‘a’;
    rewind(stdin);
    //接收键盘方向
    scanf(“%c”,&enterInput);
    接收用户从键盘输入的字符,由于方向4个,加上退出功能就5个分支。所以我们使用switch case结构来实现判断用户输入字符,并执行一些操作。

    四、判断用户输入方向

        //初始化人和箱子的下一个坐标
        int nextRows = 0,nextCols = 0,nextXiangRows = 0,nextXiangCols = 0;
    
        //判断方向并操作
        switch (enterInput) {
            case 'w':
            case 'W':{
                nextRows = renRows - 1;
                nextCols = renCols;
                nextXiangRows = xiangRows - 1;
                nextXiangCols = xiangCols;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case 's':
            case 'S':{
                nextRows = renRows + 1;
                nextCols = renCols;
                nextXiangRows = xiangRows + 1;
                nextXiangCols = xiangCols;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case 'a':
            case 'A':{
                nextRows = renRows;
                nextCols = renCols - 1;
                nextXiangRows = xiangRows;
                nextXiangCols = xiangCols - 1;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case 'd':
            case 'D':{
                nextRows = renRows;
                nextCols = renCols + 1;
                nextXiangRows = xiangRows;
                nextXiangCols = xiangCols + 1;
                //调用移动函数
                moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
            }
                break;
            case 'q':
            case 'Q':
                //如果输入Q则关闭游戏
                flag = 0;
                break;
            default:
                printf("输入错误\n");
                break;
        }
    

    人下一个位置的行下标 nextRows

    人下一个位置的列下标 nextCols

    箱子下一个位置的行下标 nextXiangRows

    箱子下一个位置的列下标 nextXiangCols

    这里说的下一个位置就好比,我输入w后向上移动了一个位置,这个新的位置我称他为下一个位置。

    如果向上移动,人和箱子的行下标-1,列下标不变。

    如果向下移动,人和箱子的行下标+1,列下标不变。

    如果向左移动,人和箱子的行下标不变,列下标-1。

    如果向右移动,人和箱子的行下标不变,列下标+1。

    我这里是先根据方向判断出人和箱子位置会发生的移动变化,并使用局部变量临时存储,所以不用担心人没有顶着箱子的时候,箱子也会跟着移动的问题。因为最终移动后的新位置坐标还是由全局变量来存储的,我只是根据用户输入方向计算出人和箱子下一个位置的新坐标,然后再根据实际情况(实际情况就是人前进方向是否是障碍物,还是箱子来确定的。如果是障碍物,就只有人移动,并只有人刷新位置。如果是箱子,则判断箱子下一个位置是否是障碍物,来刷新人和箱子的新位置)赋值给全局变量。

    五、移动控制实现
    void moveRen(int nextRows, int nextCols,int nextXiangRows,int nextXiangCols){
    if (map[nextRows][nextCols] == ’ ‘) {
    //如果人下一个位置是路
    map[nextRows][nextCols] = ‘O’;//下一个位置设置为人
    map[renRows][renCols] = ’ ‘;//人原来的位置设置为路

        //刷新人的位置
        renRows = nextRows;
        renCols = nextCols;
    }else if (map[nextRows][nextCols] == 'X' && map[nextXiangRows][nextXiangCols] != '#' && map[nextXiangRows][nextXiangCols] != '@'){
        //如果人下一个位置是箱子,并且箱子下一个位置不是墙也不是关卡
        map[nextRows][nextCols] = 'O';//下一个位置设置为人
        map[renRows][renCols] = ' ';//人原来的位置设置为路
        map[nextXiangRows][nextXiangCols] = 'X';//箱子下一个位置设置为箱子
    
        //刷新人和箱子的位置
        renRows = nextRows;
        renCols = nextCols;
        xiangRows = nextXiangRows;
        xiangCols = nextXiangCols;
    }else if (map[nextXiangRows][nextXiangCols] == '@'){
        //如果箱子下一个位置是关卡,就过关
        printf("您已经过关!\n");
        flag = 0;
    }
    

    }

    接下来是推箱子的源代码

    #include <stdio.h>
    #include <stdlib.h>
    #define ROWS 11
    #define COLS 12
    
    char map[ROWS][COLS] = {
        "###########",
        "#         #",
        "#O        #",
        "# X#  #  @#",
        "#  #  #   #",
        "#  #  #   #",
        "#  #  #   #",
        "#         #",
        "#         #",
        "###########"
    };
    
    //游戏开关
    int flag = 1;
    
    //人的坐标
    int renRows = 2;
    int renCols = 1;
    
    //箱子的坐标
    int xiangRows = 3;
    int xiangCols = 2;
    
    //移动小人
    void moveRen(int nextRows, int nextCols,int nextXiangRows,int nextXiangCols);
    
    int main(int argc, const char * argv[]) {
    
        while (flag) {
            system("clear");
            //刷新地图
            for (int i = 0; i < ROWS; i++) {
                printf("%s\n",map[i]);
            }
    
            printf("W.前  S.后  A.左  D.右  Q.退出\n");
            char enterInput = 'a';
            rewind(stdin);
            //接收键盘方向
            scanf("%c",&enterInput);
    
            //初始化人和箱子的下一个坐标
            int nextRows = 0,nextCols = 0,nextXiangRows = 0,nextXiangCols = 0;
    
            //判断方向并操作
            switch (enterInput) {
                case 'w':
                case 'W':{
                    nextRows = renRows - 1;
                    nextCols = renCols;
                    nextXiangRows = xiangRows - 1;
                    nextXiangCols = xiangCols;
                    //调用移动函数
                    moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
                }
                    break;
                case 's':
                case 'S':{
                    nextRows = renRows + 1;
                    nextCols = renCols;
                    nextXiangRows = xiangRows + 1;
                    nextXiangCols = xiangCols;
                    //调用移动函数
                    moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
                }
                    break;
                case 'a':
                case 'A':{
                    nextRows = renRows;
                    nextCols = renCols - 1;
                    nextXiangRows = xiangRows;
                    nextXiangCols = xiangCols - 1;
                    //调用移动函数
                    moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
                }
                    break;
                case 'd':
                case 'D':{
                    nextRows = renRows;
                    nextCols = renCols + 1;
                    nextXiangRows = xiangRows;
                    nextXiangCols = xiangCols + 1;
                    //调用移动函数
                    moveRen(nextRows,nextCols,nextXiangRows,nextXiangCols);
                }
                    break;
                case 'q':
                case 'Q':
                    //如果输入Q则关闭游戏
                    flag = 0;
                    break;
                default:
                    printf("输入错误\n");
                    break;
            }
        }
        return 0;
    }
    
    //移动小人
    void moveRen(int nextRows, int nextCols,int nextXiangRows,int nextXiangCols){
        if (map[nextRows][nextCols] == ' ') {
            //如果人下一个位置是路
            map[nextRows][nextCols] = 'O';//下一个位置设置为人
            map[renRows][renCols] = ' ';//人原来的位置设置为路
    
            //刷新人的位置
            renRows = nextRows;
            renCols = nextCols;
        }else if (map[nextRows][nextCols] == 'X' && map[nextXiangRows][nextXiangCols] != '#' && map[nextXiangRows][nextXiangCols] != '@'){
            //如果人下一个位置是箱子,并且箱子下一个位置不是墙也不是关卡
            map[nextRows][nextCols] = 'O';//下一个位置设置为人
            map[renRows][renCols] = ' ';//人原来的位置设置为路
            map[nextXiangRows][nextXiangCols] = 'X';//箱子下一个位置设置为箱子
    
            //刷新人和箱子的位置
            renRows = nextRows;
            renCols = nextCols;
            xiangRows = nextXiangRows;
            xiangCols = nextXiangCols;
        }else if (map[nextXiangRows][nextXiangCols] == '@'){
            //如果箱子下一个位置是关卡,就过关
            printf("您已经过关by  bruceyou 2015 9 18!\n");
            flag = 0;
        }
    }
    展开全文
  • C语言实现推箱子游戏

    万次阅读 多人点赞 2019-09-28 22:57:23
    很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~ 一、介绍 开发语言:C语言 开发工具:Dev-C++ 5.11 日期:2019年9月28日 作者:...

    很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~

    一、介绍

    开发语言:C语言
    开发工具:Dev-C++ 5.11
    日期:2019年9月28日
    作者:ZackSock
    

    也不说太多多余的话了,先看一下效果图:
    在这里插入图片描述
    游戏中的人物、箱子、墙壁、球都是字符构成的。通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。

    二、代码实现

    关于代码方面,我尽可能讲的细致。希望大家可以理解~

    (1)方法列表

    //主函数
    void main();
    
    //初始化一些数据
    initData();
    
    //在控制台上打印地图
    drawMap();
    
    //向上移动
    moveUp();
    
    //向左移动
    moveLeft()
    
    //向下移动
    moveDown()
    
    //向右移动
    moveRight();
    

    这几个方法都顾名思义,而且用意也非常明确,就initData可能不知道具体用处,但是没有什么大问题。唯一的问题就是,上左下右的顺序可能会逼死几个强迫症患者,哈哈。

    (2)参数列表

    为了方便,我把include和宏定义也放到参数列表当中

    //导入函数库
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    //宏定义
    #define WIDTH 8
    #define HEIGHT 8
    
    //定义地图数组,二维数组有两个维度,而地图也是二维的矩形
    int map[HEIGHT][WIDTH] = {
    	{0, 0, 1, 1, 1, 0, 0, 0},
    	{0, 0, 1, 4, 1, 0, 0, 0},
    	{0, 0, 1, 0, 1, 1, 1, 1},
    	{1, 1, 1, 3, 0, 3, 4, 1},
    	{1, 4, 0, 3, 2, 1, 1, 1},
    	{1, 1, 1, 1, 3, 1, 0, 0},
    	{0, 0, 0, 1, 4, 1, 0, 0},
    	{0, 0, 0, 1, 1, 1, 0, 0} 
    };
    
    //人的位置,在二维地图中,我们可以用坐标表示一个人的位置,就好比经纬度
    int x, y;
    
    //箱子的个数,推箱子肯定要有箱子嘛。
    int boxs;
    

    这里参数不多,其中横为x,纵为y,另外这里再规定一下map的一些东西:

    /**
    *	0	表示空
    *	1	表示墙
    *	2	表示人
    *	3	表示箱子
    *	4	表示目的地(球)
    *	5	表示已完成的箱子
    */
    

    (3)函数具体分析

    接下来我们一个一个函数来分析。

    1、main函数
    int main(int argc, char *argv[]) {
    	char direction;		//存储键盘按的方向 
    	initData();			//初始化一些数据
    	
    	//开始游戏的循环,这里是个死循环,每按一次按钮循环一次
    	while(1){
    		//每次循环的开始清除屏幕
    		system("cls");
    		//绘画地图
    		drawMap();
    
    		//判断,当boxs的数量0时,!0为真,然后走break跳出循环(结束游戏) 
    		if(!boxs){
    			break;
    		}
    		
    		//键盘输入方向,这里使用getch,因为getch读取字符不会显示在屏幕上
    		direction = getch();
    		
    		//用switch判断用户输入的方向
    		switch(direction){
    			case 'w':
    				//按w时,调用向上移动函数
    				moveUp();
    				break;
    			case 'a':
    				//按a时,调用向左移动函数
    				moveLeft(); 
    				break;
    			case 's':
    				moveDown();
    				break;
    			case 'd':
    				moveRight();
    				break; 
    		}
    	}  
    	//当跳出循环时,运行该语句,游戏结束
    	printf("恭喜你完成游戏!※");
    	return 0;
    }
    

    我大概说一下流程,循环外面没有什么特别的。initData()只是一些简单数据的初始化,不需要太在意。循环中大致流程如下:

    • 清除屏幕
    • 绘制地图
    • 判断游戏是否结束
    • 对用户按下的按钮进行反馈

    进入循环体,先清除屏幕,再绘制地图,然后再判断游戏是否结束。可能大家对这个顺序不是很理解,这里我们先不考虑判断游戏结束的问题。我们把清屏和绘制地图合在一起,简称“重绘地图”,而游戏结束的判断先不考虑,那么流程就简化为“重绘地图 + 响应用户的操作”。简单来说就是,用户按一下按钮,我改变一下地图。

    2、initData()

    void initData(){
    	int i, j;
    	
    	//加载数据时让用户等待,一般情况加载数据比较快
    	printf("游戏加载中,请稍后........."); 
    	
    	//遍历地图中的数据
    	for(i = 0; i < HEIGHT; i++){
    		for(j = 0; j < WIDTH; j++){
    			//遍历到2(人)时,记录人的坐标。x, y是前面定义的全局变量
    			if(map[i][j] == 2){
    				x = j;
    				y = i;
    			} 
    			//遍历到3时,箱子的数目增加。boxs是前面定义的全局变量 
    			if(map[i][j] == 3){
    				boxs++;
    			}
    		}
    	} 
    }
    

    这个方法很简单,就是遍历地图,然后初始化人的位置和箱子的个数。这里有一点要注意一下,就是到底内层循环是WIDTH还是外层循环是WIDTH。在这里插入图片描述
    如图,在遍历过程中。外层循环控制行数,即HEIGHT。那么内层循环应该是WIDTH。

    3、drawMap()

    void drawMap(){
    	int i, j;
    	for(i = 0; i < WIDTH; i++){
    		for(j = 0; j < HEIGHT; j++){
    			switch(map[i][j]){
    				case 0:
    					printf("  ");
    					break;
    				case 1:
    					printf("■");
    					break;
    				case 2:
    					printf("♀");
    					break;
    				case 3:
    					printf("◆");
    					break;
    				case 4:
    					printf("●");
    					break;
    				case 5:
    					printf("★");
    					break; 
    			}
    		}
    		printf("\n");
    	}
    }
    

    这里也非常简单,变量map中的元素,然后通过switch判断应该输出的内容。然后内层循环每走完一次就换行。

    4、moveUp()

    这个函数内容有点多,想讲一下大概思路:

    向上移有两种情况
    1、前面为空白
    	这种情况有两个步骤
    	(1)将人当前的位置设置为空白(0),
    	(2)再讲人前面的位置设置为人(22、前面为箱子
    	当前面为箱子时有三种情况
    	1、箱子前面为空白
    		移动人和箱子,这个操作有三个步骤
    		(1)将人当前位置设置为空(0)
    		(2)将箱子位置设置为人(2)
    		(3)将箱子前面设置为箱子(32、箱子前面为墙
    		这种情况不需要做任何操作
    	3、箱子前面为终点
    		这种情况有四个个步骤
    		(1)将人的位置设置为空(0)
    		(2)将箱子的位置设置为人(2)
    		(3)将终点位置设置为★(5)
    		(4)箱子boxs的数量减一
    3、前面为墙
    	这种情况最简单,不需要做任何操作
    4、前面为终点
    	我这里没有考虑太多,这种情况不做操作。(如果更换地图的话可能需要修改代码)
    

    具体代码如下,解析我全写在注释里面:

    void moveUp(){
    	//定义变量存放人物上方的坐标
    	int ux, uy; 
    	
    	//当上方没有元素时,直接return	(其实人不可能在边缘)
    	if(y == 0){
    		return;
    	}
    	
    	//记录上方坐标,x为横,y为纵,所有ux = x, uy = y - 1;
    	ux = x;
    	uy = y - 1; 
    	
    	//上方为已完成的箱子
    	if(map[uy][ux] == 5){
    		return;
    	} 
    	//假设上方为墙,直接return,这个和上面的判断可以合在一起,这里为了看清楚分开写 
    	if(map[uy][ux] == 1){
    		return;
    	}
    	
    	//假设上方为箱子
    	if(map[uy][ux] == 3){
    		//判断箱子上方是否为墙 
    		if(map[uy - 1][ux] == 1){
    			return;
    		}
    		
    		//判断箱子上方是否为终点
    		if(map[uy - 1][ux] == 4){
    			//将箱子上面内容赋值为5★ 
    			map[uy - 1][ux] = 5;
    			map[uy][ux] = 0;
    					
    			//箱子的数目减1	
    			boxs--; 
    		}else{
    			//移动箱子
    			map[uy - 1][ux] = 3;
    		}
    	}
    	//当上面几种return的情况都没遇到,人肯定会移动,移动操作如下
    	map[y][x] = 0;
    	map[uy][ux] = 2;
    	//更新人的坐标
    	y = uy; 
    } 
    

    这是一个方向的,其它方向要考虑的问题也和前面一样,我也就不赘述了。

    6、moveLeft()

    这里大致都和上面一样,就是在记录左边坐标时,应该应该是lx = x - 1。

    void moveLeft(){
    	//定义变量存放人物左边的坐标
    	int lx, ly; 
    	
    	//当左边没有元素时,直接return	
    	if(x == 0){
    		return;
    	}
    	
    	//记录左边坐标
    	lx = x - 1;
    	ly = y; 
    	
    	//左边为已完成方块
    	if(map[ly][lx] == 5){
    		return;
    	} 
    	
    	//假设左边为墙,直接return 
    	if(map[ly][lx] == 1){
    		return;
    	}
    	
    	//假设左边为箱子
    	if(map[ly][lx] == 3){
    		//判断箱子左边是否为墙 
    		if(map[ly][lx - 1] == 1){
    			return;
    		}
    		
    		//判断箱子左边是否为球
    		if(map[ly][lx - 1] == 4){
    			//将箱子左边内容赋值为5★ 
    			map[ly][lx - 1] = 5;
    			map[ly][lx] = 0;
    		
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ly][lx - 1] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[ly][lx] = 2;
    	x = lx; 
    }
    

    7、moveDown()

    这里在判断边界时,判断的是 y == HEIGHT - 1。

    void moveDown(){
    	//定义变量存放人物下方的坐标
    	int dx, dy; 
    	
    	//当下方没有元素时,直接return	
    	if(y == HEIGHT - 1){
    		return;
    	}
    	
    	//记录下方坐标
    	dx = x;
    	dy = y + 1; 
    	
    	//下方为已完成方块
    	if(map[dy][dx] == 5){
    		return;
    	} 
    	
    	//假设下方为墙,直接return 
    	if(map[dy][dx] == 1){
    		return;
    	}
    	
    	//假设下方为箱子
    	if(map[dy][dx] == 3){
    		//判断箱子下方是否为墙 
    		if(map[dy + 1][dx] == 1){
    			return;
    		}
    		
    		//判断箱子下方是否为球
    		if(map[dy + 1][dx] == 4){
    			//将箱子下面内容赋值为5★ 
    			map[dy + 1][dx] = 5;
    			map[dy][dx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子
    			map[dy + 1][dx] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[dy][dx] = 2;
    	y = dy; 
    }
    

    8、moveRight()

    这里也没什么特别说的:

    void moveRight(){
    	//定义变量存放人物右边的坐标
    	int rx, ry; 
    	
    	//当右边没有元素时,直接return	
    	if(x == WIDTH - 1){
    		return;
    	}
    	
    	//记录右边坐标
    	rx = x + 1;
    	ry = y; 
    	
    	//右边为已完成方块
    	if(map[ry][rx] == 5){
    		return;
    	} 
    	
    	//假设右边为墙,直接return 
    	if(map[ry][rx] == 1){
    		return;
    	}
    	
    	//假设右边为箱子
    	if(map[ry][rx] == 3){
    		//判断箱子右边是否为墙 
    		if(map[ry][rx + 1] == 1){
    			return;
    		}
    		
    		//判断箱子左边是否为球
    		if(map[ry][rx + 1] == 4){
    			//将箱子右边内容赋值为5★ 
    			map[ry][rx + 1] = 5;
    			map[ry][rx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ry][rx + 1] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[ry][rx] = 2;
    	x = rx; 
    }
    

    三、总结

    现在再回顾开始的运行步骤

    • 清除屏幕
    • 绘制地图
    • 判断游戏是否结束
    • 对用户按下的按钮进行反馈

    这里把判断游戏是否结束放到了重绘图像后面,因为在对用户进行反馈的时候只是改变了map中的数据,实际上最后一个箱子推到终点的图像还没有显示出来,所以要在重绘之后再判断是否结束游戏。

    代码有很多冗余的地方,一方面是想大家更好的理解,还有一方面出于懒。哈哈,代码运行起来没有问题,源码和源程序我会上传,有兴趣的可以下下来,或者直接复制代码运行也是没问题的。
    百度云连接如下:
    链接:https://pan.baidu.com/s/1pwEKt3VTKmssDgU6dLx0pg 提取码:4o9v

    展开全文
  • 本程序通过VS2013编译器编译通过,用C语言实现推箱子小游戏,分为纯控制台的方式实现和EasyX图形库的方式实现,实现思路清晰,代码比较容易看懂
  • C语言制作的推箱子小游戏带视频亲测游戏.rar
  • C语言小游戏-推箱子

    2020-08-21 08:50:18
    使用纯C语言开发,经典的推箱子小游戏,使用codeblocks集成开发环境跑通,大家可以下载学习讨论。
  • C语言写的推箱子游戏C语言写的推箱子游戏C语言写的推箱子游戏C语言写的推箱子游戏
  • 主要为大家详细介绍了C语言实现简单推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的伙伴们可以参考一下
  • 使用C语言完成的推箱子游戏,有关卡读写
  • C语言编写的推箱子小游戏

    千次阅读 多人点赞 2019-06-17 18:28:26
    大一时候的期末大作业,一直没找到,...1.编写推箱子小游戏 2.使用C语言 3.使用Dev C++编程程序 4.实现小人移动判定 5.实现通关判定 实验分析 1.首先了解推箱子游戏的规则 2.使用代码完成基本的功能 3.判...
  • 这个程序是一个C语言写的推箱子小游戏,共有三关。没有非常复杂的页面设计,非常适合C语言初学者用来学习。
  • C语言+EGE实现推箱子小游戏 **下面展示一些 内联代码片。 // main.cpp main函数进入代码块 #include "head.h" #include "jiemian.cpp" #include "caozuo.cpp" #include "drawmap.cpp" #include "playgame.cpp" #...
  • #define MAP_YELLOWBOX 52 //'4' 箱子 #define MAP_REDBOX 53 //'5' 安放好的箱子 #define MAP_MANWALL 54 //'6' 人在通道区域 #define MAP_MANBALL 55 //'7' 人在目的点区域 //声音状态 #define SOUND_STATE_...
  • 主要为大家详细介绍了C语言实现推箱子小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 一个用C语言做的推箱子小游戏,简单,只有一关,在vc下运行
  • VS 控制台程序 可以自己选关的 刚学完C语言自己编的推箱子小游戏
  • C语言小游戏:推箱子

    2021-01-13 13:47:04
    一书中学了简易小游戏走迷宫的写法,之后的挑战是写一个推箱子,于是尝试去写一下. 代码 此段代码是我在摸索中更改之后的最终代码,存在改动痕迹. #include <stdio.h> #include <stdlib.h> #include <...
  • c语言实现的推箱子小游戏-1

    千次阅读 多人点赞 2016-07-10 21:40:35
    c语言实现的推箱子小游戏-1本次游戏是个推箱子第一关最简单的小游戏,有详细注释,下面是做出来的游戏界面 游戏操作说明和功能说明: 按wasd控制小人的上下左右移动。 按 r 重新开始游戏 游戏开始有操作介绍 游戏...
  • C语言沈梦溪推箱子小游戏

    千次阅读 热门讨论 2021-08-16 11:39:02
    游戏关卡 void GameMap() { //3.1导入所有地图 int gamemap[5][9][9] = { {{4, 4, 6, 6, 6, 4, 4, 4, 4 }, {4, 4, 6, 3, 6, 4, 4, 4, 4 }, {4, 4, 6, 0, 6, 6, 6, 6, 4 }, {6, 6, 6, 2, 0, 2, 3, 6, 4 },...
  • C语言写的推箱子游戏

    2019-01-01 12:16:46
    C语言写的小游戏 引用了一些多媒体文件 可以键鼠操作。
  • c语言实现推箱子小游戏

    千次阅读 2019-02-28 13:25:50
    c语言实现推箱子小游戏 下面是实现推箱子小游戏的全部代码 这个推箱子小游戏采用文件操作,通过图形库实现了图形界面,相对来说更具有玩游戏的感觉,给人以视觉盛宴。 说笑了,好了大家可以好好的看一下源代码 本...
  • 推箱子,c语言源代码,小游戏c语言源代码,适合初学者的c语言小游戏源代码 推箱子,c语言源代码,小游戏c语言源代码,适合初学者的c语言小游戏源代码
  • 推箱子小游戏,把所有箱子推到指定地点即可通关 # 代表墙壁,@代表小人儿,&代表箱子,$代表目标点 #include <stdio.h> #include <getch.h> #include <stdlib.h> int main(int argc,...
  • C语言easyX 实现推箱子图形界面小游戏 VC++6.0

    千次阅读 多人点赞 2018-10-18 00:13:33
    今天编写一个简单的推箱子小游戏,游戏中加了特效音乐,只有一个关卡,想加其他关卡也很简单,只要将数组地图修改就行。
  • C语言小游戏推箱子

    2020-05-20 17:33:31
    描述:用户进入页面后可以进行选关,每关的关卡难度依次递增,当你选择一关并通过后,会自动进入下一关,直到游戏结束。游戏过程中会有系统提示。 实现方式:二维数组 (2)功能 1.菜单功能。玩家通过看目录按对应...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,194
精华内容 477
关键字:

c语言小游戏推箱子

c语言 订阅