///////////////////////////////////////
// 3DMaze.cpp
// Copyright (c) 2026 by Y-Sama
// Need a maze map created by Maze.exe
///////////////////////////////////////
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;			//Assemblyを使う為
using System.IO;					//StreamReader/Writerを使う為
using System.Text;					//Encoderを使う為
using OpenTK;						//OpenTKを使用する際に必須
using OpenTK.Graphics;				//OpenTKのグラフィックを使用する際に必須
using OpenTK.Graphics.OpenGL;		//OpenGLを使用する際に必要

namespace ThreeDMaze
{
	public partial class MazeForm : Form
	{
		/////////////////
		//迷路関連データ
		/////////////////
		const string mzFileName = "3Maze_Sample.maz";	//迷路データファイル
		private int mzWidth, mzHeight;					//迷路のサイズ
		private int UNIT;								//壁、通路一単位のピクセル数（本プログラムでは使わない）
		bool mzIs3D = true;								//表示切替フラグ（迷路内－true、鳥瞰－false）
		private int mzWhereToGo;						//迷路探索者の進行方向（上－0(y+)、右－1(x+)、下－2(y-)、左－3(x-)）
		Point mzWhereIam;								//迷路探索者の位置
		Point mzExit;									//迷路出口の位置
		private int[,] MazeData;						//2次元配列の迷路情報

		////////////////
		//コントロール
		////////////////
		private GLControl glControl;					//GLControlへのポインター
		private Button btnDisp, btnUp, btnDown,			//ボタンコントロール
				btnLeft, btnRight, btnExit;

		///////////////////
		//OpenTK関連データ
		///////////////////
		private Vector3 pers = new Vector3(0.0f, 0.0f, 0.0f);		//視点座標（初期値）
		private Vector3 target = new Vector3(0.0f, 0.0f, 0.0f);		//対象座標（初期値）
		private Vector3 lPos0 = new Vector3(20.0f, 20.0f, 50.0f);	//光源座標（初期値－変更可能）
//		private Vector3 lPos1 = new Vector3(-20.0f, -20.0f, 50.0f);	//光源座標（初期値－変更可能）

		/////////////////////
		//エントリーポイント
		/////////////////////
		[STAThread]
		public static void Main() 
		{
			Application.Run(new MazeForm());
		}

		/////////////////
		//クラスメソッド
		/////////////////
		//コンストラクター
		public MazeForm()
		{
			this.Text = "3DMaze";
			this.ClientSize = new Size(800, 680);
			this.MinimumSize = new Size(640, 480);
			this.Icon = Icon.ExtractAssociatedIcon(Assembly.GetEntryAssembly().Location);
			this.Load += new EventHandler(InitControls);
			IniMaze();			//3DMaze_Sample.mazから迷路情報を読み込む
		}

		//this.Load時処理
		private void InitControls(object sender, EventArgs e)
		{
			//Formのコントロールレイアウトロジック保留
			SuspendLayout();
			//GLControl関連
			glControl = new GLControl();
			glControl.Location = new Point(10, 10);
			glControl.Size = new Size(660, 660);
			glControl.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left);
			glControl.Load += new EventHandler(glControl_Load);
			glControl.Resize += new EventHandler(glControl_Resize);
			glControl.Paint += new PaintEventHandler(glControl_Paint);
			Controls.Add(glControl);

			//表示切替ボタン
			btnDisp = new Button();
			btnDisp.Location = new Point(ClientSize.Width - btnDisp.Width - 6, 10);
			btnDisp.Text = "迷路内表示";
			btnDisp.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			btnDisp.Click += ButtonDisp_Click;
			this.Controls.Add(btnDisp);

			//↑ボタン
			btnUp = new Button();
			btnUp.Size = new Size(24, 24);
			btnUp.Location = new Point(ClientSize.Width - 56, btnDisp.Height + 20);
			btnUp.Text = "↑";
			btnUp.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			btnUp.Click += ButtonUp_Click;
			this.Controls.Add(btnUp);

			//↓ボタン
			btnDown = new Button();
			btnDown.Size = new Size(24, 24);
			btnDown.Location = new Point(ClientSize.Width - 56, btnDisp.Height + 68);
			btnDown.Text = "↓";
			btnDown.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			btnDown.Click += ButtonDown_Click;
			this.Controls.Add(btnDown);

			//←ボタン
			btnLeft = new Button();
			btnLeft.Size = new Size(24, 24);
			btnLeft.Location = new Point(ClientSize.Width - 80, btnDisp.Height + 44);
			btnLeft.Text = "←";
			btnLeft.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			btnLeft.Click += ButtonLeft_Click;
			this.Controls.Add(btnLeft);

			//→ボタン
			btnRight = new Button();
			btnRight.Size = new Size(24, 24);
			btnRight.Location = new Point(ClientSize.Width - 32, btnDisp.Height + 44);
			btnRight.Text = "→";
			btnRight.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			btnRight.Click += ButtonRight_Click;
			this.Controls.Add(btnRight);

			//終了ボタン
			btnExit = new Button();
			btnExit.Location = new Point(ClientSize.Width - btnExit.Width - 6, ClientSize.Height - btnExit.Height - 12);
			btnExit.Text = "終了";
			btnExit.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right);
			btnExit.Click += ButtonExit_Click;
			this.Controls.Add(btnExit);
			//Formのコントロールレイアウトロジック再開
			ResumeLayout();
		}

		//終了処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			DialogResult dr = MessageBox.Show("終了しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr != DialogResult.Yes)
				e.Cancel = true;
		}

		//表示切替ボタン
		private void ButtonDisp_Click(object sender, EventArgs e)
		{
			mzIs3D = !mzIs3D;				//トグルスイッチ変換
			glControl.Refresh();			//再描画
			if(mzIs3D)						//ボタンには切替る表示を示す
				btnDisp.Text = "鳥瞰表示";
			else
				btnDisp.Text = "迷路内表示";
		}

		//↑ボタン
		private void ButtonUp_Click(object sender, EventArgs e)
		{
			MoveTo(0);
		}

		//→ボタン
		private void ButtonRight_Click(object sender, EventArgs e)
		{
			MoveTo(1);
		}

		//↓ボタン
		private void ButtonDown_Click(object sender, EventArgs e)
		{
			MoveTo(2);
		}

		//←ボタン
		private void ButtonLeft_Click(object sender, EventArgs e)
		{
			MoveTo(3);
		}

		//移動処理
		private void MoveTo(int dir)
		{
			if(mzIs3D)
				mzWhereToGo = (mzWhereToGo + dir) % 4;	//相対方向→絶対方向
			else
				mzWhereToGo = dir;						//絶対方向
			//絶対方向による移動処理
			switch(mzWhereToGo)
			{
				case 0:			//上－y+
					if(MazeData[mzWhereIam.X, mzWhereIam.Y + 1] == 1)
						Console.Beep();
					else
						mzWhereIam.Y++;
					break;
				case 1:			//右－x+
					if(MazeData[mzWhereIam.X + 1, mzWhereIam.Y] == 1)
						Console.Beep();
					else
						mzWhereIam.X++;
					break;
				case 2:			//下－y-
					if(MazeData[mzWhereIam.X, mzWhereIam.Y - 1] == 1)
						Console.Beep();
					else
						mzWhereIam.Y--;
					break;
				case 3:			//左－x-
					if(MazeData[mzWhereIam.X - 1, mzWhereIam.Y] == 1)
						Console.Beep();
					else
						mzWhereIam.X--;
					break;
			}
			glControl.Refresh();				//再描画

//For Debugginh
if(mzIs3D)
	MessageBox.Show("mzWhereIam = (" + mzWhereIam.X.ToString() + ":" + mzWhereIam.Y.ToString() + ")", "方向 - " + mzWhereToGo.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

		}

		//終了ボタン
		private void ButtonExit_Click(object sender, EventArgs e)
		{
			//終了処理
			Close();
		}

		////////////////////////
		//GLControlのLoad時処理
		////////////////////////
		private void glControl_Load(object sender, EventArgs e)
		{
			GL.ClearColor(glControl.BackColor);	//画面消去色の設定
			GL.Enable(EnableCap.DepthTest);		//深度バッファの使用
			GL.Enable(EnableCap.Normalize);		//法線正規化
		}

		//////////////////////////////
		//GLControlのサイズ変更時処理
		//////////////////////////////
		private void glControl_Resize(object sender, EventArgs e)
		{
			glControl.Refresh();				//再描画
		}

		/////////////////////////////
		//GLControlの描画処理
		//ここに図形の行が処理を配置
		/////////////////////////////
		private void glControl_Paint(object sender, PaintEventArgs e)
		{
			//色と深度バッファーを初期化
			GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
			//表示設定
			ChangeView();
			//ライトの設定
			glControl_SetLight();
			//以下に描画処理を行う
			double Ix = (double)(mzWhereIam.X - mzWidth / 2);
			double Iy = (double)(mzWhereIam.Y - mzHeight / 2);
			if(!mzIs3D)		//鳥瞰表示の場合のみ表示 
			{
				GL.PushMatrix();
				{
					//質感の設定
					//鏡面光成分のセット
					GL.Material(MaterialFace.Front, MaterialParameter.Specular, Color4.White);
					GL.Material(MaterialFace.Front, MaterialParameter.Shininess, 32.0f);
					GL.Material(MaterialFace.Front, MaterialParameter.Diffuse, Color4.OrangeRed);
					GL.Translate(Ix, Iy, 0.0);
					//球を描画
					Sphere(true, 0.4, 36);
				}
				GL.PopMatrix();
			}
			for(int y = 0; y < mzHeight; y++)
			{
				for(int x = 0; x < mzWidth; x++)
				{
					double xx = (double)(x - mzWidth / 2);
					double yy = (double)(y - mzHeight / 2);
					if(MazeData[x, y] == 1)
					{
						GL.PushMatrix();
						{
							//質感の設定
							GL.Material(MaterialFace.Front, MaterialParameter.Diffuse, Color4.Yellow);
							GL.Translate(xx, yy, 0.0);
							//柱を描画
							Cube(true, 1.0, 1.0, 1.0);
						}
						GL.PopMatrix();
					}
				}
			}
			//バッファー変換
			glControl.SwapBuffers();
		}

		///////////////////////////
		//迷路内表示・鳥瞰表示切替
		///////////////////////////
		private void ChangeView()
		{
			if(mzIs3D)	//trueの場合、迷路内を表示
			{
				//視体積の設定（迷路探索者の位置前から迷路長）
				glControl_SetProjection(1.0f, 41.0f);
				//視点座標（迷路探索者の位置－壁面中央の高さ（Z）が0なのでZを0とする－Z軸がUp）
				pers = new Vector3((float)(mzWhereIam.X - mzWidth / 2), (float)(mzWhereIam.Y - mzHeight / 2), 0.0f);
				switch (mzWhereToGo)	//絶対方向（mzWhereToGo）に基づく方向ベクトル
				{
					case 0: target = new Vector3(0.0f,  1.0f, 0.0f);	break;
					case 1: target = new Vector3(1.0f,  0.0f, 0.0f);	break;
					case 2: target = new Vector3(0.0f, -1.0f, 0.0f);	break;
					case 3: target = new Vector3(-1.0f, 0.0f, 0.0f);	break;
					default:			//発生しないが．．．
						MessageBox.Show("方向が異常です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
						return;
				}
				//注視点の設定（迷路探索者の位置と方向ベクトルの和）
				target += pers;
				//モデルビューの設定
				glControl_SetModelView();
			}
			else		//falseの場合、鳥瞰表示
			{
				//視体積の設定（デフォルトのzNear = 10.0f、zFar = 64.0f）
				glControl_SetProjection();
				//視点座標設定
				pers = new Vector3(0.0f, 0.0f, 50.0f);	//迷路の中心位置で、Z = 50.0fから垂直に見下ろす（Y軸がUp）
				//注視点の設定（target = (0, 0, 0)で迷路中央を見る）
				target = new Vector3(0.0f, 0.0f, 0.0f);
				//モデルビューの設定
				glControl_SetModelView();
			}
		}

		//////////////////////////////
		//GLControl上のビューポート、
		//視野空間、透視投影設定
		//////////////////////////////
		private void glControl_SetProjection(float zNear = 10.0f, float zFar = 64.0f)
		{
			//GLControlのビューポートの設定
			GL.Viewport(0, 0, glControl.Size.Width, glControl.Size.Height);
			//透視投影視野空間の設定
			GL.MatrixMode(MatrixMode.Projection);
			//透視投影－尚、glControl.AspectRatioは、(float)glControl.Width / (float)glControl.Heightと等価
			Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, glControl.AspectRatio, zNear, zFar);
			GL.LoadMatrix(ref projection);
		}

		////////////////////////////////
		//GLControl上のモデルビュー設定
		////////////////////////////////
		void glControl_SetModelView()
		{
			//モデルビューを選択
			GL.MatrixMode(MatrixMode.Modelview);
			//視点をpersで設定してtargetを見る
			Matrix4 modelview;
			if(mzIs3D)	//迷路内表示
				modelview = Matrix4.LookAt(pers, target, Vector3.UnitZ);	//迷路を水平に見るのでZ軸を上（Up）にする
			else		//鳥瞰表示
				modelview = Matrix4.LookAt(pers, target, Vector3.UnitY);	//迷路を垂直に見下ろすのでY軸を上（Up）にする
			GL.LoadMatrix(ref modelview);									//現在の変換マトリックスに設定
		}

		////////////////////////
		//GLControl上の光源設定
		////////////////////////
		void glControl_SetLight()
		{
			//光源の使用
			GL.Enable(EnableCap.Lighting);
			//ライト0の設定
			GL.Enable(EnableCap.Light0);
			//Chat-GPT推奨の「ちょっと盛り」
			float[] amb = {0.35f,0.35f,0.35f,1.0f};
			GL.Light(LightName.Light0, LightParameter.Ambient, amb);
			float[] pos0 = new float[] {lPos0.X, lPos0.Y, lPos0.Z, 0.0f };
			GL.Light(LightName.Light0, LightParameter.Position, pos0);
//			//ライト1の設定
//			GL.Enable(EnableCap.Light1);
//			float[] pos1 = new float[] {lPos1.X, lPos1.Y, lPos1.Z, 0.0f };
//			GL.Light(LightName.Light1, LightParameter.Position, pos1);
		}

/*
		///////////////////////////////////////
		//OpenTK.Inputを使ったキー入力メソッド
		///////////////////////////////////////
		[System.Security.Permissions.UIPermission(
			System.Security.Permissions.SecurityAction.Demand,
			Window = System.Security.Permissions.UIPermissionWindow.AllWindows)]
		protected override bool ProcessDialogKey(Keys keyData)
		{
			//左キーが押されているか調べる
			if((keyData & Keys.KeyCode) == Keys.Left)
			{
				OnLeft();
				//左キーの本来の処理（左側のコントロールにフォーカスを移す）を
				//させたくないときは、trueを返す
				return true;
			}
			else if((keyData & Keys.KeyCode) == Keys.Right)
			{
				OnRight();
				return true;
			}
			else if((keyData & Keys.KeyCode) == Keys.Up)
			{
				OnUp();
				return true;
			}
			else if((keyData & Keys.KeyCode) == Keys.Down)
			{
				OnDown();
				return true;
			}
			return base.ProcessDialogKey(keyData);
		}

		void OnLeft()
		{
			a -= 0.1f;
			Draw();
		}
		void OnRight()
		{
			a += 0.1f;
			Draw();
		}
		void OnUp()
		{
			b += 0.1f;
			Draw();
		}
		void OnDown()
		{
			b -= 0.1f;
			Draw();
		}
		void Draw()
		{
			GL.ClearColor(glControl.BackColor);
			SetSight();
			glControl.Refresh();
		}
*/

		/////////////////////////////////////////////////////////////
		//立（直）方体（引数：ソリッドまたはワイアー、横、縦、高さ）
		/////////////////////////////////////////////////////////////
		public void Cube(bool SorW = true, double hor = 1.0, double ver = 1.0, double dep = 1.0)
		{
			//立（直）方体データ
			double[][] Qvertex = new double[8][];	//四角形の8頂点（奥左下から反時計回り4点、手前左下から反時計回り4点）
			Qvertex[0] = new double[3] {-hor / 2, -ver / 2, -dep / 2};
			Qvertex[1] = new double[3] { hor / 2, -ver / 2, -dep / 2};
			Qvertex[2] = new double[3] { hor / 2,  ver / 2, -dep / 2};
			Qvertex[3] = new double[3] {-hor / 2,  ver / 2, -dep / 2};
			Qvertex[4] = new double[3] {-hor / 2, -ver / 2,  dep / 2};
			Qvertex[5] = new double[3] { hor / 2, -ver / 2,  dep / 2};
			Qvertex[6] = new double[3] { hor / 2,  ver / 2,  dep / 2};
			Qvertex[7] = new double[3] {-hor / 2,  ver / 2,  dep / 2};
			int[][] Qedge = new int[12][];			//頂点を結ぶ12線分
			Qedge[0] = new int[2] {0, 1};
			Qedge[1] = new int[2] {1, 2};
			Qedge[2] = new int[2] {2, 3};
			Qedge[3] = new int[2] {3, 0};
			Qedge[4] = new int[2] {4, 5};
			Qedge[5] = new int[2] {5, 6};
			Qedge[6] = new int[2] {6, 7};
			Qedge[7] = new int[2] {7, 4};
			Qedge[8] = new int[2] {0, 4};
			Qedge[9] = new int[2] {1, 5};
			Qedge[10] = new int[2] {2, 6};
			Qedge[11] = new int[2] {3, 7};
			int[][] Qface = new int[6][];			//四角形6面
			Qface[0] = new int[4] {0, 1, 2, 3};		//奥面
			Qface[1] = new int[4] {1, 5, 6, 2};		//右面
			Qface[2] = new int[4] {5, 4, 7, 6};		//手前面
			Qface[3] = new int[4] {4, 0, 3, 7};		//左面
			Qface[4] = new int[4] {4, 5, 1, 0};		//底面
			Qface[5] = new int[4] {3, 2, 6, 7};		//天面
			Vector3[] vecNormal = new Vector3[6] {-Vector3.UnitZ, Vector3.UnitX, Vector3.UnitZ, -Vector3.UnitX, -Vector3.UnitY, Vector3.UnitY};
			//立（直）方体描画
			GL.PushMatrix();
			if(SorW)
			{
				GL.Begin(PrimitiveType.Quads);		//四角面を描画(Solid)
					for(int j = 0; j < 6; j++)
					{
						GL.Normal3(vecNormal[j]);	//法線の設定
						for(int i = 0; i < 4; i++)
							GL.Vertex3(Qvertex[Qface[j][i]][0], Qvertex[Qface[j][i]][1], Qvertex[Qface[j][i]][2]);
					}
				GL.End();
			}
			else
			{
				GL.Begin(PrimitiveType.Lines);		//四角面を描画(Wire)
					for(int j = 0; j < 12; j++)
					{
						for(int i = 0; i < 2; i++)
							GL.Vertex3(Qvertex[Qedge[j][i]][0], Qvertex[Qedge[j][i]][1], Qvertex[Qedge[j][i]][2]);
					}
				GL.End();
			}
			GL.PopMatrix();
		}

		//////////////////////////////////////////////////////////
		//球（引数：ソリッドまたはワイアー、半径、360°の分割数）
		//////////////////////////////////////////////////////////
		public void Sphere(bool SorW = true, double radius = 0.5, int slices = 36)
		{
			double angle = Math.PI / slices * 2;	//angle(radian) = (360 / slices) * (Math.PI / 180);
			if(SorW)
				GL.Begin(PrimitiveType.TriangleStrip);			//球体を描画（Solid）
			else
				GL.Begin(PrimitiveType.LineStrip);				//球体を描画（Wire）
			{
				for(int j = -slices / 2; j < slices / 2; j++)	//slices along Z軸
				{
						for(int i = 0; i <= slices; i++)	//slices around Z軸
						{
							Vector3d vec1 = new Vector3d(radius * Math.Cos(angle * j) * Math.Cos(angle * i), radius * Math.Cos(angle * j) * Math.Sin(angle * i), radius * Math.Sin(angle * j));
							GL.Normal3(Vector3d.Normalize(vec1));	//2026/02/19、正規化がないというChat-GPTの指摘によりGL.Normal3(vec1);から修正
							GL.Vertex3(vec1);
							Vector3d vec2 = new Vector3d(radius * Math.Cos(angle * (j - 1)) * Math.Cos(angle * i), radius * Math.Cos(angle * (j - 1)) * Math.Sin(angle * i), radius * Math.Sin(angle * (j - 1)));
							GL.Normal3(Vector3d.Normalize(vec2));	//2026/02/19、正規化がないというChat-GPTの指摘によりGL.Normal3(vec2);から修正
							GL.Vertex3(vec2);
						}
				}
			}
			GL.End();
		}

		/////////////////////////////
		//Maze.tmpファイルを読み込み
		//迷路を初期化する
		/////////////////////////////
		private bool IniMaze()
		{
			string data = "";
			//ファイル（UTF-8：Encoding.UTF8）を読む
			try
			{
				using(StreamReader file = new StreamReader(mzFileName, Encoding.UTF8))
				{
					data = file.ReadToEnd();
					// ファイルを閉じる
					file.Close();
				}
			}
			catch(Exception e)	//FileNotFoundException e
			{
				//Debug用
				MessageBox.Show("エラーコード：" + e.ToString(), "初期化ファイル読み込みエラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			//文字列の行分割
			string[] lines = data.Split(new[]{"\r\n","\n","\r"},StringSplitOptions.None);
			//第１行（迷路の幅と高さ）の語分割
			string[] widthheight = lines[0].Split(',');
			if(!Int32.TryParse(widthheight[0], out mzWidth))
			{
				MessageBox.Show("mzWidthの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			if(!Int32.TryParse(widthheight[1], out mzHeight))
			{
				MessageBox.Show("mzHeightの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			//迷路の作成
			MazeData = new int[mzWidth, mzHeight];
			//第２行（UNIT、mzIs3D、mzWhereToGo）の語分割
			string[] others = lines[1].Split(',');
			if(!Int32.TryParse(others[0], out UNIT))
			{
				MessageBox.Show("UNITの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			if(!bool.TryParse(others[1], out mzIs3D))
			{
				MessageBox.Show("mzIs3Dの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			if(!Int32.TryParse(others[2], out mzWhereToGo))
			{
				MessageBox.Show("mzWhereToGoの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			//第３行（迷路探索者の位置）の語分割
			string[] where = lines[2].Split(',');
			mzWhereIam = new Point();
			int x, y;	//TryParse用変数
			if(Int32.TryParse(where[0], out x))
				mzWhereIam.X = x;
			else
			{
				MessageBox.Show("mzWhereIam.Xの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			if(Int32.TryParse(where[1], out y))
				mzWhereIam.Y = y;
			else
			{
				MessageBox.Show("mzWhereIam.Xの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			//第４行（迷路出口の位置）の語分割
			string[] exitpos = lines[3].Split(',');
			mzExit = new Point();
			if(Int32.TryParse(exitpos[0], out x))
				mzExit.X = x;
			else
			{
				MessageBox.Show("mzExit.Xの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			if(Int32.TryParse(exitpos[1], out y))
				mzExit.Y = y;
			else
			{
				MessageBox.Show("mzExit.Yの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return false;
			}
			//第５行以降（迷路データ）の語分割
			for(y = 0; y < mzHeight; y++)
			{
				string[] dt = lines[4 + y].Split(',');
				for(x = 0; x < mzWidth; x++)
				{
					if(!Int32.TryParse(dt[x], out MazeData[x, y]))
					{
						MessageBox.Show("MazeDataの初期化に失敗しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
						return false;
					}
				}
			}
			string msg = "迷路サイズ：" + mzWidth.ToString() + " x " + mzHeight.ToString() + Environment.NewLine;
			msg += "表示：" + (mzIs3D ? "迷路内" : "鳥瞰表示") + Environment.NewLine;
			msg += "進行方向" + mzWhereToGo.ToString() + "（上－0、右－1、下－2、左－3）" + Environment.NewLine;
			msg += "探索者位置：" + mzWhereIam.X.ToString() + ", " + mzWhereIam.Y.ToString() + Environment.NewLine;
			msg += "出口位置：" + mzExit.X.ToString() + ", " + mzExit.Y.ToString() + Environment.NewLine;
			MessageBox.Show(msg, "迷路情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
			return true;
		}
	}
}
