| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1424 人关注过本帖, 1 人收藏
标题:想写个迷宫,出错啦,求教
只看楼主 加入收藏
missERR
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-31
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:15 
想写个迷宫,出错啦,求教
程序代码:
// helloworld.cpp : Defines the entry point for the console application.
//

#include"stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

#define Height 31
#define Width 25
#define Wall 1
#define Road 0
#define Start 2
#define End 3
#define Esc 5
#define Up 1
#define Down 2
#define Left 3
#define Right 4

int map[Height+2][Width+2];

void gotoxy(int x,int y)
{
    COORD coord;
    coord.X=x;
    coord.Y=y;
    SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
void hidden()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cci;
    GetConsoleCursorInfo(hOut,&cci);
    cci.bVisible=0;
    SetConsoleCursorInfo(hOut,&cci);
}
void create(int x,int y)
{
    int c[4][2]={0,1,1,0,0,-1,-1,0};
    int i,j,t;
    for(i=0;i<4;i++)
    {
        j=rand()%4;
        t=c[i][0];c[i][0]=c[j][0];c[j][0]=t;
        t=c[i][1];c[i][1]=c[j][1];c[j][1]=t;
    }
    map[x][y]=Road;
    for(i=0;i<4;i++)
        if(map[x+2*c[i][0]][y+2*c[i][1]]==Wall)
        {
            map[x+c[i][0]][y+c[i][1]]=Road;
            create(x+2*c[i][0],y+2*c[i][1]);
        }
}
int get_key()
{
    char c;
    while(c=getch())
    {
        if(c==27) return Esc;
        if(c!=-32) continue;
        c=getch();
        if(c==72) return Up;
        if(c==80) return Down;
        if(c==75) return Left;
        if(c==77) return Right;
    }
    return 0;
}
void paint(int x,int y)
{
    gotoxy(2*y-2,x-1);
    switch(map[x][y])
    {
        case Start:
            printf("");break;
        case End:
            printf("");break;
        case Wall:
            printf("");break;
        case Road:
            printf(" ");break;
    }
}
void game()
{
    int x=2,y=1;
    int c;
    while(1)
    {
        gotoxy(2*y-2,x-1);
        printf("");
        if(map[x][y]==End)
        {
            gotoxy(30,24);
            printf("到达终点,按任意键结束");
            getch();
            break;
        }
        c=get_key();
        if(c==Esc)
        {
            gotoxy(0,24);
            break;
        }
        switch(c)
        {
            case Up:
                if(map[x-1][y]!=Wall)
                {
                    paint(x,y);
                    x--;
                }
            break;
            case Down:
                if(map[x+1][y]!=Wall)
                {
                    paint(x,y);
                    x++;
                }
            break;
            case Left:
                if(map[x][y-1]!=Wall)
                {
                    paint(x,y);
                    y--;
                }
            break;
            case Right:
                if(map[x][y+1]!=Wall)
                {
                    paint(x,y);
                    y++;
                }
            break;
        }
    }
}
int main()
{
    int i,j;
    srand((unsigned)time(NULL));
    hidden();
    for(i=0;i<=Height+1;i++)
        for(j=0;j<=Width+1;j++)
            if(i==0||i==Height+1||j==0||j==Width+1)
                map[i][j]=Road;
            else map[i][j]=Wall;

    create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1));
    map[2][1]=Start;
    map[Height-1][Width]=End;
    for(i=1;i<=Height;i++)
        for(j=1;j<=Width;j++)
            paint(i,j);
    game();
    getch();
    return 0;
}


网上看到了SetConsoleCursorPosition函数,想试着自己写写,可我向左移动的时候就会有问题了   看图
图片附件: 游客没有浏览图片的权限,请 登录注册


怎么破?
2017-03-31 16:34
杰尼_杰尼
Rank: 1
等 级:新手上路
帖 子:1
专家分:4
注 册:2017-3-31
收藏
得分:4 
看起来很不错的样子。
2017-03-31 16:36
missERR
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-31
收藏
得分:0 
回复 2楼 杰尼_杰尼
其实很多都不是自己写的

求教啊,
2017-03-31 16:39
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:4 
Wall ,你都定义了这个宏啦。。。   

你迷宫布置的时候边界没有设定,就是把四条边设为 Wall    不然光标会跑出去的


多嘴一句,就你这代码,如果想布置一个n*m矩阵(n、m中有偶数)的迷宫,可以实现么?

三十年河东,三十年河西,莫欺少年穷!
2017-03-31 16:57
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:4 
自动设置路径不错,在main里加一句就没问题了,修改如下(红色部分代码为增加语句):
...
    create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1));
    map[2][1]=Start;
    map[2][0]=Wall;      //入口左边设为墙
    map[Height-1][Width]=End;
...
2017-03-31 17:12
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
先收藏~和e版的比较一下看看自己能学会什么~

想到自己还要自己写游戏就准备开始筹划了~

[此贴子已经被作者于2017-3-31 17:17编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-31 17:16
missERR
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-31
收藏
得分:0 
回复 4楼 韶志
程序代码:
for(i=0;i<=Height;i++)
    {
        map[i][0]=Wall; 
        map[i][Width]=Wall; 
    }

    for(j=0;j<=Width;j++)
    {
        map[0][j]=Wall; 
        map[Height][j]=Wall;
    }


这样设置了   OK啦  谢谢!~

我把高、宽设成偶数,然后,然后就把出口堵住了...
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-03-31 17:20
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 

#define Height 31
#define Width 25
修改为
#define Height 23
#define Width 31
必须为奇数
2017-03-31 17:21
missERR
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-31
收藏
得分:0 
回复 5楼 xzlxzlxzl
这样也可以
2017-03-31 17:21
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 7楼 missERR
摘取好的代码自己研究固然是好,可也要用点心吧

你所谓的OK啦  就是代码可以正常跑了,可你所做的修改很不严谨,只是恰巧在入口左边加上了一堵墙,所以不会出错了

注意   int map[Height+2][Width+2];   这才是整个矩阵   而你看到的仅仅是   map[1~Height][1~Width]

程序代码:
for(i=0;i<=Height+1;i++)
    {
        map[i][0]=Wall; 
        map[i][Width+1]=Wall; 
    }

    for(j=0;j<=Width+1;j++)
    {
        map[0][j]=Wall; 
        map[Height+1][j]=Wall;
    }


这样就在迷宫四边加上了你看不见的墙,这样不管你怎么设定入口   都不会出错了
收到的鲜花
  • missERR2017-04-01 10:33 送鲜花  3朵   附言:不会结贴,分数直接平均散了,加分加分

三十年河东,三十年河西,莫欺少年穷!
2017-03-31 17:30
快速回复:想写个迷宫,出错啦,求教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030338 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved