/////////////////////////////
//迷路ゲームテストプログラム
/////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Reflection;					//Assemblyを使う為
using System.IO;							//Fileを使う為

using Maze_DLL;								//Mazeクラスを使う為

namespace TestMaze
{
	/////////////////////////////////////////////////////
	//AppFormクラス（迷路コントロールのテスト用フォーム）
	/////////////////////////////////////////////////////
	public partial class AppForm : Form
	{
		//表示切替フラグ
		bool Is3D = true;
		//進行方向
		int WhereToGo;		//上－0、右－1、下－2、左－3
		//迷路コントロール
		Maze maze;
		//ボタンコントロール
		Button btnDisp, btnUp, btnDown, btnLeft, btnRight, btnExit;

		[STAThread]
		public static void Main()
		{
			AppForm ap = new AppForm();
			Application.Run(ap);
		}

		public AppForm()
		{
			Assembly myOwn = Assembly.GetEntryAssembly();
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコンをフォームにつける
			this.ClientSize = new Size(760, 682);					//Mazeコントロールを660x660にする
			this.MinimumSize = new Size(456, 401);					//Mazeコントロールを340x340にする
			this.Text = "C#による迷路サンプル";
			this.Load += AppForm_Load;
		}

		private void AppForm_Load(object sender, EventArgs e)
		{
			//表示切替ボタン
			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);

			//迷路コントロール（パネルコントロールから派生）
			InitMaze();
		}

		//終了処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			DialogResult dr = MessageBox.Show("終了しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.Yes)
			{
				dr = MessageBox.Show("中断して、後で再開する予定ですか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
				if(dr == DialogResult.Yes)
					maze.Abort();	//中断ファイルを作成する
				else
					maze.DeNovo();	//中断ファイルを削除する
			}
			else
			{
				dr = MessageBox.Show("新しい迷路にしますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
				if(dr == DialogResult.Yes)
				{
					e.Cancel = true;
					maze.DeNovo();	//中断ファイルを削除する
					InitMaze();
				}
				else
					e.Cancel = true;
			}
		}

		//表示切替ボタン
		private void ButtonDisp_Click(object sender, EventArgs e)
		{
			Is3D = !Is3D;
			maze.Display(Is3D, WhereToGo);
		}

		//↑ボタン
		private void ButtonUp_Click(object sender, EventArgs e)
		{
			//MessageBox.Show("上", "Test", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
			MoveInMaze(0);
		}

		//→ボタン
		private void ButtonRight_Click(object sender, EventArgs e)
		{
			//MessageBox.Show("右", "Test", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
			MoveInMaze(1);
		}

		//↓ボタン
		private void ButtonDown_Click(object sender, EventArgs e)
		{
			//MessageBox.Show("下", "Test", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
			MoveInMaze(2);
		}

		//←ボタン
		private void ButtonLeft_Click(object sender, EventArgs e)
		{
			//MessageBox.Show("左", "Test", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
			MoveInMaze(3);
		}

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

		//迷路の初期化
		private void InitMaze()
		{
			if(maze != null)
				maze.Dispose();
			maze = new Maze();				//初期値の41 x 41の迷路で、660 x 660のサイズとなる
			maze.GenerateMaze();			//迷路を作る
			maze.Display(Is3D, WhereToGo = maze.GetDir());	//Mazeコントロールの進行方向を継承して、迷路を表示する
			maze.Location = new Point(10, 10);
			maze.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			this.Controls.Add(maze);
		}

		//↑、↓、←、→ボタンを押した際に向いている方向に合わせて迷路を移動する
		private void MoveInMaze(int dir)	//dir：上－0、右－1、下－2、左－3
		{
			if(Is3D)
				WhereToGo = (WhereToGo + dir) % 4;	//相対方向
			else
				WhereToGo = dir;					//絶対方向
			switch(WhereToGo)
			{
				case 0:	//Up
					maze.GoUp();
					break;
				case 1:	//Right
					maze.GoRight();
					break;
				case 2:	//Down
					maze.GoDown();
					break;
				case 3:	//Left
					maze.GoLeft();
					break;
			}
			maze.Display(Is3D, WhereToGo);
			if(IsExit())
				Close();
		}

		//出口に達した場合の処理
		private bool IsExit()
		{
			if(maze.IsExit())
			{
				MessageBox.Show("Congratulations! You've got out of the maze!", "You Made It!!!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				return true;
			}
			return false;
		}
	}
}
