C语言小游戏: 推箱子 支线(一)--1

好家伙,考完试了

 

回顾一下2021

回顾一下某次的作业

C语言小游戏: 推箱子 支线(一)--1

妙啊

 

所以,

做一个推箱子小游戏

 

1.先去4399找一下关卡灵感

C语言小游戏: 推箱子 支线(一)--1

 

 就它了

 

2.在百度上搜几篇推箱子,

参考其中的"■ ☆"图案以及行动逻辑


取其精华,再缝缝补补,再缝缝补补,再缝缝补补,

就行了,代码如下:

#include <stdio.h>  
#include <conio.h>
#include<stdlib.h> 
#include<windows.h>

int map[6][8] = {
    {1,1,1,1,1,1,1,1},  //0代表空地
    {1,0,0,0,0,1,1,1},  //1代表墙
    {1,0,0,0,3,3,0,1},  //3代表目的地
    {1,0,4,4,4,5,0,1},  //4代表箱子
    {1,0,0,1,0,3,0,1},  //5代表人 
    {1,1,1,1,1,1,1,1},};
                          //2 3 4 5 6 7 8 9 1 0
   

//绘制地图  //二维数组+switch()
void DrawMap()
{
    //遍历二维数组  //0 打印空格  //1 墙   //3 目的地  //什么结构?
    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            //if  else  switch
            switch (map[i][j])
            {
            case 0:
                printf("  ");
                break;
            case 1:
                printf("■");
                break;
            case 3:
                printf("☆");
                break;
            case 4:
                printf("□");
                break;
            case 5:
                printf("♀");  //5人
                break;
            case 7:     //4 + 3  箱子在目的地中
                printf("★");
                break;
            case 8:     // 5 + 3  人在目的地当中   人?
                printf("♀");
                break;
            }
        }
        printf("\n");
    }
}


void PlayGame()
{
    int r, c;  //人的下标  //
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 11; j++)
        {
            if (map[i][j] == 5||map[i][j]==8)   //i j 人的下标?
            {
                r = i;
                c = j;
            }
        }
    }

    char ch;  //字符变量
    ch = getch();  //键盘的输入保存到字符中
    // getch()     getchar()  接收键盘字符
    // getch()直接接收 不显示回文   getchar()显示回文可以修改 enter键结束

    //根据不同的按键  改变不同的值. 分支.
    switch (ch)
    {
    case 'W':  //上下左右 对应的ASCll码:   72  80  75  77 
    case 'w':
    case 72:
        if (map[r - 1][c] == 0|| map[r - 1][c] == 3) //走到的地方是空的或者是目的地
        {
            map[r - 1][c] += 5;                //要去的那个格子加数字,变成人
            map[r][c] -= 5;            //现在的格子减数字,变成空格
        }
        else if (map[r - 1][c] == 4 || map[r - 1][c] == 7)  //目标格有箱子,或者目标格是有箱子的目的地
        {
            if (map[r - 2][c] == 0 || map[r - 2][c] == 3)   //目的地的下一格子是空地或者是目的地,
            {
                map[r - 2][c] += 4;                        //箱子推到目的地的下一格
                map[r - 1][c] += 1;                        //人去到目的地
                map[r][c] -= 5;                            //原地变为空格     //下面的"向 ,左 ,右 ,下走"就不打注释了,一样的逻辑
            }
        }



        break;

    case 'S':  
    case 's':
    case 80:
        if (map[r + 1][c] == 0 || map[r + 1][c] == 3)
        {
            map[r + 1][c] += 5;
            map[r][c] -= 5;
        }
        else if (map[r + 1][c] == 4 || map[r+ 1][c] == 7)
        {
            if (map[r + 2][c] == 0 || map[r + 2][c] == 3)
            {
                map[r + 2][c] += 4;
                map[r + 1][c] += 1;
                map[r][c] -= 5;
            }
        }
        break;

    case 'A':
    case 'a':
    case 75:
        if (map[r ][c - 1] == 0 || map[r ][c - 1] == 3)
        {
            map[r ][c - 1] += 5;
            map[r][c] -= 5;
        }
        else if (map[r][c - 1] == 4 || map[r][c - 1] == 7)
        {
            if (map[r ][c - 2] == 0 || map[r ][c - 2] == 3)
            {
                map[r ][c - 2] += 4;
                map[r ][c - 1] += 1;
                map[r][c] -= 5;
            }
        }
        break;

    case 'D':
    case 'd':
    case 77:
        if (map[r][c + 1] == 0 || map[r][c + 1] == 3)
        {
            map[r][c + 1] += 5;
            map[r][c] -= 5;
        }
        else if (map[r][c + 1] == 4 || map[r][c + 1] == 7)
        {
            if (map[r][c + 2] == 0 || map[r][c + 2] == 3)
            {
                map[r][c + 2] += 4;
                map[r][c + 1] += 1;
                map[r][c] -= 5;
            }
        }
        break;
    
    }
}

//
int main()  //主函数
{
        printf("这是一个朴实无华的推箱子游戏\n");
        printf("W---向上走\n");
        printf("A---向左走\n");
        printf("S---向下走\n");
        printf("D---向右走\n");
        printf("\n");
        printf("当然你也可以使用上下左右键\n");
        printf("如果你走错了,心态崩了,可以关掉重来\n");
        printf("游戏将于3秒后开始\n");


        Sleep(3000);
        
    while (1)
    {
        
        system("cls");   //清屏再绘图
        DrawMap();    //画地图
        PlayGame();
        if(map[2][4]==7&&map[2][5]==7&&map[4][5]==7)
        {
            printf("恭喜你通关了!");
        Sleep(2000);    
        }
        
    }
    
    return 0;
}

 

搞定了,

其中比较重要的几点:

1.用数字去代表图案,  "人"行动时进行数字的加减

       case 0:
                printf("  ");    //空路
                break;
            case 1:
                printf("■");    //墙壁,无法行走
                break;
            case 3:
                printf("☆");    //目的地
                break;
            case 4:
                printf("□");    //箱子
                break;
            case 5:        //玩家操作的人
                printf("♀");  //5人
                break;
            case 7:     //4 + 3  箱子在目的地中
                printf("★");
                break;
            case 8:     // 5 + 3  人在目的地当中 
                printf("♀");
                break;

 

2.最主要的行动逻辑:

if (map[r - 1][c] == 0|| map[r - 1][c] == 3) //走到的地方是空的或者是目的地
        {
            map[r - 1][c] += 5;                //要去的那个格子加数字,变成人
            map[r][c] -= 5;            //现在的格子减数字,变成空格
        }
        else if (map[r - 1][c] == 4 || map[r - 1][c] == 7)  //目标格有箱子,或者目标格是有箱子的目的地
        {
            if (map[r - 2][c] == 0 || map[r - 2][c] == 3)   //目的地的下一格子是空地或者是目的地,
            {
                map[r - 2][c] += 4;                        //箱子推到目的地的下一格
                map[r - 1][c] += 1;                        //人去到目的地
                map[r][c] -= 5;                            //原地变为空格     //下面的"向 ,左 ,右 ,下走"就不打注释了,一样的逻辑
            }
        }

 其他方向的走动也是这么个逻辑

 

3.其中有个小细节

char ch;  //字符变量
ch = getch();

getch()与getchar()有区别的是:getchar()输入一个字符后需要回车来进行下一个字符的输入,按一下"w"再按回一下"回车"才走一步,(简直折磨玩家)

              getch()不需要回车就能连续输入多个字符,更加人性化了,

 

其最终效果如下:

C语言小游戏: 推箱子 支线(一)--1

 

 C语言小游戏: 推箱子 支线(一)--1

 

 C语言小游戏: 推箱子 支线(一)--1

 

 

 真是非常的朴实无华(简陋,破烂)

还是有一些小毛病:1,走错了不能退步(走错了直接关了重开),2,"人"走的时候一闪一闪的,3,全部归位最后一步的前一步会有点卡

 

This all.

 

还有,新年快乐.

上一篇:Java学习笔记——四、分支语句


下一篇:Day04_Java流程控制