黑马程序员技术交流社区

标题: 字符串迷宫小游戏~自己写的,游戏难度提升了一点~附源代码 [打印本页]

作者: hugin    时间: 2016-9-10 18:39
标题: 字符串迷宫小游戏~自己写的,游戏难度提升了一点~附源代码
#include <stdio.h>
#include <stdlib.h>

#define LINE 30//地图的行
#define COLUMN 30//地图的列

#define ENDLINE 29//终点y坐标
#define ENDCOLUMN 28//终点x坐标

char gameMap[LINE][COLUMN] =
{
    {'*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
    {'*','0','*',' ',' ',' ','*','*',' ',' ',' ','*',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' ','*','*',' ','*'},
    {'*',' ','*',' ','*',' ','*',' ',' ','*',' ',' ',' ','*',' ','*','*','*',' ',' ',' ',' ','*',' ','*',' ',' ',' ',' ','*'},
    {'*',' ','*',' ','*',' ','*',' ','*','*',' ','*','*',' ','*','*',' ',' ','*','*',' ',' ','*','*','*',' ','*','*','*','*'},
    {'*',' ',' ',' ','*',' ',' ',' ','*',' ','*',' ','*',' ','*',' ','*',' ',' ',' ','*','*','*',' ',' ',' ',' ',' ','*','*'},
    {'*','*','*','*','*','*','*','*','*',' ',' ',' ',' ',' ','*',' ','*','*','*','*','*',' ','*',' ','*','*','*',' ','*','*'},
    {'*',' ',' ',' ',' ',' ','*',' ','*','*','*',' ','*','*',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*','*','*'},
    {'*','*','*',' ','*',' ','*',' ','*',' ','*',' ','*',' ','*','*',' ','*','*',' ','*','*','*','*','*',' ','*',' ',' ','*'},
    {'*',' ','*','*','*','*',' ','*',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' ','*',' ','*',' ','*','*'},
    {'*',' ',' ',' ','*',' ',' ',' ',' ','*','*',' ','*','*',' ',' ','*','*','*',' ','*','*',' ','*',' ',' ','*',' ','*','*'},
    {'*',' ','*',' ',' ',' ','*',' ','*',' ',' ',' ',' ',' ','*','*',' ',' ',' ','*',' ',' ',' ',' ',' ','*','*',' ',' ','*'},
    {'*','*','*','*',' ','*',' ',' ','*',' ','*','*',' ','*',' ','*','*','*','*',' ',' ','*','*','*',' ','*','*','*',' ','*'},
    {'*',' ',' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ',' ','*',' ',' ','*',' ','*'},
    {'*','*',' ','*','*','*','*',' ',' ','*',' ','*','*',' ','*','*',' ','*',' ','*',' ','*','*',' ','*','*',' ','*',' ','*'},
    {'*',' ',' ',' ',' ',' ','*','*','*','*',' ',' ',' ',' ','*','*',' ','*',' ','*','*',' ',' ','*','*',' ',' ',' ',' ','*'},
    {'*','*','*','*','*',' ',' ',' ',' ',' ','*',' ','*',' ',' ',' ',' ','*',' ','*',' ',' ','*',' ','*',' ','*','*','*','*'},
    {'*',' ',' ',' ','*',' ','*',' ','*','*',' ',' ',' ','*',' ','*','*','*',' ','*',' ','*','*',' ','*',' ','*',' ',' ','*'},
    {'*',' ','*',' ','*',' ','*',' ',' ','*',' ','*','*','*',' ','*',' ',' ','*','*','*',' ',' ','*',' ','*',' ','*',' ','*'},
    {'*',' ','*',' ',' ',' ',' ',' ',' ',' ','*','*',' ','*',' ',' ',' ',' ','*',' ',' ',' ','*',' ',' ','*',' ','*',' ','*'},
    {'*',' ',' ','*','*','*','*',' ','*',' ',' ',' ',' ',' ',' ','*','*','*',' ',' ','*','*',' ','*',' ','*',' ','*',' ','*'},
    {'*','*','*',' ',' ',' ','*','*',' ',' ','*','*','*',' ','*','*',' ',' ',' ','*',' ',' ','*',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ','*',' ','*',' ',' ',' ','*',' ',' ','*',' ',' ','*',' ','*','*','*',' ','*',' ','*','*','*','*','*',' ','*'},
    {'*',' ','*',' ',' ',' ',' ','*',' ',' ',' ',' ',' ','*',' ',' ',' ','*',' ',' ',' ',' ','*',' ',' ',' ',' ',' ',' ','*'},
    {'*',' ',' ',' ',' ','*','*',' ','*','*','*',' ',' ',' ','*','*','*','*','*','*','*',' ',' ','*','*',' ','*','*',' ','*'},
    {'*',' ',' ','*','*','*','*',' ',' ',' ',' ','*','*',' ',' ',' ',' ',' ','*','*',' ',' ','*','*','*',' ',' ',' ','*','*'},
    {'*',' ','*',' ',' ',' ',' ',' ','*','*',' ',' ','*','*','*','*','*',' ',' ','*',' ',' ',' ',' ',' ',' ','*','*','*','*'},
    {'*',' ',' ',' ','*',' ','*',' ',' ',' ','*',' ',' ',' ',' ',' ','*','*','*',' ','*','*',' ','*',' ',' ',' ',' ',' ','*'},
    {'*',' ','*',' ','*','*',' ','*',' ','*','*',' ','*','*','*',' ','*',' ','*',' ',' ',' ','*','*','*','*',' ','*',' ','*'},
    {'*','*',' ',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' ',' ','*',' ','*'},
    {'*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*',' ','*'}
};
//小人当前在地图上的行坐标
int persenCurrentLine = 1;
//小人当前在地图上的列坐标.
int personCurrentColumn =1;
/**
*  打印游戏地图
*/
void showgameMap();

/**
*  接收小人的前进方向
*
*  @return 小人的前进方向
*/
char receivingDirection();

/**
*  使小人向上移动
*/
void personMoveUp();

/**
*  使小人向下移动
*/
void personMoveDown();

/**
*  使小人向左移动
*/
void personMoveLeft();

/**
*  使小人向右移动
*/
void personMoveRight();





作者: hugin    时间: 2016-9-10 18:40
int main()
{
    while (1) {
        
        system("clear");//清空终端,好像没什么用
        
        showgameMap();//打印游戏
        
        if(persenCurrentLine == ENDLINE && personCurrentColumn == ENDCOLUMN){//是否通关
            printf("=======恭喜你通关成功=======\n");
            break;
        }
        else
        {
            switch (receivingDirection()) {//接收小人的前进方向并判断方向
                    
                case 'w':
                case 'W':
                    personMoveUp();//使小人向上移动
                    break;
                    
                case 's':
                case 'S':
                    personMoveDown();//使小人向下移动
                    break;
                    
                case 'a':
                case 'A':
                    personMoveLeft();//使小人向左移动
                    break;
                    
                case 'd':
                case 'D':
                    personMoveRight();//使小人向右移动
                    break;
                    
                case 'q':
                case 'Q':
                    printf("=======真菜!!!=======\n");
                    return 0;//退出游戏
                    
            }
        }
    }
    return 0;
}

void showgameMap()// 打印游戏地图
{
    for (int i = 0;i < LINE;i++)
    {
        for (int j = 0;j < COLUMN;j++)
        {
            printf("%c ",gameMap[i][j]);
        }
        printf("\n");
    }
}

char receivingDirection()//接收小人的前进方向
{
    printf("请输入小人的前进方向 'w'向上移动,'s'向下移动,'a'向左移动,'d'向右移动,'q'退出游戏:\n");
   
    return getchar();//接收小人的前进方向并返回给调用者
}

void personMoveUp()//使小人向上移动
{
    if (gameMap[persenCurrentLine-1][personCurrentColumn] == ' ') {//小人的下一步是路进入
        gameMap[persenCurrentLine][personCurrentColumn] = ' ';//使小人的当前坐标变成路(空格)
        gameMap[persenCurrentLine-1][personCurrentColumn] = '0';//使小人的下一步坐标变成0(小人)
        persenCurrentLine -= 1;
    }
}

void personMoveDown()//使小人向下移动
{
    if (gameMap[persenCurrentLine+1][personCurrentColumn] == ' ') {//小人的下一步是路进入
        gameMap[persenCurrentLine][personCurrentColumn] = ' ';//使小人的当前坐标变成路(空格)
        gameMap[persenCurrentLine+1][personCurrentColumn] = '0';//使小人的下一步坐标变成0(小人)
        persenCurrentLine += 1;
    }
}

void personMoveLeft()//使小人向左移动
{
    if (gameMap[persenCurrentLine][personCurrentColumn-1] == ' ') {//小人的下一步是路进入
        gameMap[persenCurrentLine][personCurrentColumn] = ' ';//使小人的当前坐标变成路(空格)
        gameMap[persenCurrentLine][personCurrentColumn-1] = '0';//使小人的下一步坐标变成0(小人)
        personCurrentColumn -= 1;
    }
}

void personMoveRight()//使小人向右移动
{
    if (gameMap[persenCurrentLine][personCurrentColumn+1] == ' ') {//小人的下一步是路进入
        gameMap[persenCurrentLine][personCurrentColumn] = ' ';//使小人的当前坐标变成路(空格
        gameMap[persenCurrentLine][personCurrentColumn+1] = '0';//使小人的下一步坐标变成0(小人)
        personCurrentColumn += 1;
    }
}
作者: hugin    时间: 2016-9-10 18:44
main.c.zip (1.83 KB, 下载次数: 71)
这个是源代码 main.c 文件

作者: 小海盗。    时间: 2016-9-11 01:24
可以 谢谢分享了,我前一阵子刚学完二维数组的时候,也写了一个,自己又加了一个迷雾的功能.
作者: hugin    时间: 2016-9-11 08:39
小海盗。 发表于 2016-9-11 01:24
可以 谢谢分享了,我前一阵子刚学完二维数组的时候,也写了一个,自己又加了一个迷雾的功能. ...

分享一下
作者: 小海盗。    时间: 2016-9-11 23:45
[C] 纯文本查看 复制代码

//
//  main.c
//  08-迷宫游戏------更新版
//
//  Created by Guogh on 16/9/2.
//  Copyright © 2016年 **. All rights reserved.
//



#include <stdio.h>
#include <stdlib.h>
#pragma mark 定义地图长和宽
#define ROW 20
#define COL 20
#define KJD 4//地图可见度
//#define ROAD ' '
/**
*  绘制地图
*/
#pragma  mark 绘制地图实现
void print_map(char map[ROW][COL]);

/**
*  绘制迷雾地图
*/
void print_map1(char map[ROW][COL],int mapStartX,int mapStartY,int mapEndX,int mapEndY );



/**
*  小人移动
*/
void Move(char map[ROW][COL],int oldX,int oldY,int newX,int newY);
/**
*  处理地图迷雾
*
*
*/
void chuLiMap(int currentX,int currentY, int *mapStartX,int *mapStartY,int *mapEndX,int *mapEndY);

int main(int argc, const char * argv[]) {
   
    //定义地图
    char map[ROW][COL] = {
        {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
        {'#','0',' ',' ','#',' ',' ',' ','#','#',' ',' ',' ','#',' ','#',' ',' ',' ','#'},
        {'#',' ','#',' ',' ',' ','#','#','#','#',' ','#',' ','#',' ',' ',' ','#',' ','#'},
        {'#',' ','#',' ','#',' ','#',' ','#','#',' ','#',' ','#',' ','#','#',' ',' ','#'},
        {'#',' ','#',' ','#',' ','#',' ',' ','#',' ','#',' ','#',' ','#',' ',' ','#','#'},
        {'#',' ','#',' ','#',' ','#','#',' ',' ',' ','#',' ','#',' ',' ','#',' ','#','#'},
        {'#',' ',' ',' ','#',' ',' ',' ','#','#','#','#','#',' ','#',' ','#',' ',' ','#'},
        {'#','#','#','#','#','#','#',' ','#','#','#','#','#',' ','#',' ',' ','#',' ',' '},
        {'#',' ',' ',' ','#',' ',' ',' ','#',' ',' ',' ','#',' ','#','#',' ',' ','#','#'},
        {'#',' ',' ',' ',' ',' ',' ','#','#',' ','#',' ','#',' ','#',' ','#',' ','#','#'},
        {'#','#','#','#','#','#',' ','#','#',' ','#',' ','#',' ','#',' ','#',' ','#','#'},
        {'#',' ',' ',' ','#',' ',' ',' ','#',' ','#',' ','#',' ','#',' ','#',' ','#','#'},
        {'#',' ','#',' ','#',' ','#','#',' ',' ',' ',' ','#',' ','#',' ','#',' ','#','#'},
        {'#',' ','#',' ','#',' ','#','#',' ','#','#',' ','#',' ',' ',' ','#',' ','#','#'},
        {'#',' ','#',' ',' ',' ','#','#',' ','#','#',' ','#',' ','#',' ','#',' ',' ','#'},
        {'#',' ','#',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#',' ',' ','#',' ','#'},
        {'#',' ','#',' ','#',' ',' ','#',' ','#',' ','#','#',' ','#','#',' ','#',' ','#'},
        {'#',' ','#','#','#','#','#','#',' ','#',' ','#','#',' ','#','#',' ','#',' ','#'},
        {'#',' ',' ',' ',' ',' ',' ',' ',' ','#',' ',' ',' ',' ',' ','#',' ',' ',' ','#'},
        {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
    };
    //0代表小人,定义小人所在下标
    /**
     *  往下代表x+1,往右代表y+1
     */
    int currentX = 1,currentY = 1;
    //地图迷雾  可见地图范围
    int mapStartX = 0;
    int mapStartY = 0;
    int mapEndX = 0;
    int mapEndY = 0;
    //
    //NULL;
    int currentMap = 0;
    //计算地图可见范围
    chuLiMap(currentX,currentY, &mapStartX, &mapStartY, &mapEndX, &mapEndY);
   
    //绘制地图
    //printf("%c\n",map[0][0]);
    //    for (int i = 0; i < ROW; i++) {
    //        puts(map);
    //    }
    print_map1(map, mapStartX, mapStartY, mapEndX, mapEndY);
   
   // print_map(map);
    //提示用户开始游戏
    printf("请控制小人移动: a.A左  s.S下  d.D右  w.W上\n");
    char user;
    char road = ' ';
    //循环控制
    while (1) {
        rewind(stdin);
        scanf("%c",&user);
        switch (user) {
            case 'a':
            case 'A':
                if (map[currentX][currentY-1] == road){
                    Move(map,currentX,currentY,currentX,currentY-1);
                    currentY -= 1;
                }
                break;
            case 'd':
            case 'D':
                if (map[currentX][currentY+1] == road){
                    Move(map,currentX,currentY,currentX,currentY+1);
                    currentY += 1;
                }
                break;
            case 'w':
            case 'W':
                if (map[currentX-1][currentY] == road){
                    Move(map,currentX,currentY,currentX-1,currentY);
                    currentX -= 1;
                }
                break;
            case 's':
            case 'S':
                if (map[currentX+1][currentY] == road){
                    Move(map,currentX,currentY,currentX+1,currentY);
                    currentX += 1;
                }
                break;
            case 'q':
            case 'Q':
                //Move(map[ROW][COL],currentX,currentY,currentX,currentY-1);
                return 0;
                break;
            default:
                break;
        }
        //清空控制台
        system("clear");
        //处理地图迷雾
        if (currentMap == 2) {
            chuLiMap(currentX,currentY, &mapStartX, &mapStartY, &mapEndX, &mapEndY);
            currentMap = 0;
        }
        //chuLiMap(currentX,currentY, &mapStartX, &mapStartY, &mapEndX, &mapEndY);
        
        //重新绘制地图
        print_map1(map, mapStartX, mapStartY, mapEndX, mapEndY);
        currentMap++;
        //print_map(map);
        printf("\n");
        //判断胜利
        if (currentY == COL - 1) {
            printf("恭喜你游戏胜利!\n");
            break;
        }
        
    }
   
   
   
   
    return 0;
}
/**
*  绘制地图
*/
void print_map(char map[ROW][COL]){
    for (int i =0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            printf("%c",map[j]);
        }
        printf("\n");
    }
}

/**
*  小人移动
*/
void Move(char map[ROW][COL],int oldX,int oldY,int newX,int newY){
    //if (map[newX][newY] == ' ') {
    char temp = map[newX][newY];
    map[newX][newY] = map[oldX][oldY];
    map[oldX][oldY] = temp;
   
    //}
}
/**
*  处理地图迷雾
*
*
*/
//void chuLiMap(int currentX,int currentY,int *mapStartX,int *mapStartY,int *mapEndX,int *mapEndY){
//    if (currentX - *mapStartX <= KJD) {
//        *mapStartX = 0;
//        *mapEndX = KJD * 2;
//    }else if(*mapEndX - currentX <= KJD){
//        *mapStartX = currentX - KJD;
//        *mapEndX = COL;
//    }else{
//        *mapStartX = currentX - KJD;
//        *mapEndX = currentX + KJD;
//    }
//    if (currentY - *mapStartY <= KJD) {
//        *mapStartY = 0;
//        *mapEndY = KJD * 2;
//    }else if(*mapEndY - currentY <= KJD){
//        *mapStartY = currentY - KJD;
//        *mapEndY = COL;
//    }else{
//        *mapStartY = currentY - KJD;
//        *mapEndY = currentY + KJD;
//    }
//
//}
void chuLiMap(int currentX,int currentY,int *mapStartX,int *mapStartY,int *mapEndX,int *mapEndY){

    *mapStartX = currentX - KJD;
    *mapEndX = currentX + KJD;
   
    *mapStartY = currentY - KJD;
    *mapEndY = currentY + KJD;
    if (*mapStartX < 0) {
        *mapStartX = 0;
        *mapEndX = KJD * 2;
    }
    //处理数组越界时
    if (*mapEndX > ROW) {
        *mapEndX = ROW;
        *mapStartX = ROW - KJD * 2;
    }
    if (*mapStartY < 0) {
        *mapStartY = 0;
        *mapEndY = KJD * 2;
    }
    if (*mapEndY > COL) {
        *mapEndY = COL;
        *mapStartY = COL - KJD * 2;
    }

}

/**
*  绘制迷雾地图
*/
void print_map1(char map[ROW][COL],int mapStartX,int mapStartY,int mapEndX,int mapEndY ){
   
    for (int i = mapStartX; i < mapEndX; i++) {
        if (i == mapStartX) printf("============\n");
        printf("||");
        for (int j = mapStartY; j < mapEndY; j++) {
            printf("%c",map[j]);
        }
        printf("||\n");
        if (i == mapEndX - 1) printf("============\n");
    }
}

懒得修改整理 凑和这看吧 ....


作者: 足球骑士szw    时间: 2016-9-16 22:48
....新人还看不懂,先收藏再说
作者: hugin    时间: 2016-9-16 23:49
足球骑士szw 发表于 2016-9-16 22:48
....新人还看不懂,先收藏再说

6666666666666666
作者: day2up    时间: 2016-9-16 23:54
大神求carry呀
作者: Mr.Canon    时间: 2016-9-16 23:56
迷雾是什么?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2