• 推箱子小游戏实例(C/C++)


    // 语句 循环 数组 选择结构程序设计(switch语句)

    // 一句话描述推箱子游戏:人在空地上推着箱子躲避障碍到目标点

    // 初始化数据 -- 更新数据、渲染界面 -- 判断结束

    /*

    #include <stdio.h>

    #include <Windows.h>

    #include <conio.h>

    // 全局区 初始化地图

    int Map[10][10] = {

    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },

    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },

    { 1, 0, 0, 0, 4, 0, 0, 0, 0, 1 },

    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },

    { 1, 1, 1, 1, 3, 0, 0, 0, 0, 1 },

    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },

    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 },

    { 1, 0, 0, 0, 0, 0, 1, 0, 0, 1 },

    { 1, 0, 0, 0, 2, 0, 1, 0, 0, 1 },

    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }

    };// 分号

    // 主函数 是整个程序的入口

    int main()

    {

    // 游戏主循环

    while (true)

    {

    // 渲染界面 -- 画地图 -- 打印数组的值

    for (int i = 0; i < 10; i++)// 外层循环控制行数

    {

    for (int j = 0; j < 10; j++)// 内层循环控制列数

    {

    // 打印当前遍历到的数组元素的值

    //printf(" %d", Map[i][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 6:

    printf("♀");

    break;

    case 7:

    printf("★");

    break;

    default:

    break;

    }

    }

    // 打印完一行后换行

    printf(" ");

    }

    // 控制人物移动

    // 1 找人:查找数组

    // 遍历数组 -- 定位人的位置

    int posX = 0;

    int posY = 0;

    for (int i = 0; i < 10; i++)// 外层循环控制行数

    {

    for (int j = 0; j < 10; j++)// 内层循环控制列数

    {

    if (2 == Map[i][j] ||

    6 == Map[i][j])

    {

    posX = i;

    posY = j;

    }

    }

    }

    //printf("当前人物位置: %d行 %d列 ", posX, posY);

    // 2 控制(WSAD wsad)

    // 从键盘获取按键内容 -- 根据不同内容作出不同反应

    switch (getch())

    {

    case 'W':

    case 'w':

    // 需要处理下一个位置是 空地,箱子,目标点 的情况

    if (0 == Map[posX - 1][posY] ||

    4 == Map[posX - 1][posY])

    {

    // 当前位置人离开

    Map[posX][posY] -= 2;

    // 下个位置人过来

    Map[posX - 1][posY] += 2;

    }

    else if (3 == Map[posX - 1][posY])

    {

    if (4 == Map[posX - 2][posY] ||

    0 == Map[posX - 2][posY])

    {

    // 当前位置人离开

    Map[posX][posY] -= 2;

    // 下个位置人过来

    Map[posX - 1][posY] += 2;

    // 下个位置箱子离开

    Map[posX - 1][posY] -= 3;

    // 下下个位置箱子过来

    Map[posX - 2][posY] += 3;

    }

    }

    break;

    case 'S':

    case 's':

    // 需要处理下一个位置是 空地,箱子,目标点 的情况

    if (0 == Map[posX + 1][posY] ||

    4 == Map[posX + 1][posY])

    {

    // 当前位置人离开

    Map[posX][posY] -= 2;

    // 下个位置人过来

    Map[posX + 1][posY] += 2;

    }

    else if (3 == Map[posX + 1][posY])

    {

    if (4 == Map[posX + 2][posY] ||

    0 == Map[posX + 2][posY])

    {

    // 当前位置人离开

    Map[posX][posY] -= 2;

    // 下个位置人过来

    Map[posX + 1][posY] += 2;

    // 下个位置箱子离开

    Map[posX + 1][posY] -= 3;

    // 下下个位置箱子过来

    Map[posX + 2][posY] += 3;

    }

    }

    break;

    default:

    break;

    }

    // 判断胜负

    bool isWin = true;

    for (int i = 0; i < 10; i++)// 外层循环控制行数

    {

    for (int j = 0; j < 10; j++)// 内层循环控制列数

    {

    if (3 == Map[i][j])

    {

    isWin = false;

    }

    }

    }

    if (isWin)

    {

    system("cls");

    printf(" YOU ARE WIN ! ");

    break;

    }

    // 清屏

    system("cls");

    }

    return 0;

    }

    */

    #include <iostream>

    using namespace std;

    void main()

    {

    int** pMap = new int*[10];

    for (int i = 0; i < 10; i++)

    {

    pMap[i] = new int[10];

    }

    // …… pMap 可以作为数组名使用

    for (int i = 0; i < 10; i++)

    {

    delete pMap[i];

    pMap[i] = nullptr;

    }

    delete pMap;

    pMap = nullptr;

    }

    /*

    后续:

    1 完善左右移动(1.0)  posY左减右加

    2 改成函数版本(2.0)

    3 地图使用动态内存(3.0)

    4 EasyX加上图形界面和音乐(4.0)

    5 使用游戏引擎,添加关卡和退格等功能(5.0 5.1 5.2 ...)

    */

  • 相关阅读:
    02数组
    05集合02map
    05集合03List
    04异常异常
    03常用类
    05集合01集合综述
    centos7自建yum源 安装rpm
    centos扩展磁盘根分区
    systemctl 进阶
    systemctl 入门
  • 原文地址:https://www.cnblogs.com/ZhenXin0101/p/13405920.html
Copyright © 2020-2023  润新知