質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

2回答

830閲覧

迷路を作ろうとしているのですが...

yeiyei

総合スコア4

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2020/03/06 16:51

前提・実現したいこと

迷路

実は教科書でProcessingの勉強をしているのですが、今rを一度押すとマスが2マスずつ増えていくという機能をつけようとしているのですが、なぜか1度押すと同時に何回か増えてしまいます。教科書では1度押すごとに1回ずつです。(すいません、説明苦手で)

発生している問題・エラーメッセージ

なし ### 該当のソースコード ```ここに言語名を入力 Processing ソースコード int boardX; int boardY; int roadW; int [][]roadMap; int pieceX; int pieceY; boolean isPlaying; boolean isGoal; float pieceSize; int playTime; int [] dirX={1,0,-1,0}; int [] dirY={0,1,0,-1}; void setup(){ size(800,600); makeBoard(13,9,46); initMaze(); } void draw(){ drawMaze(); drawPiece(); if(isPlaying||isGoal){ drawInfo(); } checkFinish(); } void makeBoard(int x,int y,int w){ boardX=x+4; boardY=y+4; roadW=w; roadMap=new int[boardX][boardY]; } void initMaze(){ for(int x=0;x<=boardX-1;x++){ for(int y=0;y<=boardY-1;y++){ roadMap[x][y]=1; } } for(int x=3;x<=boardX-4;x++){ for(int y=3;y<=boardY-4;y++){ roadMap[x][y]=0; } } roadMap[2][3]=2; roadMap[boardX-3][boardY-4]=3; pieceX=2; pieceY=3; isPlaying=false; isGoal=false; pieceSize=0.7*roadW; playTime=0; } void drawMaze(){ noStroke(); background(100); for(int x=2;x<=boardX-3;x++){ for(int y=2;y<=boardY-3;y++){ if(roadMap[x][y]==0){ fill(100,0,0); }else if(roadMap[x][y]==1){ fill(0,200,0); }else if(roadMap[x][y]==2){ fill(200,200,0); }else if(roadMap[x][y]==3){ fill(200,0,200); } rect(roadW*x,roadW*y,roadW,roadW); } } } void keyPressed(){ switch(key){ case 'a': generateMazeUpDown(); break; case 'r': generateMazeRandom(); break; case 'k': isPlaying=true; break; case 'i': initMaze(); break; } if(isPlaying){ if(keyCode==UP&&pieceY>0)pieceY-=1; if(keyCode==RIGHT&&pieceX<boardX-1)pieceX+=1; if(keyCode==DOWN&&pieceY<boardY-1)pieceY+=1; if(keyCode==LEFT&&pieceX>0)pieceX-=1; } } void generateMazeUpDown(){ for(int x=4;x<boardX-3;x+=4){ for(int y=3;y<boardY-4;y++){ roadMap[x][y]=1; } } for(int x=6;x<boardX-3;x+=4){ for(int y=boardY-4;y>3;y--){ roadMap[x][y]=1; } } } void drawPiece(){ fill(0,200,0); ellipse((pieceX+0.5)*roadW,(pieceY+0.5)*roadW,pieceSize,pieceSize); } void drawInfo(){ if(isPlaying==true){ playTime+=1; } textSize(30); fill(255,255,0); text("Time="+playTime,20,30); } void checkFinish(){ if(roadMap[pieceX][pieceY]==3){ isPlaying=false; isGoal=true; } } void generateMazeRandom(){ for(int x=2;x<=boardX-3;x+=2){ for(int y=2;y<=boardY-3;y+=2){ if(roadMap[x][y]==1){ int r=(int)random(0,4); int dx=(int)dirX[r]; int dy=(int)dirY[r]; if(roadMap[x+dx*2][y+dy*2]==0){ roadMap[x+dx][y+dy]=1; roadMap[x+dx*2][y+dy*2]=1; } } } } }``` ### 試したこと void generateMazeRandom(){のじゅんばんをかえるなど ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

マスが2マスずつ増えていく

「壁が2マスずつ増えていく」ということかな。

現状では、generateMazeRandom()の中の2つのforループが壁の生成候補についてx,y全域をスキャンするまで終わらないので、そこを「壁を一つ生成したら抜ける」ようにするのが一つのヤマ。

でも、genrateMazeRandom()が呼ばれる度にスキャンを左上から順にやっていると規則的なパターンにしかならない(質問のサイズだと目立たないけど迷路を大きくするとパターンが見えてくる)ので、スキャン位置を保存したまま関数を抜けるようにしてみた。

Processing

1int x=2; 2int y=2; 3void generateMazeRandom() { 4 boolean reachEnd=false; 5 for ( ;; ) {//「空振り」を防止するために全体をループさせる 6 for (; x<=boardX-3; x+=2) { //前回の続きからループ 7 for (; y<=boardY-3; y+=2) { 8 if (roadMap[x][y]==1) { 9 int r=(int)random(0, 4); 10 int dx=(int)dirX[r]; 11 int dy=(int)dirY[r]; 12 13 if (roadMap[x+dx*2][y+dy*2]==0) { 14 roadMap[x+dx][y+dy]=1; 15 roadMap[x+dx*2][y+dy*2]=1; 16 return;//壁を一つ作ったらおしまい 17 } 18 } 19 } 20 y=2; 21 } 22 //ここに来るということはまだ壁を作れていない 23 if (reachEnd) { 24 //最初から調べ直して壁を作る場所がなかったので終わり 25 return; 26 } else { 27 //壁を作れないまま右下に到達、左上に戻ってスキャン再開 28 reachEnd = true; 29 x=2; 30 } 31 } 32}

とかかなぁ。

投稿2020/03/07 01:15

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

rを一度押すとマスが2マスずつ増えていく

こういうことですか?(内容はわかっていませんが^^;

Processing

1void generateMazeRandom() { 2 for (int x = 2; x <= boardX - 3; x += 2) { 3 for (int y = 2; y <= boardY - 3; y += 2) { 4 if (roadMap[x][y] == 1) { 5 int r = (int)random(0, 4); 6 int dx = (int)dirX[r]; 7 int dy = (int)dirY[r]; 8 9 if (roadMap[x + dx * 2][y + dy * 2] == 0) { 10 roadMap[x + dx][y + dy] = 1; 11 roadMap[x + dx * 2][y + dy * 2] = 1; 12 13 return; // ※※ 14 } 15 } 16 } 17 } 18}

投稿2020/03/06 22:08

TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/03/07 00:49

それだと、setup()で makeBoard(69, 49, 11); とかして大きな迷路を作ると結構悲しいものが出来たりするような。
TN8001

2020/03/07 01:29

なるほど きれいな横縞ができましたw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問