C++推箱子游戏(一)

准备:c/c++基础

          code::blocks

第一次尝试:

自制地图:


将地图在控制台显示出来并控制中心位置的图案移动

#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

void start_map(int a[7][7]);//将数组对应的地图显示出来
int *man_move(int *p,int a[7][7]);

int main()
{
    int a[7][7]= {0};
    a[1][3]=a[3][1]=a[5][3]=a[3][5]=3;
    a[2][3]=a[3][2]=a[3][4]=a[4][3]=2;
    a[3][3]=1;
    int *p;//指向操作对象
    p=&a[3][3];
    while(1)
    {
        start_map(a);
        p=man_move(p,a);
        system("cls");
    }


    system("pause");
    return 0;
}

void start_map(int a[7][7])  //将数组对应的地图显示出来
{
    for(int i=0; i<7; i++)
    {
        for(int j=0; j<7; j++)
        {
            switch(a[i][j])
            {
            case 3:
                cout <<"□";
                break;//箱子要到达的地方
            case 2:
                cout<<"▼";
                break;//箱子
            case 1:
                cout<<"卍" ;
                break;//操作对象
            default:
                cout<<"■";//墙壁
            }
        }
        cout<< endl;
    }
}

int *man_move(int *p,int a[7][7])
{
    char input_move;
    input_move=getch();//输入移动方向
    switch(input_move)
    {
    case 'w':
    {

    } ;
    break;
    case 's':
        cout << 1 ;
        break;
    case 'a':
        cout << 1 ;
        break;
    case 'd':
        cout << 1 ;
        break;
    }
    return p;
}

遇到的第一个问题是移动输入:

采取“cin”需要按回车,于是采用了“getch()”函数。关于getch()的具体情况可以去看看"C++之getch(),getche(),getchar()的区别"

第二次尝试:

在不考虑bug的情况下写出可执行的代码

#include <iostream>
#include <windows.h>
#include <conio.h>
//#include <stdio.h>

using namespace std;

void start_map(int a[7][7]);//将数组对应的地图显示出来
int *man_move(int *p,int a[7][7]);

int main()
{
    int a[7][7]= {0};
    a[1][3]=a[3][1]=a[5][3]=a[3][5]=3;
    a[2][3]=a[3][2]=a[3][4]=a[4][3]=2;
    a[3][3]=1;
    int *p=&a[3][3];//指向操作对象
    p=&a[3][3];
    while(1)
    {
        start_map(a);
        p=man_move(p,a);
        system("cls");
    }


    system("pause");
    return 0;
}

void start_map(int a[7][7])  //将数组对应的地图显示出来
{
    for(int i=0; i<7; i++)
    {
        for(int j=0; j<7; j++)
        {
            switch(a[i][j])
            {
            case 5:
                cout<<"卍" ;
                break;//操作对象与箱子要到达的地方在同一位置
            case 4:
                cout <<"  ";
                break;//空白区域
            case 3:
                cout <<"□";
                break;//箱子要到达的地方
            case 2:
                cout<<"▼";
                break;//箱子
            case 1:
                cout<<"卍" ;
                break;//操作对象
            default:
                cout<<"■";//墙壁
            }
        }
        cout<< endl;
    }
}

int *man_move(int* p,int a[7][7])
{
    char input_move;
    int *p1=p;
    input_move=getch();//输入移动方向
    switch(input_move)
    {
    case 'w':
    {
        if(*(p-7)==4||*(p-7)==3)  //上方为空
        {
            *p1=4;   //原位置置空
            p=p1-7;   //人物上移一格
            if(*p==4)
                *p=1;
            else
                *p=5;
        }
        else if(*(p-7)==2)  //上方有箱子
        {
            if(*(p-14)==4||*(p-14)==3)
            {
                *p1=4; //原位置变为空白
                *(p1-7)=1; //人物上移一格
                *(p1-14)=2; //箱子上移一格
                p=p1-7; //p指向现在的位置
            }
        }
    } ;
    break;
    case 's':
        if(*(p+7)==4||*(p+7)==3)
        {
            *p1=4;
            p=p1+7;
            if(*p==4)
                *p=1;
            else
                *p=5;
        }
        else if(*(p+7)==2)
        {
            if(*(p+14)==4||*(p+14)==3)
            {
                *p1=4;
                *(p1+7)=1;
                *(p1+14)=2;
                p=p1+7;
            }
        }
        break;
    case 'a':
        if(*(p-1)==4||*(p-1)==3)
        {
            *p1=4;
            p=p1-1;
            if(*p==4)
                *p=1;
            else
                *p=5;
        }
        else if(*(p-1)==2)
        {
            if(*(p-2)==4||*(p-2)==3)
            {
                *p1=4;
                *(p1-1)=1;
                *(p1-2)=2;
                p=p1-1;
            }
        }
        break;
    case 'd':
        if(*(p+1)==4||*(p+1)==3)
        {
            *p1=4;
            p=p1+1;
            if(*p==4)
                *p=1;
            else
                *p=5;
        }
        else if(*(p+1)==2)
        {
            if(*(p+2)==4||*(p+2)==3)
            {
                *p1=4;
                *(p1+1)=1;
                *(p1+2)=2;
                p=p1+1;
            }
        }
        break;
    }
    return p;
}

此代码在这种地图上是无错误的.

但在这时有一个问题,即人物移动函数的代码重复性很高,很臃肿而且不清晰,我便考虑在函数内部加入一个函数.

代码就变成了

#include <iostream>
#include <windows.h>
#include <conio.h>
//#include <stdio.h>

using namespace std;

void start_map(int a[7][7]);//将数组对应的地图显示出来
int *man_move(int *p);
int *move_step(int pointer_move_number,int* p);

int main()
{
    int a[7][7]= {0};
    a[1][3]=a[3][1]=a[5][3]=a[3][5]=3;
    a[2][3]=a[3][2]=a[3][4]=a[4][3]=2;
    a[3][3]=1;
    int *p=&a[3][3];//指向操作对象
    p=&a[3][3];
    while(1)
    {
        start_map(a);
        p=man_move(p);
        system("cls");
    }


    system("pause");
    return 0;
}

void start_map(int a[7][7])  //将数组对应的地图显示出来
{
    for(int i=0; i<7; i++)
    {
        for(int j=0; j<7; j++)
        {
            switch(a[i][j])
            {
            case 6:
                cout<<"▼";
                break;//箱子已到达目的地
            case 5:
                cout<<"卍" ;
                break;//操作对象与箱子要到达的地方在同一位置
            case 4:
                cout <<"  ";
                break;//空白区域
            case 3:
                cout <<"□";
                break;//箱子要到达的地方
            case 2:
                cout<<"▼";
                break;//箱子
            case 1:
                cout<<"卍" ;
                break;//操作对象
            default:
                cout<<"■";//墙壁
            }
        }
        cout<< endl;
    }
}

int *man_move(int* p)
{
    char input_move;
    input_move=getch();//输入移动方向
    switch(input_move)
    {
    case 'w':
        p=move_step(-7,p);//上移
        break;
    case 's':
        p=move_step(7,p);//下移
        break;
    case 'a':
        p=move_step(-1,p);//左移
        break;
    case 'd':
        p=move_step(1,p);//右移
        break;
    }
    return p;
}

int *move_step(int pointer_move_number,int* p)
{
    int *p1=p;
    if(*(p+pointer_move_number)==4||*(p+pointer_move_number)==3)  //移动方向上第一格为空
    {
        *p1=4;   //原位置置空
        p=p1+pointer_move_number;   //人物移一格
        if(*p==4)
            *p=1;
        else
            *p=5;
    }
    else if(*(p+pointer_move_number)==2)  //移动方向上第一格有箱子
    {
        if(*(p+pointer_move_number*2)==4||*(p+pointer_move_number*2)==3)//移动方向上第二格为空
        {

            *p1=4; //原位置变为空白
            *(p1+pointer_move_number)=1; //人物移一格
            *(p1+pointer_move_number*2)=2; //箱子移一格
            p=p1+pointer_move_number; //p指向现在的位置
        }
    }
    return p;
}

代码简洁了不少,而且更好修改了.

尝试成功,现在考虑真正可用的程序

第三次尝试:可用程序

原代码在移动判定时存在不足,即move_step()函数在某些情况下是不可靠的

我需要一个新的地图进行下一步优化和游戏性的提高

#include <iostream>
#include <windows.h>
#include <conio.h>
//#include <stdio.h>
int sign_win=0;
using namespace std;

void start_map(int a[15][15]);//将数组对应的地图显示出来,地图大小为15*15
int *man_move(int *p);
int *move_step(int pointer_move_number,int* p);

int main()
{
    int a[15][15]= {0};
    /* a[1][3]=a[3][1]=a[5][3]=a[3][5]=3;
     a[2][3]=a[3][2]=a[3][4]=a[4][3]=2;
     a[3][3]=1;
     int *p=&a[3][3];//指向操作对象
     p=&a[3][3];
     while(1)
     {
         start_map(a);
         p=man_move(p);
         system("cls");
     }*/
    a[1][1]=a[1][3]=a[2][1]=a[3][1]=a[3][3]=a[4][3]=a[5][3]=a[5][4]=a[5][5]=a[5][6]=a[6][2]=a[6][3]=a[6][4]=a[6][6]=a[6][7]=a[7][2]=a[7][3]=a[7][4]=4;
    a[3][7]=a[4][7]=a[5][7]=3;
    a[2][3]=a[2][2]=a[3][2]=2;
    a[1][2]=1;
    int *p=&a[3][3];//指向操作对象
    p=&a[1][2];
    while(1)
    {
        start_map(a);
        p=man_move(p);
        system("cls");
    }

    system("pause");
    return 0;
}

void start_map(int a[15][15])  //将数组对应的地图显示出来
{
    for(int i=0; i<14; i++)
    {
        for(int j=0; j<14; j++)
        {
            switch(a[i][j])
            {
            case 6:
                cout<<"▼";
                break;//箱子已到达目的地
            case 5:
                cout<<"卍" ;
                break;//操作对象与箱子要到达的地方在同一位置
            case 4:
                cout <<"  ";
                break;//空白区域
            case 3:
                cout <<"□";
                break;//箱子要到达的地方
            case 2:
                cout<<"▼";
                break;//箱子
            case 1:
                cout<<"卍" ;
                break;//操作对象
            default:
                cout<<"■";//墙壁
            }
        }
        cout<< endl;
    }
}

int *man_move(int* p)
{
    char input_move;
    input_move=getch();//输入移动方向
    switch(input_move)
    {
    case 'w':
        p=move_step(-15,p);//上移
        break;
    case 's':
        p=move_step(15,p);//下移
        break;
    case 'a':
        p=move_step(-1,p);//左移
        break;
    case 'd':
        p=move_step(1,p);//右移
        break;
    }
    return p;
}

int *move_step(int pointer_move_number,int* p)
{
    int *p1=p;
    if(*(p+pointer_move_number)==4||*(p+pointer_move_number)==3)  //移动方向上第一格为空
    {
        if(*p==5)//原位置与目标点重合
            *p1=3;//原位置置移动目标□
        else
            *p1=4;   //原位置置空
        p=p1+pointer_move_number;   //人物移一格
        if(*p==4)
            *p=1;
        else//人物移动位置为某一箱子指定位置
            *p=5;
    }
    else if(*(p+pointer_move_number)==2||*(p+pointer_move_number)==6)  //移动方向上第一格有箱子
    {
        if(*(p+pointer_move_number*2)==4||*(p+pointer_move_number*2)==3)//移动方向上第二格为空
        {

            if(*p==5)//原位置与目标点重合
                *p1=3;//原位置置移动目标□
            else
                *p1=4;   //原位置置空
            if(*(p1+pointer_move_number)==2)//箱子原位置未到达指定点
                *(p+pointer_move_number)=1;//人物移一格
            else//箱子原位置已到达目标点
                *(p+pointer_move_number)=5;
            if(*(p1+pointer_move_number*2)==3)//箱子到达指定位置
            {
                *(p1+pointer_move_number*2)=6;//箱子移一格
                sign_win++;
            }
            else
                *(p1+pointer_move_number*2)=2; //箱子移一格
            p=p1+pointer_move_number; //p指向现在的位置
        }
    }

    return p;
}

推箱子的基本功能已经实现了,现在就要解决其他问题,界面太丑,操作是会伴随频闪

还有就是回到上一步的功能以及胜利条件,关卡的选择等

这让我有点蒙,我参考了https://blog.csdn.net/qq_35963183/article/details/52425032

更蒙了0.0

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭