A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#include <stdio.h>
#include <stdlib.h>

#define Hang 12
#define Lie 11
/*
思路:
1,输出地图
用二维数组保存地图,好几个地方都会用到,用全局变量

2,用户输入

3,小人移动
        全局变量,保存小人的位置
*/

char arr[Hang][Lie] = {
        { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
        { '#', 'O', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
        { '#', ' ', '#', ' ', '#', '#', '#', '#', '#', ' ', '#' },
        { '#', ' ', '#', ' ', '#', '#', ' ', ' ', ' ', ' ', '#' },
        { '#', ' ', '#', ' ', '#', '#', ' ', '#', '#', '#', '#' },
        { '#', ' ', '#', ' ', '#', '#', ' ', ' ', ' ', ' ', '#' },
        { '#', ' ', '#', ' ', '#', '#', '#', '#', '#', ' ', '#' },
        { '#', ' ', '#', ' ', '#', '#', '#', '#', ' ', ' ', '#' },
        { '#', ' ', '#', ' ', '#', ' ', ' ', ' ', ' ', '#', '#' },
        { '#', ' ', '#', ' ', '#', ' ', '#', '#', '#', '#', '#' },
        { '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ' },
        { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }
};

//定义全局,来保存小人的位置
int person_x = 1;
int person_y = 1;

//终点坐标
int end_x = 10;
int end_y = 10;

//显示地图
void showMap(){
        for (int i = 0; i < Hang; i++){
                for (int j = 0; j < Lie; j++){
                        printf("%c ", arr[i][j]);
                }
                printf("\n");
        }
}

//用户输入
char Input(){
        char key = 'a';

        printf("请输入方向,w.上 s.下 a.左 d.右:");
        scanf("%c", &key);
        rewind(stdin);
        return key;
}

//小人移动
//上
void UP(){
        //根据现在小人的坐标,来判断小人下一个位置的坐标
        //再判断下一个坐标的,是路还是墙
        //向上移动,只是移动行坐标
        //定义下一个坐标,
        int next_x = person_x - 1;
        int next_y = person_y;

        //来判断下个位置是不是路
        if (arr[next_x][next_y] == ' '){
                //小人的位置变路,下个位置变小人
                arr[next_x][next_y] = 'O';
                arr[person_x][person_y] = ' ';

                //然后把现在小人的位置,在赋值给外面的全局变量
                person_x = next_x;
                person_y = next_y;
        }
}

//下
void DOWN(){
        //根据现在小人的坐标,来判断小人下一个位置的坐标
        //再判断下一个坐标的,是路还是墙
        //向上移动,只是移动行坐标
        //定义下一个坐标,
        int next_x = person_x + 1;
        int next_y = person_y;

        //来判断下个位置是不是路
        if (arr[next_x][next_y] == ' '){
                //小人的位置变路,下个位置变小人
                arr[next_x][next_y] = 'O';
                arr[person_x][person_y] = ' ';

                //然后把现在小人的位置,在赋值给外面的全局变量
                person_x = next_x;
                person_y = next_y;
        }
}

//左
void LEFT(){
        //根据现在小人的坐标,来判断小人下一个位置的坐标
        //再判断下一个坐标的,是路还是墙
        //向上移动,只是移动行坐标
        //定义下一个坐标,
        int next_x = person_x;
        int next_y = person_y - 1;

        //来判断下个位置是不是路
        if (arr[next_x][next_y] == ' '){
                //小人的位置变路,下个位置变小人
                arr[next_x][next_y] = 'O';
                arr[person_x][person_y] = ' ';

                //然后把现在小人的位置,在赋值给外面的全局变量
                person_x = next_x;
                person_y = next_y;
        }
}

//右
void RIGHT(){
        //根据现在小人的坐标,来判断小人下一个位置的坐标
        //再判断下一个坐标的,是路还是墙
        //向上移动,只是移动行坐标
        //定义下一个坐标,
        int next_x = person_x;
        int next_y = person_y + 1;

        //来判断下个位置是不是路
        if (arr[next_x][next_y] == ' '){
                //小人的位置变路,下个位置变小人
                arr[next_x][next_y] = 'O';
                arr[person_x][person_y] = ' ';

                //然后把现在小人的位置,在赋值给外面的全局变量
                person_x = next_x;
                person_y = next_y;
        }
}

int main(){

        //要想让地图刷新,死循环这几句
        while (1){

                system("clear");
                //输出地图
                showMap();
                //判断是否到重点
                if ('O' == arr[end_x][end_y]){
                        printf("游戏结束!\n");
                        return 0;
                }
                //用户输入
                char key = Input();

                //小人移动
                switch (key)
                {
                case 'w':
                case 'W':UP(); break;

                case 's':
                case 'S':DOWN(); break;

                case 'a':
                case 'A':LEFT(); break;

                case 'd':
                case 'D':RIGHT(); break;

                case 'q':
                case 'Q':printf("游戏结束!\n"); return 0; break;

                }
        }
        return 0;
}

8 个回复

倒序浏览
上下左右代码是一样的,只是换了一下行跟列
回复 使用道具 举报
看起来挺不错的.
回复 使用道具 举报
先马一下,回头有空再来看看!
回复 使用道具 举报
加油!你可以的
回复 使用道具 举报
有空试试,看起来挺好的
回复 使用道具 举报
好像还挺好玩的,试一试
回复 使用道具 举报
#include <stdio.h>
#define W '#'        //wall
#define R ' '        //road
#define M 'O'        //man
#define ROW 6
#define COL 6


int main(){
    char map[ROW][COL]={           //map[i][j]:    w---map[i-1][j]
        {W,W,W,W,W,W},             //              a---map[i][j-1]
        {W,M,W,W,R,R},             //              s---map[i+1][j]
        {W,R,W,W,R,W},             //              d---map[i][j+1]
        {W,R,R,W,R,W},
        {W,W,R,R,R,W},
        {W,W,W,W,W,W}
    };
    char direction;
    char ch;
    for (int i = 0; i<ROW; i++) {             // map print
        for (int j = 0; j<COL; j++) {
            printf("%c",map[i][j]);
        }
        printf("\n");
    }
    int m=1,n=1;
    while (m!=1 || n!=5) {
        printf("Please enter direction(w-Up,a-Left,s-Down,d-Right,q-Quit Game):\n");
        scanf("%c%c",&direction,&ch);
    if (direction=='w') {
        if (map[m-1][n]==W);
        else {
            char temp = map[m][n];
            map[m][n] = map[m-1][n];
            map[m-1][n] = temp;
            m=m-1;
        }
    }else if (direction=='a'){
        if (map[m][n-1]==W);
        else {
            char temp = map[m][n];
            map[m][n] = map[m][n-1];
            map[m][n-1] = temp;
            n=n-1;
        }
    }else if (direction=='s'){
        if (map[m+1][n]==W);
        else {
            char temp = map[m][n];
            map[m][n] = map[m+1][n];
            map[m+1][n] = temp;
            m=m+1;
        }
    }else if (direction=='d'){
        if (map[m][n+1]==W);
        else {
            char temp = map[m][n];
            map[m][n] = map[m][n+1];
            map[m][n+1] = temp;
            n=n+1;
        }
    }
    else if(direction == 'q'){
        printf("Now quit...\n");
        return 0;
    }
        for (int i = 0; i<6; i++) {             // map print
            for (int j = 0; j<6; j++) {
                printf("%c",map[i][j]);
            }
            printf("\n");
        }
   
    }
    printf("Congratulations! You win!\n");
    return 0;
}



哈哈,我自学的时候也写了一个。
地图是COPY视频里的,吸收字符也是后来看了视频的才知道。话说自己想了半天也不知道有吸收字符这么回事儿~!
本人比较懒,用了好几个宏定义~
代码比较乱,算是自己写的草稿本吧~!
回复 使用道具 举报
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马