C语言推箱子游戏,随机生成地图

思路:

一、地图初始化
- 使用奇数行和列相同的二维数组存储地图,初始化全部为墙
- 使用一个1-2的随机数确定挖坑方向,1向左,2向右
- 定义步进,随机数范围: 2至(列数-1)
- 利用步进和方向挖坑,先从顶部挖到中间一行,再从底部挖到中间,然后将中间的墙全部连起来,得到完整路径。

二、推箱子
- 0代表小人,X代表箱子
- 左移和右移:判断小人所在位置临近向右(左)的位置是否是箱子,以及箱子的右(左)边位置是否是墙,如果都不是,将箱子和小人向右(左)移动一格;如果小人的右边没有箱子也不是墙,则将小人向右(左)移动,箱子不变
- 上移和下移:判断小人所在位置临近向下(上)的位置是否是箱子,以及箱子的下(上)边位置是否是墙,如果都不是,将箱子和小人向下(上)移动一格;;如果小人的右边没有箱子也不是墙,则将小人向下(上)移动,箱子不变
- 箱子到终点的时候游戏结束


C语言推箱子游戏,随机生成地图_第1张图片

C语言推箱子游戏,随机生成地图_第2张图片

代码块



#include 
#include 

void setMap (int rows,int cols,char arr[][cols]);//初始化随机地图
void printMap (int  rows,int cols, char arr[][cols]);//打印地图
char dirIn (void);//返回输入的方向


int main()
{
    int inNanDu = 0; //难度系数
    int rows = 25,cols = 25; //行和列数默认值
    int nowRow = 1; //当前行座标初始化
    int set =1; //步进设置初始化

loop3:
    system ("clear");
    printf ("# # # # # # # # # # # # # # # # # # # # # # #\n");
    printf ("\n\n\n\n\n");
    printf ("               推箱子游戏\n");
    printf ("\n\n\n\n\n");
    printf ("# # # # # # # # # # # # # # # # # # # # # # #\n\n");
    printf ("请输入游戏地图的难度值,0-简单,1-普通,2,较难\n");
    scanf ("%d",&inNanDu);
    switch (inNanDu)
    {
        case 0:
            rows = 25;cols = 25;
            break;
        case 1:
            rows = 35;cols = 35;
            break;
        case 2:
            rows = 45;cols = 45;
            break;
        default:
            goto loop3;

    }

    char arr[rows][cols];
    char ch = '0';
    char *pNow = arr[1]; //定义行的移动指针

    setMap (rows,cols,arr); //初始化随机地图
    printMap (rows,cols,arr); //打印地图

    while (ch != 'q')//游戏主体程序
    {
        pNow = arr[nowRow];
        system ("clear"); //清屏
        printMap (rows,cols,arr); //打印地图
        printf ("方向控制,a-左,s-下,d-右,w-上,q-退出\n");

        ch = dirIn(); //获取用户输入的方向控制
        switch (ch)
        {
            case 'a':
            case 'A':  //向左移动
                if (pNow[set-1] == 'X' && pNow[set-2] != '#')
                {
                    pNow[set-2] = 'X';
                    pNow[set-1] = '0';
                    pNow[set] = ' ';
                    set--;
                    break;
                }
                else if (*(pNow+set-1) != 'X' && *(pNow+set-1) != '#')
                {
                    pNow[set-1] = '0';
                    pNow[set] = ' ';
                    set--;
                    break;
                }
                break;

            case 's':
            case 'S': //向下移动
                if (arr[nowRow+1][set] == 'X' && arr[nowRow+2][set] != '#')
                {

                    arr[nowRow][set] = ' ';
                    arr[nowRow+1][set] = '0';
                    arr[nowRow+2][set] = 'X';
                    nowRow++;
                    if(nowRow+2 >= cols)
                    {
                        system ("clear");
                        printMap (rows,cols,arr);
                        printf ("你好牛逼!游戏结束!、\n");
                        return 0;
                    }
                    break;
                }
                else if (arr[nowRow+1][set] != 'X' && arr[nowRow+1][set] != '#')
                {
                    arr[nowRow][set] = ' ';
                    arr[nowRow+1][set] = '0';
                    nowRow++;

                    break;
                }
                break;
            case 'd':
            case 'D': //向右移动
                if (pNow[set+1] == 'X' && pNow[set+1] != '#')
                {
                    pNow[set+2] = 'X';
                    pNow[set+1] = '0';
                    pNow[set] = ' ';
                    set++;
                    break;
                }
                else if (*(pNow+set+1) != 'X' && *(pNow+set+1) != '#')
                {
                    pNow[set+1] = '0';
                    pNow[set] = ' ';
                    set++;
                    break;
                }
                break;
            case 'w':
            case 'W': //向上移动
                if (arr[nowRow-1][set] == 'X' && arr[nowRow-2][set] != '#')
                {

                    arr[nowRow][set] = ' ';
                    arr[nowRow-1][set] = '0';
                    arr[nowRow-2][set] = 'X';
                    nowRow--;
                    break;
                }
                else if (arr[nowRow-1][set] != 'X' && arr[nowRow-1][set] != '#')
                {
                    arr[nowRow][set] = ' ';
                    arr[nowRow-1][set] = '0';
                    nowRow--;
                    break;
                }
                break;
        }
    }

}


void setMap (int rows,int cols,char arr[][cols])//初始化随机地图
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            arr[i][j] = '#'; //填充所有的墙
        }
    }
 int nowR = 1,temp=1; //当前座标点位置,及存储座标的临时变量

    for (int i = 1; i < rows /2 ;i+=2)
    {
        char *pRwo = arr[i]; //指针指向第一行数组

    loop:
        printf ("");
        int dir = arc4random_uniform(2)+1; //获取左右随机方向
        int set = arc4random_uniform(cols-2-2)+2;//获取随机步进值

        switch (dir)
        {
            case 1:  //向左挖坑移动
                if (nowR-2 < set)
                {
                    goto loop;
                }
                else
                {
                    for (int j = nowR; j > nowR-set; j--)
                    {
                    *(pRwo+j) = ' ';
                    arr[i+1][j] = ' ';
                        temp = j;
                    }
                    nowR = temp;
                    break;
                }
            case 2: //向右挖坑移动
                if (set > cols -2 - nowR)
                {
                    goto loop;
                }
                else
                {
                    for (int j = nowR; j < nowR+set; j++)
                    {
                         *(pRwo+j) = ' ';
                        arr[i+1][j] = ' ';
                        temp =j;
                    }
                    nowR = temp;
                    break;
                }

        }
        arr[i+2][nowR] = ' '; //向下挖坑移动
        arr[i+2][nowR+1] = ' ';
        arr[i+2][nowR-1] = ' ';
        arr[i+3][nowR] = ' '; //向下挖坑移动
        arr[i+3][nowR+1] = ' ';
        arr[i+3][nowR-1] = ' ';

    }

    for (int i = rows-2; i > rows /2 ;i-=2) //由下往上挖坑,到中间值截止
    {
        char *pRwo = arr[i]; //指针指向第一行数组

    loop2:
        printf ("");
        int dir = arc4random_uniform(2)+1; //左右随机方向
        int set = arc4random_uniform(cols-2-2)+2;

        switch (dir)
        {
            case 1:  //向左挖坑移动
                if (nowR-2 < set)
                {
                    goto loop2;
                }
                else
                {
                    for (int j = nowR; j > nowR-set; j--)
                    {
                        *(pRwo+j) = ' ';
                        arr[i-1][j] = ' ';
                        temp = j;
                    }
                    nowR = temp;
                    break;
                }
            case 2: //向右挖坑移动
                if (set > cols -2 - nowR)
                {
                    goto loop2;
                }
                else
                {
                    for (int j = nowR; j < nowR+set; j++)
                    {
                        *(pRwo+j) = ' ';
                        arr[i-1][j] = ' ';
                        temp =j;
                    }
                    nowR = temp;
                    break;
                }

        }
        arr[i-2][nowR] = ' '; //向下移动
        arr[i-2][nowR+1] = ' ';
        arr[i-2][nowR-1] = ' ';
        arr[i-3][nowR] = ' '; //向下移动
        arr[i-3][nowR+1] = ' ';
        arr[i-3][nowR-1] = ' ';
    }
    for (int i = 1; i < cols-1; i++ ) //为末行、首先和中间行挖全坑
    {
        arr[rows-2][i]= ' ';
        arr[rows-3][i]= ' ';
        arr[rows/2][i]= ' ';
        arr[1][i]= ' ';
        arr[2][i]= ' ';
    }
    arr[rows-1][cols-2] = ' '; //初始化终点、小人、箱子位置
    arr[1][1] = '0';
    arr[2][2] =  'X';

}

void printMap (int  rows,int cols, char arr[][cols])//打印地图
{
    for (int i = 0; i < rows; i++ )
    {
        for (int j = 0; j < cols; j++)
        {
        printf ("%c ",arr[i][j]);
        }
        printf ("\n");
    }
}

char dirIn (void)//返回输入的方向
{
    char ch = '0';
    rewind (stdin);
    scanf ("%c",&ch);
    return ch;
}

你可能感兴趣的:(C)