• 締切済み

”Java”か”Javascrip”を使用して迷路探索・・・

JavaまたはJavascriptを使い迷路探査するようなソフトウェアロボット?(意味が違うかもしれません・・・)を作成したいのですが、JavaとJavascriptではどちらがこのようなプログラムを作るときに向いてますでしょうか?ちなみに自分はホームページ作成とC言語をほんの少し学んだ程度なので、いったいどうやったらよいのか・・・本当に困っています。 プログラム内容としては  (1)画面上に(5×5)マスの迷路を作成  (2)ロボット?を画面上で動かすとして前後左右に動  き自ら判断して進んでいく  (3)出口で停止する  (4)迷路のパターンを変えても作動していく 上記の内容なのですがどなたかおわかりなりますでしょうか?

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

書き直してみました。プログラムは、若干短くなりましたけど、かえってわかりにくくなった処もあるかもしれません。やっていることは、同じなので見比べてみるといいかも。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta name="generator" content="WZ EDITOR 5.0"> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=shift_jis"> <title>迷路</title> <style> <!-- table.maze { border-spacing:0px; padding:0px; border:solid 1px black; } table.maze td { width:40px;height:40px; padding:0px; margin:0px; border:solid 1px black; text-align:center; } table.maze td.wall { background-color:black; } //--> </style> <script type="text/javascript"> <!-- var ID; //setInterval用 var mazeSize = 5; var maze = new Array( new Array(0,1,0,0,0), new Array(0,1,0,1,1), new Array(0,0,0,0,0), new Array(0,1,1,1,0), new Array(0,1,0,0,0) ); var robot = { x:0, y:0, dir:"→", Az:0, next:next, turnLeft:turnLeft, turnRight:turnRight, dx:dx, dy:dy, sideWallNone:sideWallNone }; var EXIT = { x:2, y:4 }; function init(){ var x,y; for(y=0;y<mazeSize;y++){ for(x=0;x<mazeSize;x++){ if(maze[y][x]) document.getElementById(xyToN(x,y)).className="wall"; } } document.getElementById(xyToN(EXIT.x,EXIT.y)).innerText="出口"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; } function xyToN(x,y){ return(y*mazeSize+x); } function canMove(x, y){ if(Math.max(x,y)>=mazeSize || Math.min(x,y)<0 || maze[y][x]==1) return(false); else return(true); } function turnRight(){ var dirList = "→↓←↑→"; robot.dir = dirList.substr(dirList.indexOf(robot.dir)+1,1); robot.Az -= 90; if(robot.Az<0) robot.Az+=360; } function turnLeft(){ var dirList = "→↓←↑→"; robot.dir = dirList.substr(dirList.lastIndexOf(robot.dir)-1,1); robot.Az += 90; if(robot.Az>=360) robot.Az-=360; } function dx(){ //進行方向の量 return(Math.round(Math.cos(robot.Az*Math.PI/180))); } function dy(){ //進行方向の量 return(-1*Math.round(Math.sin(robot.Az*Math.PI/180))); } function sideWallNone(){//左手に壁がない? var Az = robot.Az; var dx,dy; Az += 90 ;//進行方向左 if(Az>=360) Az-=360; dx=Math.round(Math.cos(Az*Math.PI/180)); dy=-1*Math.round(Math.sin(Az*Math.PI/180)); return (canMove(robot.x+dx,robot.y+dy)); } function next(){ if(canMove(robot.x+robot.dx(),robot.y+robot.dy())){//前進できる? document.getElementById(xyToN(robot.x,robot.y)).innerText=" "; robot.x+=robot.dx(); robot.y+=robot.dy();//進行方向に進む if(robot.sideWallNone()){ //左手に壁がない時 robot.turnLeft(); } } else { robot.turnRight(); } document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; if(EXIT.x==robot.x && EXIT.y==robot.y){ alert("出口につきました"); clearInterval(ID); } } //--> </script> </head> <body onload="init()"> <body onload="init()"> <table class="maze" cellspacing="0"> <tr><td id="0">&nbsp;</td><td id="1">&nbsp;</td><td id="2">&nbsp;</td><td id="3">&nbsp;</td><td id="4">&nbsp;</td></tr> <tr><td id="5">&nbsp;</td><td id="6">&nbsp;</td><td id="7">&nbsp;</td><td id="8">&nbsp;</td><td id="9">&nbsp;</td></tr> <tr><td id="10">&nbsp;</td><td id="11">&nbsp;</td><td id="12">&nbsp;</td><td id="13">&nbsp;</td><td id="14">&nbsp;</td></tr> <tr><td id="15">&nbsp;</td><td id="16">&nbsp;</td><td id="17">&nbsp;</td><td id="18">&nbsp;</td><td id="19">&nbsp;</td></tr> <tr><td id="20">&nbsp;</td><td id="21">&nbsp;</td><td id="22">&nbsp;</td><td id="23">&nbsp;</td><td id="24">&nbsp;</td></tr> </table> <button onclick="javascript:ID=setInterval('robot.next()',500)">スタート</button> </body> </html>

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>スタートからゴールまでの動きを一連の動きとして、ボタンを押すとゴールまで自動的に進んでゆく。 黙って実行させてしまうと、あっという間に終わってしまうので、 robot.next() を、時間間隔を置いて実行させればいいと思います。 今のonclickで呼び出している部分を 「onclick="javascript:robot.next(document.FORM1.MES)"」 を onclick="setInterval('robot.next()',1000))" とかに変えれば、設定時間毎にロボットが次の行動に進みます。 >テキストボックスの表示をなくす 必要なければ、テキストボックスそのものを削除して、テキストボックスへのメッセージの設定部分の削除、next(f)への引数をなくせばいいだけですけど。 もう一回、そういう風に全体を書き直してもいいけど、setIntervalを知らないのはしょうがないとしても、テキストボックスの処理を省くくらいのことはできないと、このプログラムに限らず(私のプログラムにこだわる理由もないし)、どんなプログラムを教えて貰っても、しょうがないというか、道は遠いと言わざるを得ません。 >ちなみに上記の方法はどのようにすればいいのでしょうか?? 0,1が□,■に置き換わっただけですね。 2次の配列を1次の文字列の配列にして横の座標を文字列の抜き出しに変えて、canMoveの判定を変えます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>もっと簡単な素人にもできる記述の仕方はないでしょうか?? どういう意味でしょうか? 迷路の表現方法という意味ですか? 迷路の表現方法として 1と0の配列を使っていますけれども new Array(0,1,0,0,0), new Array(0,1,0,1,1), new Array(0,0,0,0,0), new Array(0,1,1,1,0), new Array(0,1,0,0,0) を "□■□□□", "□■□■■", "□□□□□", "□■■■□", "□■□□□" のような表現に変えることはそれほど難しくないと思います。 それとも、別の意味でしょうか?

Sleeping-lion
質問者

補足

すみません。説明不足でした。 ちなみに上記の方法はどのようにすればいいのでしょうか??単に(a1・a2・・・)みたいに記号化してみるということなのでしょうか? 簡単な記述とは具体的に言うとBLUEPIXYさんが作成されましたプログラムをもっとシンプルなものにしたいのです(折角作成して頂いたのに申し訳ありませんが自分の勉強不足ゆえに理解するのが難しいので・・・)。自分で色々試行錯誤してみましたが上手くいかないので質問させて頂きました。 ○スタートからゴールまでの動きを一連の動きとして、ボタンを押すとゴールまで自動的に進んでゆく。 ○テキストボックスの表示をなくす 上記のことをしてなるべく軽量化といいますか簡略化(簡単)にしたいのですが、これ以上に可能でしょうか??

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

とりあえず、javascriptでサンプルを作ってみました。 IEで動作します。(NNで動くようにも注意すればできるとは思いますけど、ラクしたかっただけ) 通路を埋めたものを壁としていますが、 まあ、本来別に管理しても同じことです。 迷路のパターンを自動で変える部分や、 ロボットの初期位置を変える部分は作っていませんけど、変わっても動作するようにはなっていると思います。 ロボットの判断ルールは、いわゆる左手を壁に付けて迷路を抜けると言うヤツです。 まあ、やり方や実現の仕方は色々あるでしょうから 参考程度に <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta name="generator" content="WZ EDITOR 5.0"> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=shift_jis"> <title>迷路</title> <style> <!-- table.maze { border-spacing:0px; padding:0px; border:solid 1px black; } table.maze td { width:40px;height:40px; padding:0px; margin:0px; border:solid 1px black; text-align:center; } table.maze td.wall { background-color:black; } //--> </style> <script type="text/javascript"> <!-- var mazeSize = 5; var maze = new Array( new Array(0,1,0,0,0), new Array(0,1,0,1,1), new Array(0,0,0,0,0), new Array(0,1,1,1,0), new Array(0,1,0,0,0) ); var robot = { x:0, y:0, dir:"→", next:null }; robot.next = next; var EXIT = { x:2, y:4 }; function init(){ var x,y; for(y=0;y<mazeSize;y++){ for(x=0;x<mazeSize;x++){ if(maze[y][x]) document.getElementById(xyToN(x,y)).className="wall"; } } document.getElementById(xyToN(EXIT.x,EXIT.y)).innerText="出口"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; } function xyToN(x,y){ return(y*mazeSize+x); } function canMove(x, y){ if(Math.max(x,y)>=mazeSize || Math.min(x,y)<0 || maze[y][x]==1) return(false); else return(true); } function next(f){ switch(robot.dir){ case "→": if(canMove(robot.x+1,robot.y)){ document.getElementById(xyToN(robot.x,robot.y)).innerText=" "; robot.x+=1; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="右に移動しました"; if(canMove(robot.x,robot.y-1)){ //左手に壁がない時 robot.dir="↑"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value+="、左に90度方向変換しました"; } } else { robot.dir="↓"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="右に90度方向変換しました"; } break; case "←": if(canMove(robot.x-1,robot.y)){ document.getElementById(xyToN(robot.x,robot.y)).innerText=" "; robot.x-=1; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="左に移動しました"; if(canMove(robot.x,robot.y+1)){ //左手に壁がない時 robot.dir="↓"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value+="、左に90度方向変換しました"; } } else { robot.dir="↑"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="右に90度方向変換しました"; } break; case "↑": if(canMove(robot.x,robot.y-1)){ document.getElementById(xyToN(robot.x,robot.y)).innerText=" "; robot.y-=1; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="上に移動しました"; if(canMove(robot.x-1,robot.y)){ //左手に壁がない時 robot.dir="←"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value+="、左に90度方向変換しました"; } } else { robot.dir="→"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="右に90度方向変換しました"; } break; case "↓": if(canMove(robot.x,robot.y+1)){ document.getElementById(xyToN(robot.x,robot.y)).innerText=" "; robot.y+=1; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="下に移動しました"; if(canMove(robot.x+1,robot.y)){ //左手に壁がない時 robot.dir="→"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value+="、左に90度方向変換しました"; } } else { robot.dir="←"; document.getElementById(xyToN(robot.x,robot.y)).innerText=robot.dir; f.value="右に90度方向変換しました"; } break; } if(EXIT.x==robot.x && EXIT.y==robot.y) alert("出口につきました"); } //--> </script> </head> <body onload="init()"> <table class="maze" cellspacing="0"> <tr><td id="0">&nbsp;</td><td id="1">&nbsp;</td><td id="2">&nbsp;</td><td id="3">&nbsp;</td><td id="4">&nbsp;</td></tr> <tr><td id="5">&nbsp;</td><td id="6">&nbsp;</td><td id="7">&nbsp;</td><td id="8">&nbsp;</td><td id="9">&nbsp;</td></tr> <tr><td id="10">&nbsp;</td><td id="11">&nbsp;</td><td id="12">&nbsp;</td><td id="13">&nbsp;</td><td id="14">&nbsp;</td></tr> <tr><td id="15">&nbsp;</td><td id="16">&nbsp;</td><td id="17">&nbsp;</td><td id="18">&nbsp;</td><td id="19">&nbsp;</td></tr> <tr><td id="20">&nbsp;</td><td id="21">&nbsp;</td><td id="22">&nbsp;</td><td id="23">&nbsp;</td><td id="24">&nbsp;</td></tr> </table> <form name="FORM1"> <input type="text" name="MES" value="" size="50"><br> <button onclick="javascript:robot.next(document.FORM1.MES)">次の行動</button> </form> </body> </html>

Sleeping-lion
質問者

お礼

・・・今、このソース見てわかるのは多次元配列、条件分岐が使用されているな~程度でした。 BLUEPIXYさんが作成されたものを参考にさせて頂きます。まずはこのソースを分析してみるとこから始めてみようと思います。 参考となるプログラムありがとうございました。 (ロボットの制御が中々難しそうですね)

Sleeping-lion
質問者

補足

もっと簡単な素人にもできる記述の仕方はないでしょうか??

noname#21585
noname#21585
回答No.1

JavaScriptはHTML内に記述するインタープリタ型の言語で、HTMLを動的にすることをもっぱらの目的としており、私の知る限りではブラウザ上でしか作動しないものです。従いまして、ブラウザ上で実現しようとお考えならば、JavaScriptで実現させてもよいし、JavaのAppletで実現させてもよいかと思います。 そうではなく、単体のプログラムを作成したいということでしたら、Javaで書かれるべきかと思います。 少しでも学習されたC言語でやれるのが一番よいとは思いますが、そうはいかないから困っていらっしゃるのですよね。JavaScriptはHTML用の言語と考えていただいてよいかと思います。それ以外にもっと広範囲に渡るプログラミングをやれるようになりたいなら、Javaを覚えた方がよいかと思います(もちろん両方習得するのが一番よい。)。

Sleeping-lion
質問者

お礼

JavaScriptはホームページなどで動きを付けたいときによく使いますよね。今回はブラウザ上で使用したいため、JavaScriptになりそうです。本やネットで検索しながらなんとかやってみます。 JavaのAppletはJavaを学んだことがないので、JavaScriptでの作成後に挑戦してみようと思います。 (C言語・Javaで作成となると大変難しそうですね・・・) 丁寧で的確な回答をありがとうございました。

関連するQ&A

  • Java ソースファイルの作成の仕方

    最初javaプログラムの作成手順について初歩的な質問です 「dos画面上で、javaという名でjavaの作業用directoryを作成し、その中に1というdirectoryを作成して、ここで作業することにします 次に notepadと入力でし「メモ帳」を起動してソースプログラムを作成します。 dos画面は以下のようになる C:\>mkdir java C:\>cd java C:\java>mkdir 1 C:\java>cd 1 C:\java\1.notepad MyProgram.java C:\java\1> メモ帳を起動したら下記のプログラムを入力し、 /** *Java概論プログラム例 */ class MyProgram{   public static void main (String[] args) {//<---メインメソッド     System. out.print1n("Hello!"); //<---Hello と表示    } } それをMyProgram.javaという名で保存する」とマニュアルに書いてあるのですが、 1保存するプログラムは上記のとおりでいいのでしょ うか 2 そのProgram.javaはどこに  (フォルダー C:\ ??)保存すればよのでしょうか

    • ベストアンサー
    • Java
  • JAVAで作るプログラムとは

    HPに使うJAVAスクリプトの勉強をしたく、JAVAとスクリプトは違う事を知らずにJAVAの通信教育を申し込んでしまいました。 JAVAはサーバー側のプログラミング言語で、 スクリプトはクライアント側のスクリプト言語でブラウザ上で動作する。 申し込んだものは仕方ないので頑張ってJAVAを理解したいと思うのですが、 ネット上のJAVA講座を見ると最初にJAVAをインストールするとあります。 これはJAVAを作成するソフトのようなものですか? JAVAで作るプログラムとはOSのようなものですか? JAVAでプログラムを作ってHPの更新やスクリプトが作成できるのですか? そもそもJAVAで作るプログラムとはどのように利用するのか、 プログラムの意味がよく分かりません。 JAVAとスクリプトの違いはもう良いのでプログラムについて 分かりやすく教えてください。

    • ベストアンサー
    • Java
  • WindowsでのJavaについて

    こんにちは。 OSは現在、32bit版のWindowsVista(SP2)と、64bit版のWindows7を使っています。 今回、最近のWindows系OS上で、Javaがどういった事を行っているのかが知りたくて、 投稿させて頂きました。 以下で、いくつか質問させて下さい。 ・Windows上で、Javaの行う事は? 僕のPCでは、"C:\Program Files\Java"以下に、Java開発環境がインストールされています。 ですが僕は、一度もJavaプログラムを作って、走らせたりしたことがありません。 それなのに、Windowsでは、Javaのアップデートの通知がよく来ますし、 どうやら、Javaがないと上手く動作しないプロセスも存在するようです。 Windowsのアプリケーション層以外のところで、Javaは何かやっているのでしょうか? それとも、特定のアプリケーションを動作させるために、Javaが必要なだけでしょうか? ・仮想計算機とは? Javaについて調べてみると、「仮想計算機というものを使って、同じプログラムをいろいろな種類の計算機で動かす事ができるのが特徴である」といった意見が多かったです。 この説明で、「同じプログラムをいろいろな種類の計算機で動かす事ができる」 というのは、Cといった言語にも言えることです。 では、Cプログラムも、この「仮想計算機」(Windowsのコマンドプロンプトのようなものの事かな?)というものを使っているからこそ、様々な計算機上で、動かす事ができるのでしょうか? それとも、JavaプログラムとCプログラムの、OS上での実行のされ方は、 異なるのでしょうか? ・JavaScriptプログラムは、Windows上でどのようにして実行される? インターネット上で、特定のサイトを見る場合に、「JavaScript」をインストールしなければならない時があります。 この「JavaScript」は、"C:\Program Files\Java"以下にインストールされている、 Java開発環境とは、全く独立したものらしいのですが、 JavaScript開発環境が、どこにインストールされているのかが分かりません。 JavaScriptプログラムは、Windows上でどのように動作しているのでしょうか? 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

  • javaを使用しています。

    Java初心者です。Javaのバージョンは6で、Program Fileの中にインストールしました。 現在、Javaを使用しているのですがコンパイルの実行をするために javac ソースファイル名を入力したのですが、「Javacは内部コマンドまたは外部コマンド 操作可能なプログラムまたはバッチファイルとして認識されていません」と出ます。この場合、なにが原因だと思いますか? 後、ディレクトリを移動するためにCドライブにファイルを作りました。 メモ帳を使用し、ソースファイルを作成し、ファイル名はSample1.javaとしましたが、このファイルを保存するときは作成したディレクトリに保存すればいいのでしょうか?

    • ベストアンサー
    • Java
  • JAVAでフォートランのプログラムを動かす方法

    プログラムの初心者なのですが、JAVAを使ってプログラムを作るのですがJAVAで入出力の部分を作りそこで設定した値をフォートランで作ってある計算プログラムにいれて計算させ結果をJAVAで出力することはできるのですか? 簡単に書くと 入力画面(JAVA)    ↓   計算(フォートラン)    ↓ 出力画面(JAVA) こういう感じのものができるかどうか教えてください。 宜しくお願いします。

    • ベストアンサー
    • Java
  • javaで数独を解くプログラムについて

    java初心者です。 学校で数独を解けという問題が出て、問題の意味もまったくわからないのでヒントください。 問題 数独を解くプログラムを作成せよ。ただし、すでに埋まっているマスを入力する時にはi,j,n(改行)でひとつの数字を入力できるものとし、終了条件は、0,0,0を入力するとする。 問題用紙には1問だけ数独が載ってあるのですが、 初歩的な質問で申し訳ありませんが まずこのプログラムは、その1問だけ載っているマスが少し埋まっているプログラムを打ち込んでから解くプログラムを考えるのでしょうか? 普通、数独を解くプログラムとは、空いているマスにキーボード入力して、解くのでしょうか?それとも自動に動いて解くのでしょうか? はじめにプログラムをコンパイルしたときにどう言葉が出るようにすればようのでしょうか? 終了条件0,0,0とは、000を入力したら終わる?ということでしょうか? マスを作って、クリックすると数字が…というようなjavaは習ってなくコマンドプロントでコンパイルだけなので、数字を打って入力、エンターというだけで解くのだと思うのですが、まったくわからないです。 根本的にわからなくてすいません。 ぜひご回答よろしくおねがいします。

  • javaをIEで起動するには

    javaをはじめたばかりで、作成したjavaのプログラムを使ってインターネットエクスプローラで起動させるにはどのようにしたらよいのでしょうか。

    • ベストアンサー
    • Java
  • javascriptからjavaを呼び出したい

    javascriptの勉強中です。 javascriptでajaxを用いてjavaのメソッドにアクセスし、結果をjavascriptに返す、という実装をしたいのですが上手く行きません。 流れとしては以下のようなものを想定しています。 js /project/WebContent/js/testJS.js(画面の値を引数としてtestJavaクラスのtestMethodメソッドを呼び出す) ↓ java /project/src/java/jp/co/application/util/testJava.java(受け取った引数の値をtestDAOクラスのtestDAOMethodメソッドに渡す) ↓ java /project/src/java/jp/co/application/dao/testDAO.java(受け取った値を用いてDBにアクセスし、結果をjsに返す) まず技術的に、同じプロジェクト内のjavaメソッドをjs上で呼び出し、結果を受け取るということは可能なのでしょうか。 ご教示お願いします。

  • Javaの再配布は認められていますか?

    Javaの再配布は認められていますか?またはその手続き等が必要であれば教えてほしいです! Java3Dで作成したコンテンツをWeb上にアップするのですが, 試用してもらいやすいようにJDKとJava3Dの再配布を行いたいです。 例えば,Javaの書籍の付録のCD-ROMの中にサンプル・プログラムと一緒にJDKとJava3Dがはいっているものがありますね。そのようにJava3Dを再配布するのに手続き等は必要なのでしょうか?

    • ベストアンサー
    • Java
  • Javaで売上ランキングを作成するプログラムとは?

    こんにちは。現在、Java、JSP、JavaScript、MySQL、HTMLなどの基礎を学んでいる者です。 学習の成果として自分のローカルサーバで架空のネットショップのサイトを作成中です。データベースの受注テーブルからSQL文で取得した売上個数を使ってJavaで売上ランキングを作成したいのですが、ランキングのプログラムをどうしたらいいのかわかりません。サイトはJSPで作成していますので、最終的にはJSPにJavaプログラムを入れて表示する予定です。プログラムの部分、どなたかわかる方、ヒント、考え方だけでも結構ですの教えてください!

    • ベストアンサー
    • Java

専門家に質問してみよう