c语言 推箱子小游戏二次开发

内容来源:CSDN(额………………):https://blog.csdn.net/m0_71832999/article/details/128050830?ops_request_misc=&request_id=&biz_id=102&utm_term=c++推箱子小游戏&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-128050830.142v99pc_search_result_base6&spm=1018.2226.3001.4187
运行环境:Visual Studio 2022
原代码:

点击查看代码
#include <stdio.h>  
#include <conio.h>
#include<stdlib.h> 
int map[9][11] = {
{0,1,1,1,1,1,1,1,1,1,0},  //0代表空地
{0,1,0,0,0,1,0,0,0,1,0},  //1代表墙
{0,1,0,4,4,4,4,4,0,1,0},  //3代表目的地
{0,1,0,4,0,4,0,4,0,1,1},  //4代表箱子
{0,1,0,0,0,0,0,0,4,0,1},  //5代表人 
{1,1,0,1,1,1,1,0,4,0,1},
{1,0,8,3,3,3,3,1,0,0,1},  //2 3 4 5 6 7 8 9 1 0
{1,0,3,3,3,3,3,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,0} };
//绘制地图  //二维数组+switch()
void DrawMap()
{
    //遍历二维数组  //0 打印空格  //1 墙   //3 目的地  //什么结构?
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 11; 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':  //W A S D方向   72  80  75  77 虚拟键值 ascii  windowVK_UP VK_TAB VK_RETUNE
    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':  //enter按键的作用  确认 返回
    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()  //主函数
{
    while (1)
    {
        system("cls");
        DrawMap();
        PlayGame();
    }
    return 0;
}
//通过按键来实现游戏  ---> 通过按键来改变二维数组的排列顺序.
//思考一个问题? 地图是二维数组来决定的. 人在哪里  二维数组来决定?
/************************************************
//人推箱子
可以动.    怎么办.  改变元素
    1.人的前面是空地
    2.人的前面是目的地
    3.人的前面是箱子
        3.1 箱子的前面是空地
        3.2 箱子的前面是目的地
        //盘断二维数组中有几个7
        //没有目的地  不对..  人站在目的地
        //有没有4.
****************************************/
运行结果: ![](https://img2024.cnblogs.com/blog/3398597/202403/3398597-20240306234208817-402498290.png)

问题改善:
1.人机交互不够好,没有操作提示
2.没有重启按键,一旦走错无法重置游戏
3.完成游戏后无通关标识
新代码:
1.操作提示:

2.重置游戏:

3.通关标识:

测试截图:
1.

总结:玩游戏应该从玩家舒适的角度进行考虑,使程序趋向于方便玩家游玩,要有较好的人机交互。因此思考逆向软件工程,应该代入到使用者的角度,而非创作者的角度。

posted @ 2024-03-06 23:22  严正阳  阅读(90)  评论(0)    收藏  举报