In một mê cung ngẫu nhiên


19

Viết chương trình tạo và in một mê cung ngẫu nhiên bằng thuật toán bạn chọn. Mê cung nên khác nhau cho nhiều lần chạy chương trình. Chiều cao và chiều rộng được đưa ra dưới dạng đối số dòng lệnh. Sử dụng |cho tường dọc, -cho tường ngang và +cho góc. Mê cung được giới hạn bởi các bức tường và lối vào được đánh dấu bằng bức tường bị mất. Mê cung chứa một kho báu #phải có thể tiếp cận từ ít nhất một lối vào.

$ python2 random-maze.py 4 5
+-+-+
  |#|
|   |
+---+

+1 câu hỏi tuyệt vời. Một vài điểm mặc dù. 1: Lối ra được đánh dấu như thế nào? Đây có phải là một biểu tượng như *hoặc có hai lối vào riêng biệt? 2: Bạn có thể nên xác định rằng lối ra phải có thể truy cập.
snmcdonald

1
@snmcdonald: hãy làm cho nó vui vẻ và thêm một kho báu :).
Alexandru

2
Tôi có thể thấy một môn đánh gôn tiếp theo, về việc giải quyết chúng ... :)
st0le

@ st0le: Tôi đã có một số ý tưởng. Gửi thư cho tôi nếu bạn muốn thảo luận.
Alexandru

1
Các loại câu đố là không xác định ở đây. Tôi thấy rằng mọi người đã trả lời nó như thể đó là một [môn đánh gôn]. Đó có phải là ý định? Nếu vậy, xin vui lòng gắn thẻ như vậy?
dmckee

Câu trả lời:


5

Tôi nghĩ về mặt kỹ thuật này không phải là một trình tạo mê cung, nhưng nó tạo ra một kết quả như mê cung: https://gist.github.com/803450 .

Một số mã khủng khiếp trong đó tôi biết, và nó chỉ hoạt động ít hơn một nửa thời gian, và kết quả không hoàn toàn đúng với những bức tường nhô ra khỏi những bức tường khác. Nhưng nó đủ gần để tôi không thể bận tâm sửa phần còn lại.

Một số ví dụ đầu ra:

→ ruby random-maze.rb 30 30
+----+-+-----------++-+----+
|    + |           ++ |    |
++  +  | ++ ++   +    + ++ ++
|  ++ ++ |  |    +---+  +   |
| +      | +| +   +++  +  + |
|   +   +| +| +-+  |   + +  |
|        +  +    + + ++  |+ |
| + ++ +  ++   + |  +   ++| |
| |  | ++  + +----+ + +-+ | |
| +  |  +-+  |+        |  | |
|   +-+  +| ++  ++ + + |  | |
| ++   +  + |  ++|   + | ++ |
|  + + + +  +---++-+   +++  |
| +  |  +| +    |  ++   |   |
| | +++ +| + ++ +--+  + |---+
|#+ | |  |   +++     +  +   |
++  | ++ +-+  ++ +--+  +  + |
|  ++  |    +     ++| +  ++ |
| ++   +--------+  +| + +   |
| |     |      +++  |  +  +-+
| |     | +--+  |++ |+ | ++
| |     |  +--+ | | || |  |
| |     +-+     +-+ |+ |+ |
| | +---+   ++      +  |  |
| +-|     +    +      ++ ++
|   +       ++   +---+   |
|              ++   +  +-+
|                 +   ++
+-+ +-------------+---+

1
Ý kiến ​​hay. Thêm điểm nếu bạn sửa nó;)
Alexandru

Đây chỉ là một sự thay đổi nhanh chóng và thay đổi đầu ra cho một thuật toán mà tôi đã sử dụng để tạo ra một mê cung cho một trong những bài tập uni của tôi . Thuật toán thực tế chủ yếu bị đánh cắp từ một bài đăng trên blog của CHEVYRAY . Tôi có thể đi xung quanh để sửa nó vào cuối tuần này, tôi không chắc liệu định dạng đầu ra có hoàn toàn hoạt động hay không vì nó không phải là một mê cung thực sự, nhưng tôi sẽ thử và lấy nó càng gần càng tốt trong khi nhìn tốt.
Nemo157

Có vẻ như một mê cung rất tốt với tôi.
Alexandru

8

Con trăn, 375 ký tự

import random,sys
H,V=map(int,sys.argv[1:])
H-=1
V-=1
b,h,v,p=' -|+'
M=H/2*h
n=random.randint(1,(H/2)*(V/2-1))
for i in range(V/2):
 e=s=t='';N=v
 for j in range(H/2):
  if i and(random.randint(0,1)or j==0):s+=N+b;t+=v;N=v;M=M[1:]+p
  else:s+=M[0]+h;t+=b;N=p;M=M[1:]+h
  n-=1;t+=' #'[n==0]
 if H&1:s+=s[-1];t+=b;e=h
 print s+N+'\n'+t+v
if V&1:print t+v
print h.join(M)+e+h+p

Điều này tạo ra một mê cung với một lối vào và một kho báu được đặt ngẫu nhiên. Mê cung là một mê cung cây nhị phân đơn giản .

$ ./maze.py 15 15
--------------+
              |
| | ----------+
| |           |
| +-----+ | --+
|       | |   |
| --+ --+ +---+
|   |   |     |
| --+-+ +---+ |
|     |     | |
| --+ +-+ --+ |
|   |   |   |#|
| | | --+ --+-+
| | |   |     |
+-+-+---+-----+

Có thể nó đã được dự định, nhưng hàng trên cùng (ngay dưới tường) luôn là một hành lang dài.
Alexandru

Vâng, và cột ngoài cùng bên trái luôn luôn là một hành lang dài. Đây là một thuộc tính của loại mê cung mà tôi đang tạo ra.
Keith Randall

Oh. Các mê cung rất đẹp mặc dù :).
Alexandru

6

Ruby 1.9.2p136: 90

eval ARGV[0]
z=[l="+"+"-"*@w+"+"]
@h.times{z<<"|"+" "*@w+"|"}
z[rand(@h)+1]="|#"
puts z<<l

Đầu ra

$> ruby maze.rb "@h=8;@w=8;"

+------+
|      |
|      |
|      |
|      |
|#
|      |
+------+

Này, không ai nói nó phải là một mê cung tốt . OK, OK, tôi sẽ làm một cái thật ngay bây giờ.


Tốt, nhưng đảm bảo rằng nó tôn trọng giao thức (chiều cao và chiều rộng từ dòng lệnh, mê cung được in đến thiết bị xuất chuẩn).
Alexandru

Trên thực tế, nó không nói bất cứ điều gì về thiết bị xuất chuẩn (đó cũng không phải là một quy định hợp lý bởi vì ai đó có thể đang sử dụng ngôn ngữ không in ra thiết bị xuất chuẩn) và người ta thường chấp nhận rằng đầu vào là một chức năng / phương thức. Đối với người bỏ phiếu này, nó giải quyết vấn đề theo quy định, vì vậy đừng ghét mazer ghét mê cung.

Không thực sự miễn là nó được chỉ định trong câu hỏi. Xem meta.codegolf.stackexchange.com/questions/13/ . Hơn nữa, không giống như JavaScript Ruby hỗ trợ đọc và ghi đối số cho đầu ra tiêu chuẩn. Giải pháp của bạn là gian lận so với những người khác đã giải quyết vấn đề đúng cách.
Alexandru

Không thể chỉnh sửa. Tôi có nghĩa là 'không đầy đủ' không 'gian lận'. Tôi thích ý tưởng của mê cung.
Alexandru

Sau đó, các ngôn ngữ khác phải bao gồm mã cần thiết để gọi chúng hoặc bao gồm #!/usr/bin/env python, ví dụ, trong mã của chúng. Như tôi đã nói tôi cũng sẽ viết một giải pháp thực sự, đây chỉ là chỉ ra chất lượng kém của câu hỏi (và nhiều câu hỏi khác) và chứng tỏ chúng ta cần có hướng dẫn tốt hơn. Và cuối cùng chỉ vào một câu hỏi không đưa ra câu trả lời cho câu hỏi các quy tắc thực tế cho trang web. Nhưng tốt thôi, đây là phiên bản mới của bạn ...

3

C 844

#include <stdlib.h>
#include <time.h>
h,w,*m,y,x,z;d(t,b,l,r){int i=b-t,j=r-l;if(i>1&&j>1){i=(rand()%--i)|1;j=(rand()%--j)|1;z=rand()%4;x=rand()%i+t;x|=1;for(y=t;y<i+t;y++)if(y!=x||!z)m[y*w+j+l]=124;x=rand()%(b-i-t)+i+t;x|=1;for(y=t+i;y<b+1;y++)if(y!=x||!(z-1))m[y*w+j+l]=124;y=rand()%j+l;y|=1;for(x=l;x<j+l;x++)if(y!=x||!(z-2))m[(i+t)*w+x]=45;y=rand()%(r-j-l)+j+l;y|=1;for(x=l+j;x<r+1;x++)if(y!=x||!(z-3))m[(i+t)*w+x]=45;m[(i+t)*w+j+l]=43;m[(t-1)*w+l+j]=43;m[(b+1)*w+j+l]=43;m[(i+t)*w+l-1]=43;m[(i+t)*w+r+1]=43;d(t,t+i-1,l,l+j-1);d(t+i+1,b,l,l+j-1);d(t,t+i-1,l+j+1,r);d(t+i+1,b,l+j+1,r);}}main(int c,char**v){h=atoi(v[1]),w=atoi(v[2]),m=calloc(h*w,4);srand(time(0));while(y<h){while(x<w){m[y*h+x]=(!y||y==h-1)?(!x||x==w-1)?43:45:(!x||x==w-1)?124:32;x++;}y++;x=0;}d(1,h-2,1,w-2);z=rand()%(w-2);z|=1;m[z]=32;z=rand()%(w-2);z|=1;m[h*(w-2)+z]=35;}

Để kiểm tra:

#include <stdio.h>//beginning
for(y=0;y<h;y++){for(x=0;x<w;x++){putchar(m[y*h+x]);}putchar('\n');}getchar();//end

3x3

+ +
| # |
+ - +

7x8

+ - + - - +
| |
+ + - + - +
| |
| + - + - +
| | # |
+ - + - + - +

18x20

+ - + - + + --- + --- + - + - +
| | | | |
| + + + - + --- + + - +
| | | |
+ + + - + --- + - + - + - +
| | | |
+ - + + - + - + - + --- + - + - +
| | | | | |
| + + + + - + - - + |
| | | | |
| | | + - + - + ---- + |
| | | | |
+ + + - + - + - + - - + - +
| | | | |
| + + - + - + - - + |
| | | | |
| | | | # | | |
+ - + - + - + --- + ----- + - +

Đây là một thử thách mã , không phải là một mã golf . Tại sao mã hầu như không đọc được?
Braden hay nhất

-1. Mã này không chỉ bị xáo trộn mà còn không có hướng dẫn rõ ràng về cách biên dịch mã này và cách thực hiện hai khối mã. Hướng dẫn sử dụng là thưa thớt, nếu không hoàn toàn thiếu. Rõ ràng là câu trả lời của bạn là một môn đánh gôn. Nhưng câu hỏi không phải là . Vì vậy, mã phải dễ đọc và khép kín để dễ dàng sao chép / dán / biên dịch, để người khác có thể xác minh rằng nó thực sự hoạt động mà không cần phải giải mã cách bạn làm cho mã hoạt động ngay từ đầu.
Braden hay nhất

0

Đây là một giải pháp java đơn giản:

import java.util.*;

public class MazeGen {
    public static void main(String[]a){
        int w,l;
        Random rand=new Random(System.currentTimeMillis()%1000+System.nanoTime());
        if(a.length==2){
            w=Integer.parseInt(a[0]);
            l=Integer.parseInt(a[1]);
        }else{
            System.out.println("No command line arguments, taking from STDIN.");
            Scanner input=new Scanner(System.in);
            w=input.nextInt();
            l=input.nextInt();
            input.close();
        }
        char[][]maze=new char[w][l];
        for(int x=0;x<w;x++){
            for(int y=0;y<l;y++){
                maze[x][y]=' ';
            }
        }
        for(int x=0;x<w;x++){
            maze[x][0]=maze[x][l-1]='|';
        }
        for(int y=0;y<l;y++){
            maze[0][y]=maze[w-1][y]='-';
        }
        maze[0][0]=maze[w-1][0]=maze[w-1][l-1]=maze[0][l-1]='+';
        int dor=1+rand.nextInt(l-2);
        maze[0][dor]=' ';
        int tx=2+rand.nextInt(w-3),ty=1+rand.nextInt(l-2);
        maze[tx][ty]='#';
        if(ty<dor-1){
            maze[tx][ty+1]='|';
            if(tx==w-2){
                maze[tx+1][ty+1]='+';
            }
            if(tx==1){
                maze[0][ty+1]='+';
            }
        }
        if(ty>dor+1){
            maze[tx][ty-1]='|';
            if(tx==w-2){
                maze[tx+1][ty-1]='+';
            }
            if(tx==1){
                maze[0][ty-1]='+';
            }
        }
        if(ty==dor&&tx>3&&(maze[tx][ty+1]==' '||maze[tx][ty-1]==' ')){
            maze[tx-1][ty]='-';
        }
        if(dor>5){
            int z=2+rand.nextInt(dor-3);
            int q=1+rand.nextInt(w-3);
            for(int i=0;i<w;i++){
                if(i==0||i==w-1){
                    maze[i][z]='+';
                }else if(i!=q&&maze[i][z]==' '){
                    maze[i][z]='|';
                }
            }

        }
        if(l-dor>5){
            int z=dor+2+rand.nextInt(l-dor-3);
            int q=1+rand.nextInt(w-3);
            for(int i=0;i<w;i++){
                if(i==0||i==w-1){
                    maze[i][z]='+';
                }else if(i!=q&&maze[i][z]==' '){
                    maze[i][z]='|';
                }
            }

        }
        for(char[]row:maze){
            System.out.println(row);
        }
    }
}

Một số kết quả mẫu:

3x3:

+ +
|#|
+-+

4 x 4:

+ -+
| #|
|  |
+--+

4x5:

+-+ +
|#| |
|   |
+---+

5x5:

+ --+
|   |
|   |
| |#|
+-+-+

5x8:

+ --+--+
|   |  |
|      |
| # |  |
+---+--+

8h15:

+---- ----+---+
|         |   |
|         |   |
|         |   |
|             |
| #|      |   |
|         |   |
+---------+---+
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.