本当に初心者の人に捧げるコンピューター入門


ソフトウェア プログラム編その9

高級言語で迷宮から脱出

 というわけで高級言語を使って、迷宮から脱出してみましょう。
 以下のプログラムは機械語の例で利用したのと同じアルゴリズムです。


迷宮脱出プログラム:PASCAL編



program BreakOutMaze;


プログラムで使用する様々な定数
  • 定数とはプログラムの中で使う様々な変化しない値を、分かりやすい文字や単語で表現するためのものです。
const
  {方向を分かりやすく表示するための定数}
  NORTH=0;
  EAST=90;
  SOUTH=180;
  WEST=270;

  {その方向に行くときPositionにどんな値を足せばいいかを分かりやすく
  表示するための定数}
  D_NORTH=-15;
  D_EAST=1;
  D_SOUTH=15;
  D_WEST=-1;

  {迷路の升目が道である場合どんな値が入っているかを分かりやすく表示
  するための定数}
  PATH=0;

  {スタート地点と出口を分かりやすく表示するための定数}
  EXIT_POSITION=13;
  START_POSITION=196;


プログラム全体で使用する変数
var Maze:array[1..15*15] of byte; {迷路を配列を使って表しています} Position:Word; {現在位置を示す変数} Direction:Word; {現在の向きを示す変数}
周囲の道の数を数える関数
function RootCount(Position:Word):byte; var Count:byte; begin Count:=0; if Maze[Position+D_NORTH]=PATH then Count:=Count+1; if Maze[Position+D_EAST] =PATH then Count:=Count+1; if Maze[Position+D_SOUTH]=PATH then Count:=Count+1; if Maze[Position+D_WEST] =PATH then Count:=Count+1; Result:=Count; end;
Directionの方向に隣接した位置を求める関数
function NextCell(Position:Word;Direction:Word):Word; begin case Direction of NORTH :Result:=Position+D_NORTH; EAST :Result:=Position+D_EAST; SOUTH :Result:=Position+D_SOUTH; else Result:=Position-D_WEST; end; end;
後ろ側の方向を求める関数
function DirectBack(Direction:Word):Word; begin Result:=Direction+180; if Result>360 then Result:=Result-360; end;
左側の方向を求める関数
function DirectLeft(Direction:Word):Word; begin Result:=Direction+270; if Result>360 then Result:=Result-360; end;
道なりの方向を得る関数
function AlongWay(Position:Word;Direction:byte):Word; var Bk:Word; begin Bk:=DirectBack(Direction); if (Maze[NextCell(Position,NORTH)]=PATH) and (Bk<>NORTH) then Result:=NORTH else if (Maze[NextCell(Position,NORTH)]=PATH) and (Bk<>EAST) then Result:=EAST else if (Maze[NextCell(Position,SOUTH)]=PATH) and (Bk<>SOUTH) then Result:=SOUTH else Result:=WEST; end; ※<>というのは等しくないことを表します。
プログラムの本体
begin {最初の位置と向きを設定する} Position:=START_POSITION; Direction:=EAST; {現在位置が出口でない場合、以下を繰り返す} while (Position<>EXIT_POSITION) do begin {道の数を数えて} case RootCount(Position) of {数えた結果が1カ所だった場合(=行き止まり)} 1:begin Direction:=DirectBack(Direction); Position:=NextCell(Position,Direction); end; {数えた結果が2カ所だった場合(=普通の道)} 2:begin Direction:=AlongWay(Position,Direction); Position:=NextCell(Position,Direction); end; {数えた結果がそれ以外だった場合(=分かれ道)} else begin if Maze[NextCell(Position,DirectLeft(Direction))]=PATH then Direction:=DirectLeft(Direction); Position:=NextCell(Position,Direction); end; end; end; end.


何か長さはあまり変わらないけど・・・



 全体の長さはそんなに変わりませんね。でも大きな違いがあります。
 プログラム全体の動きが知りたい場合はプログラムの本体と書いてある部分だけを読めば、大まかな動作が分かってしまうことです。これは短いですね。
 そして細かい動作を知りたいときは、各関数の中身を読めばいいのです。

 それに作りやすさは全然違います。前の偽機械語のプログラムを作ったときは2日ぐらいかかったのが、こっちだと2時間ぐらいでできました。
(本当のプログラマーなら20分ぐらいでしょうか?)


前へ 目次へ 次へ