//////////////////////////////////////////
// Concentration by CardTable.dll
// Copyright (c) by Ysama September, 2024
//////////////////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using cardtable;				//CardTableクラスを利用する

namespace Concentration
{
	///////////////////////////
	//エントリーポイントクラス
	///////////////////////////
	class Memory : Form
	{
		//メンバーフィールド（変数）
		CardTable myTable;		//トランプ台
		int trials;				//試行回数
		bool ontheway;			//一枚開いた状態
		int firstNo;			//一枚目のカード番号
		int secondNo;			//二枚目のカード番号
		int pairs;				//対を開いた数

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

		//コンストラクター
		public Memory()
		{
			this.Size = new Size(1012, 522);					//調査値
			this.MinimumSize = new Size(640, 522);				//調査値
			this.MaximumSize = new Size(1012, 522);				//調査値
			this.BackColor = Color.Black;
			this.Text = "Concentration";
		//	this.SizeChanged += OnSizeChanged;					//調査用
			myTable = new CardTable(988, 476, false);
			myTable.Location = new Point(0, 0);
			myTable.Size = new Size(ClientSize.Width, ClientSize.Height);
			myTable.Anchor = (AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
			myTable.Click += OnMyCardClick;
			this.Controls.Add(myTable);
			Init();
		}

		//private void OnSizeChanged(object sender, EventArgs e)//調査用
		//{
		//	this.Text = "Width: " + Size.Width.ToString() + ", Height: " + Size.Height.ToString();
		//}

		private void OnMyCardClick(object sender, EventArgs e)
		{
			if(myTable.msButton == MouseButtons.Left)
			{
				if(!ontheway)
				{
					firstNo = myTable.GeGridtNo(myTable.msX, myTable.msY);
					if(myTable.Deck[firstNo].Discarded)	return;
					//MessageBox.Show("No: " + firstNo.ToString(), "firstNo", MessageBoxButtons.OK, MessageBoxIcon.Information);
					if(firstNo >= 0 && firstNo < 52)
					{
						myTable.TurnFace(firstNo, true);
						myTable.ShowCard(firstNo, firstNo % 13, firstNo / 13, true);
						trials++;
						ontheway = !ontheway;
					}
				}
				else
				{
					secondNo = myTable.GeGridtNo(myTable.msX, myTable.msY);
					if(myTable.Deck[secondNo].Discarded)	return;
					if(secondNo == firstNo)
					{
						MessageBox.Show("同じ札は選択できません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
						return;
					}
					//MessageBox.Show("No: " + secondNo.ToString(), "secondNo", MessageBoxButtons.OK, MessageBoxIcon.Information);
					if(firstNo >= 0 && firstNo < 52)
					{
						myTable.TurnFace(secondNo, true);
						myTable.ShowCard(secondNo, secondNo % 13, secondNo / 13, true);
						if(myTable.Deck[firstNo].Number == myTable.Deck[secondNo].Number)
						{
							MessageBox.Show("同じ番号の札を開きました。", "正解！", MessageBoxButtons.OK, MessageBoxIcon.Information);
							pairs++;
							this.Text = "Concentration (取得したペアの数：" + pairs.ToString() + "）";
							myTable.RemoveCard(firstNo, firstNo % 13, firstNo / 13, true);
							myTable.RemoveCard(secondNo, secondNo % 13, secondNo / 13, true);
							if(pairs == 26)
							{
								MessageBox.Show("ゲームが完了しました。あなたの試行回数は" + trials.ToString() + "でした。", "ゲーム完了", MessageBoxButtons.OK, MessageBoxIcon.Information);
								DialogResult res = MessageBox.Show("終了しますか？", "終了確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
								if(res == DialogResult.Yes)
									Close();
								else
								{
									Init();		//再初期化
									return;
								}
							}
						}
						else
						{
							MessageBox.Show("残念！番号が違います。", "不正解！", MessageBoxButtons.OK, MessageBoxIcon.Information);
							myTable.TurnFace(firstNo, false);
							myTable.ShowCard(firstNo, firstNo % 13, firstNo / 13, true);
							myTable.TurnFace(secondNo, false);
							myTable.ShowCard(secondNo, secondNo % 13, secondNo / 13, true);
						}
						ontheway = !ontheway;
					}
				}
			}
			else if(myTable.msButton == MouseButtons.Right)
			{
				MessageBox.Show("右ボタン：No = " + myTable.GeGridtNo(myTable.msX, myTable.msY).ToString(), "カード番号", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
			else
			{
				MessageBox.Show("中央ボタン：No = " + myTable.GeGridtNo(myTable.msX, myTable.msY).ToString(), "カード番号", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
		}

		private void Init()
		{
			this.Text = "Concentration";
			trials = 0;				//試行回数
			pairs = 0;				//対を開いた数
			ontheway = false;		//一枚開いた状態
			myTable.Shuffle(false);	//Jokerを使わない
			DialogResult res = MessageBox.Show("小さいカードを使いますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(res == DialogResult.Yes)
				myTable.smallCards = true;
			else
				myTable.smallCards = false;
			for(int i = 0; i < 4; i++)
			{
				for(int j = 0; j < 13; j++)
				{
					myTable.TurnFace(i * 13 + j, false);
					myTable.ShowCard(i * 13 + j, j, i, true);	//横(0 - 12) X 縦(0 - 5)のグリッド表示
				}
			}
		}
	}
}
