黑马程序员——迷宫游戏初步的实现及思路

本文详细介绍了一款基于字符界面的迷宫游戏的设计与实现过程。包括如何利用C语言创建迷宫地图、定义游戏规则及玩家操作等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

一、迷宫的设计

迷宫形状:

* * * * * * * *

* O   *       *

 *     *     Exit

 *   * * * *

 *         *

 * * * *   *

*             *

* * * * * * * *

*代表墙壁,O代表操作者所在位置,exit是出口处。

二、展示迷宫及其代码

1、自己设计迷宫代码:

#include <stdio.h>
/**
 *  向二维数组中添加元素
 *
 *  @param m 二维数组行数
 *  @param n 二维数组列数
 *  @param a 二维数组
 */
void inputDoubleArrayElement(int m,int n,char a[m][n]){
    for (int i=0; i<m; i++) {
        for (int j=0; j<n; j++) {
            printf("please enter the %d row %d column's number:\n",i+1,j+1);
            scanf("%s",&a[i][j]);
            //用@代替spacing,然后将两者进行互换。
            if (a[i][j]=='@') {
                int temp;
                char spacing = ' ';
                temp = a[i][j];
                a[i][j] = spacing;
                spacing = temp;
            }
        }
    }
}


int main(){
    int row,col;
    printf("please enter a number:\n");
    //设置二维数组的行数和列数。
    scanf("%d,%d",&row,&col);
    char a[row][col];
    //function call.
    inputDoubleArrayElement(row, col, a);
    for (int i=0; i<row; i++) {
        for (int j=0; j<col; j++) {
            printf("%c\t",a[i][j]);
        }
        printf("\n");
    }
}
其中因知识储备,无法直接输出空格,因此采用@和空格的替换。这种方式可以自己DIY迷宫,不用被初始迷宫限制。

2、直接展示迷宫

#include <stdio.h>
int main(){
    char a[8][8] = {
        {'*','*','*','*','*','*','*','*'},
        {'*','O',' ','*',' ',' ',' ','*'},
        {'*',' ','*',' ',' ','*',' ',' '},
        {'*',' ','*',' ','*','*','*','*'},
        {'*',' ','*',' ',' ',' ',' ','*'},
        {'*',' ','*','*','*','*',' ','*'},
        {'*',' ',' ',' ',' ',' ',' ','*'},
        {'*','*','*','*','*','*','*','*'},
    };
    for (int i=0; i<8; i++) {
        for (int j=0; j<8; j++) {
            printf("%c\t",a[i][j]);
        }
        printf("\n");
    }
}
输出结果是:

* * * * * * * *

* O   *       *

 *     *    

 *   * * * *

 *         *

 * * * *   *

*             *

* * * * * * * *


三、迷宫移动设计的实现

1、使用W,A,S,D分别代表O的移动方向

W——向上移动

在数组中应该是row-1

A——向左移动

在数组中应该是col-1

S——向下移动

在数组中应该是row+1

D——向右移动

在数组中应该是col+1


2、起点的地址是a[1][1],每次的移动,其实都是和空格进行一次互换。

3、如果碰到墙,则不能进行互换,但是为了游戏效果,不用输出任何文字。

全部代码实现如下:

#include <stdio.h>
char gameCommand();
void gameCommandExecute(int r,int c,char a[r][c]);
void printLabyrinth(int r,int c,char a[r][c]);

/**
 *  方向上下左右的指令。
 *
 *  @return 方向结果。
 */
char gameCommand(){
    char move;
    
    scanf("%c",&move);
    return move;
}
/**
 *  实现输入方向实现迷宫移动
 *
 *  @param r 迷宫的行数
 *  @param c 迷宫的列数
 *  @param a 迷宫的二维数组
 */
void gameCommandExecute(int r,int c,char a[r][c]){
    //定义迷宫的起始地址
    r=1;c=1;
    printf("please enter the move direction:\n");
    //O的位置以后就是a[r][c],while 循环结束的条件是a[r][c]=a[2][7].一旦达成了条件也就是走到了出口,便可以结束程序。
    while (a[r][c]!=a[2][7]) {
        char temp = ' ';
        char move = gameCommand();
        if (move == 'w') {
            //先验证向上走是不是墙,如果不是,变上下元素交换。
            if (a[r-1][c] != '*') {
                temp = a[r][c];
                a[r][c] = a[r-1][c];
                a[r-1][c] = temp;
                printLabyrinth(8, 8, a);
			  //r=r-1是为了明确定义,新的r的位置。
                r = r-1;
            }
        }
        if (move == 's') {
            if (a[r+1][c] != '*') {
                temp = a[r][c];
                a[r][c] = a[r+1][c];
                a[r+1][c] = temp;
                printLabyrinth(8, 8, a);
                r = r + 1;
            }
        }
        if (move == 'a') {
            if (a[r][c-1] != '*') {
                temp = a[r][c];
                a[r][c] = a[r][c-1];
                a[r][c-1] = temp;
                printLabyrinth(8, 8, a);
                c = c - 1;
            }
        }
        if (move == 'd') {
            if (a[r][c+1] != '*') {
                temp = a[r][c];
                a[r][c] = a[r][c+1];
                a[r][c+1] = temp;
                printLabyrinth(8, 8, a);
                c = c + 1;
            }
        }
    }
    printf("you win!\n");  
}
/**
 *  显示整个迷宫的地图
 *
 *  @param r 迷宫总行数
 *  @param c 迷宫总列数
 *  @param a 组建迷宫的每一个元素,由'*',' ','O'组成。
 */
void printLabyrinth(int r,int c,char a[r][c]){
    for (int i=0; i<r; i++) {
        for (int j=0; j<c; j++) {
            printf("%c\t",a[i][j]);
        }
        printf("\n");
    }
}

int main(){
    printf("游戏开始\n");
    printf("游戏说明:通过wasd来控制O进行上下左右的移动,到达出口E则获胜。\n");
    char a[8][8] = {
        {'*','*','*','*','*','*','*','*'},
        {'*','O',' ','*',' ',' ',' ','*'},
        {'*',' ','*',' ',' ','*',' ',' '},
        {'*',' ','*',' ','*','*','*','*'},
        {'*',' ','*',' ',' ',' ',' ','*'},
        {'*',' ','*','*','*','*',' ','*'},
        {'*',' ',' ',' ',' ',' ',' ','*'},
        {'*','*','*','*','*','*','*','*'},
    };
    printLabyrinth(8, 8, a);
    printf("游戏开始!\n");
    gameCommandExecute(8, 8, a);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值