///////////////////////////////////////
// Chinchirorin.cs - Chinchirorin Game
// Copyright (c) 2023 by Ysama
///////////////////////////////////////
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.Reflection;			//Assemblyの使用の為
using System.Resources;				//リソース関係クラス等の使用の為
using System.IO;					//ファイル操作使用の為
using System.Linq;					// EnumerateFiles の使用の為
using System.Collections;			//IComparerの使用の為
using System.Collections.Generic;	// List<T> クラス使用の為
using System.Diagnostics;			//ProcessStartInfoの使用の為
//カスタムDLL
using Dices;						//Diceコントロールを使う為
using Players;						//Playerクラスを使うy為

namespace Chinchirorin
{
	//エントリーポイントクラス
	class WinMain
	{
		[STAThread]
		public static void Main()
		{
			Application.Run(new Casino());
		}
	}

	///////////////////////
	//Casinoフォームクラス
	///////////////////////
	public partial class Casino : Form
	{
		//ウィンドウフォーム関連変数（全てprivate）
		MenuItem miOpen, miGo;						//有効無効化処理を行うメニューアイテム
		ToolStrip toolStrip;						//ツールバー
		ToolStripButton[] toolStripButton;			//ツールバーボタン
		StatusStrip statusStrip;					//ステータスバー
		ToolStripStatusLabel[] tssl;				//ステータスバーラベル
		Dice dice1, dice2, dice3;					//Diceコントロール
		//子ウィンドウフォーム変数（private）
		PlayerList playerList;						//PlayerListフォーム
		//ゲーム関連変数（全てprivate）
		int NoOfBakuto;								//Playerの数
		int NoOfBankrupt;							//破産Playerの数
		Player[] Bakuto;							//Player配列
		int[] LastBet;								//PlayerがPlaceBetsを行った際に記録される
		int Banker;									//Player[]配列の添字

		//コンストラクター
		public Casino()
		{
			Assembly myOwn = Assembly.GetEntryAssembly();
			this.Icon = Icon.ExtractAssociatedIcon(myOwn.Location);	//プログラムアイコンをフォームにつける
			this.ClientSize = new Size(454, 407);	//メニューバー＋ツールバー＋ステータスバー = 67
			this.MinimumSize = new Size(470, 446);	//幅 +16（8 x 2）、高さ +39
			this.Left = 100;
			this.Top = 100;
			this.StartPosition = FormStartPosition.Manual;
			this.BackColor = SystemColors.Window;
			this.BackgroundImageLayout = ImageLayout.Zoom;
			this.Text = "Chinchirorin Casino";
			this.Load += new EventHandler(Casino_Load);
		}

		//デストラクター
		~Casino()
		{
			//子フォームを廃棄する
			playerList.Close();
		}

		//WM_CREATE時処理
		private void Casino_Load(object sender, EventArgs e)
		{
			//メニュー作成
			SetMenu();
			//ツールバーとステータスバー作成
			SetBars();
			//賽子の作成
			SetDices();
			//PlayerListを子フォームとして表示する
			playerList = new PlayerList();
			playerList.Show(this);
		}

		//サイズが変更された場合
		protected override void OnSizeChanged(EventArgs e)
		{
			base.OnSizeChanged(e);
			//Diceコントロールが作成される前に呼び出される可能性があるので
			if(dice1 != null && dice2 != null && dice3 != null)
			{
				dice1.Location = new Point(ClientSize.Width / 2 - 32 - 16 - 64, ClientSize.Height / 2 - 32);
				dice2.Location = new Point(ClientSize.Width / 2 - 32, ClientSize.Height / 2 - 32);
				dice3.Location = new Point(ClientSize.Width / 2 + 32 + 16, ClientSize.Height / 2 - 32);
			}
		}

		//終了時処理
		protected override void OnFormClosing(FormClosingEventArgs e)
		{
			base.OnFormClosing(e);
			DialogResult dr = MessageBox.Show("終了しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
			if(dr == DialogResult.No)
				e.Cancel = true;
			else
			{
				//勝負終了後、参加博徒の最終成績を更新する
				for(int i = 0; i < NoOfBakuto; i++)
					Bakuto[i].FinalRecord();
			}
		}

		//メニューの設定
		protected void SetMenu()
		{
			//メニュー作成
			MainMenu menu = new MainMenu();
			Menu = menu;
			//メニューアイテム付加
			MenuItem miFile = new MenuItem();		//「ファイル」メニュー
			miFile.Text = "ファイル(&F)";
			miFile.Index = 0;
			menu.MenuItems.Add(miFile);
			MenuItem miHelp = new MenuItem();		//「ヘルプ」メニュー
			miHelp.Text = "ヘルプ(&H)";
			miHelp.Index = 1;
			menu.MenuItems.Add(miHelp);
			miOpen = new MenuItem();				//「開帳」メニューアイテム
			miOpen.Text = "開帳(&O)";
			miOpen.Index = 0;
			miOpen.Click += OnOpen_Click;
			miOpen.Shortcut = Shortcut.CtrlO;
			miFile.MenuItems.Add(miOpen);
			miGo = new MenuItem();					//「開始」メニューアイテム
			miGo.Text = "開始(&G)";
			miGo.Index = 1;
			miGo.Click += OnGo_Click;
			miGo.Shortcut = Shortcut.CtrlG;
			miGo.Enabled = false;					//起動時は無効化する
			miFile.MenuItems.Add(miGo);
			miFile.MenuItems.Add("-");				//セパレーター
			MenuItem miExit = new MenuItem();		//「終了」メニューアイテム
			miExit.Text = "終了(&X)";
			miExit.Index = 2;
			miExit.Click += OnExit_Click;
			miExit.Shortcut = Shortcut.CtrlX;
			miFile.MenuItems.Add(miExit);
			MenuItem miHowtoUse = new MenuItem();	//「使い方」メニューアイテム
			miHowtoUse.Text = "使い方(&U)";
			miHowtoUse.Index = 0;
			miHowtoUse.Click += OnHowtoUse_Click;
			miHelp.MenuItems.Add(miHowtoUse);
			MenuItem miPlayerView = new MenuItem();	//「博徒参照」メニューアイテム
			miPlayerView.Text = "博徒ファイル参照(&P)";
			miPlayerView.Index = 0;
			miPlayerView.Click += OnPlayerView_Click;
			miHelp.MenuItems.Add(miPlayerView);
			MenuItem miVer = new MenuItem();		//「バージョン」メニューアイテム
			miVer.Text = "バージョン(&V)";
			miVer.Index = 1;
			miVer.Click += OnVersion_Click;
			miVer.Shortcut = Shortcut.CtrlV;
			miHelp.MenuItems.Add(miVer);
		}

		//ツールバーとステータスバーの設定
		protected void SetBars()
		{
			//フォームのレイアウトを一時停止
			this.SuspendLayout();
			//ToolStripクラスインスタンスの生成
			this.toolStrip = new ToolStrip();
			//ツールバーのレイアウトを一時停止
			this.toolStrip.SuspendLayout();
			//ToolStripButton配列を作成
			this.toolStripButton = new ToolStripButton[5];
			//本プログラムの埋め込みリソース（Chinchirorin）のリソースマネージャーを作成
			Assembly asm = Assembly.GetExecutingAssembly();
			ResourceManager rm = new ResourceManager("Chinchirorin", asm);
			//フォームの背景を貼る
			this.BackgroundImage = (Bitmap)rm.GetObject("bmpBack");					//サイズ 454 x 340
			//ToolStripButton[0]を作成
			this.toolStripButton[0] = new ToolStripButton();
			this.toolStripButton[0].Text = "開帳(&O)";								//テキスト設定
			this.toolStripButton[0].Image = (Bitmap)rm.GetObject("bmpOpen");		//画像設定
			this.toolStripButton[0].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[0].Click += OnOpen_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[0]);						//ボタンを追加
			//ToolStripButton[1]を作成
			this.toolStripButton[1] = new ToolStripButton();
			this.toolStripButton[1].Text = "開始(&G)";								//テキスト設定
			this.toolStripButton[1].Image = (Bitmap)rm.GetObject("bmpGo");			//画像設定
			this.toolStripButton[1].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[1].Click += OnGo_Click;							//Clickイベントハンドラ追加
			this.toolStripButton[1].Enabled = false;								//起動時は無効化する
			this.toolStrip.Items.Add(this.toolStripButton[1]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[2]を作成
			this.toolStripButton[2] = new ToolStripButton();
			this.toolStripButton[2].Text = "終了(&X)";								//テキスト設定
			this.toolStripButton[2].Image = (Bitmap)rm.GetObject("bmpExit");		//画像設定
			this.toolStripButton[2].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[2].Click += OnExit_Click;							//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[2]);						//ボタンを追加
			//セパレーターを挿入
			this.toolStrip.Items.Add(new ToolStripSeparator());
			//ToolStripButton[3]を作成
			this.toolStripButton[3] = new ToolStripButton();
			this.toolStripButton[3].Text = "使い方(&U)";							//テキスト設定
			this.toolStripButton[3].Image = (Bitmap)rm.GetObject("bmpHelp");		//画像設定
			this.toolStripButton[3].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[3].Click += OnHowtoUse_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[3]);						//ボタンを追加
			//ToolStripButton[4]を作成
			this.toolStripButton[4] = new ToolStripButton();
			this.toolStripButton[4].Text = "バージョン情報(&V)";					//テキスト設定
			this.toolStripButton[4].Image = (Bitmap)rm.GetObject("bmpVersion");		//画像設定
			this.toolStripButton[4].DisplayStyle = ToolStripItemDisplayStyle.Image;	//画像表示のみ
			this.toolStripButton[4].Click += OnVersion_Click;						//Clickイベントハンドラ追加
			this.toolStrip.Items.Add(this.toolStripButton[4]);						//ボタンを追加
			//ツールバーの設定
			this.Controls.Add(this.toolStrip);
			//ツールバーのレイアウトを再開
			this.toolStrip.ResumeLayout(false);
			this.toolStrip.PerformLayout();

			//StatusStripクラスインスタンスの生成
			this.statusStrip = new StatusStrip();
			//ステータスバーにパネルとテキストを追加
			tssl = new ToolStripStatusLabel[3];
			tssl[0] = new ToolStripStatusLabel();
			tssl[0].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[0].BorderStyle = Border3DStyle.SunkenInner;
			tssl[0].BackColor = SystemColors.Control;
			tssl[0].Text = "Chinchirorin Version 1.0";
			tssl[0].AutoSize = true;
			tssl[0].TextAlign = ContentAlignment.MiddleLeft;
			tssl[1] = new ToolStripStatusLabel();
			tssl[1].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[1].BorderStyle = Border3DStyle.SunkenInner;
			tssl[1].BackColor = SystemColors.Control;
			tssl[1].Text = "（親）";
			tssl[1].AutoSize = true;
			tssl[1].TextAlign = ContentAlignment.MiddleLeft;
			tssl[2] = new ToolStripStatusLabel();
			tssl[2].BorderSides = ToolStripStatusLabelBorderSides.All;
			tssl[2].BorderStyle = Border3DStyle.SunkenInner;
			tssl[2].BackColor = SystemColors.Control;
			tssl[2].Text = "対（子）";
			tssl[2].Spring = true;
			tssl[2].TextAlign = ContentAlignment.MiddleLeft;
			statusStrip.Items.AddRange(tssl);
			statusStrip.ShowItemToolTips = true;	//ToolTip表示
			this.Controls.Add(this.statusStrip);	//StatusStrip(ステータスバー)を追加

			//メインフォームのレイアウトを再開
			this.ResumeLayout(false);
			this.PerformLayout();
		}

		//Diceコントロールの作成
		protected void SetDices()
		{
			//Dice1
			dice1 = new Dice();
			dice1.Size = new Size(64, 64);
			dice1.Location = new Point(ClientSize.Width / 2 - 32 - 16 - 64, ClientSize.Height / 2 - 32);
			dice1.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
			dice1.Visible = false;
			this.Controls.Add(dice1);

			//Dice2
			dice2 = new Dice();
			dice2.Size = new Size(64, 64);
			dice2.Location = new Point(ClientSize.Width / 2 - 32, ClientSize.Height / 2 - 32);
			dice2.Anchor = AnchorStyles.Top;
			dice2.Visible = false;
			this.Controls.Add(dice2);

			//Dice3
			dice3 = new Dice();
			dice3.Size = new Size(64, 64);
			dice3.Location = new Point(ClientSize.Width / 2 + 32 + 16, ClientSize.Height / 2 - 32);
			dice3.Anchor = (AnchorStyles.Top | AnchorStyles.Right);
			dice3.Visible = false;
			this.Controls.Add(dice3);
		}

		//「開帳」メニュー処理
		private void OnOpen_Click(object sender, EventArgs e)
		{
			if(playerList.Players_List != "")
			{
				miOpen.Enabled = false;
				miGo.Enabled = true;
				toolStripButton[0].Enabled = false;
				toolStripButton[1].Enabled = true;
				string [] names = playerList.Players_List.Split(',');
				NoOfBakuto = names.Count();			//博徒の数
				Bakuto = new Player[NoOfBakuto];
				LastBet = new int[NoOfBakuto];
				for(int i = 0; i < NoOfBakuto; i++)
				{
					Bakuto[i] = new Player(names[i]);
				}
				MessageBox.Show(playerList.Players_List + "のメンバーでチンチロリンの賭場を開きます。\r\n親決めの後、「開始」メニューを選択してください。", "開帳", MessageBoxButtons.OK, MessageBoxIcon.Information);
				//親決め
				SelectBanker(NoOfBakuto);			//結果はBankerに代入される
			}
			else
				MessageBox.Show("博徒が選択されていません。\r\n\"Player List\"を右クリックし、参加する博徒を確定してください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}

		//「開始」メニュー処理
		private void OnGo_Click(object sender, EventArgs e)
		{
			//破産博徒数をチェックする
			NoOfBankrupt = 0;
			for(int i = 0; i < NoOfBakuto; i++)
			{
				if(Bakuto[i].IsBankrupt)
					NoOfBankrupt++;
			}
			//有効博徒が一人以下になった場合
			if(NoOfBakuto - NoOfBankrupt < 2)
			{
				MessageBox.Show("破産者多数で終了します。", "破産者多数による終了", MessageBoxButtons.OK, MessageBoxIcon.Information);
				return;
			}
			//コマを張る（掛け金を設定する）
			Place_Bets();
			//チンチロリン勝負
			for(int i = 0; i < NoOfBakuto; i++)
			{
				//対戦当事者の表示（すぐに反映させるためにツールバーを再描画する）
				tssl[2].Text = " 対 " + Bakuto[i].Name;
				this.Refresh();
				if(i == Banker)				//親であればスキップ
					continue;
				if(Bakuto[i].IsBankrupt)	//破産者であればスキップ
					continue;
				if(Match(i))				//引数はBakuto[]配列の引数、戻り値は親落ちか否か
				{
					ChangeBanker();
					MessageBox.Show("親落ちしました。\r\n新たに「開始」メニューを選択してください。", "親落ち終了", MessageBoxButtons.OK, MessageBoxIcon.Information);
					Place_Bets(false);		//賭金」「勝負結果」をブランクにする
					return;
				}
				playerList.SetTextInSubItems(Banker, 3, "");		//Bankerの「勝負結果」をクリアする
				playerList.SetTextInSubItems(i, 2, "");				//roller（対戦する小型）の「賭金」をクリアする
				playerList.SetTextInSubItems(i, 3, "");				//roller（対戦する小型）の「勝負結果」をクリアする
			}
			MessageBox.Show("子方が一巡しました。\r\n新たに「開始」メニューを選択してください。", "一巡終了", MessageBoxButtons.OK, MessageBoxIcon.Information);
			Place_Bets(false);				//賭金」「勝負結果」をブランクにする
		}

		//「終了」メニュー処理
		private void OnExit_Click(object sender, EventArgs e)
		{
			Close();	//修了確認はOnClosingメソッドで行う
		}

		//「使い方」メニュー処理
		private void OnHowtoUse_Click(object sender, EventArgs e)
		{
			//HTML HelpでChinchirorinHelp.chmを表示する
			ProcessStartInfo pInfo = new ProcessStartInfo();
			pInfo.FileName = "hh";
			pInfo.Arguments = ".\\ChinchirorinHelp.chm";
			Process.Start(pInfo);
		}

		//「博徒参照」メニュー処理
		private void OnPlayerView_Click(object sender, EventArgs e)
		{
			PlayerView pv = new PlayerView();
			pv.ShowDialog(this);
			pv.Dispose();
		}

		//「バージョン」メニュー処理
		private void OnVersion_Click(object sender, EventArgs e)
		{
			VersionDlg verDlg = new VersionDlg(this.Icon);
			verDlg.ShowDialog();
			verDlg.Dispose();
		}

		/////////////
		//初回親決め
		/////////////
		private void SelectBanker(int num)
		{
			MessageBox.Show("参加者全員がサイコロを振って出した数が最も大きい者を親にします。\r\n同じ数なら先に振ったものが親となります。", "親決め", MessageBoxButtons.OK, MessageBoxIcon.Information);
			dice2.Visible = true;
			int Max = 0;
			for(int i = 0; i < num; i++)
			{
				dice2.DiceSound();
				int roll = dice2.Roll();
				MessageBox.Show(Bakuto[i].Name + "の出目は" + roll.ToString() + "です。", Bakuto[i].Name, MessageBoxButtons.OK, MessageBoxIcon.Information);
				if(Max < roll)
				{
					Banker = i;
					Max = roll;
				}
			}
			dice2.Visible = false;
			MessageBox.Show(Bakuto[Banker].Name + "が親になりました。", "親決め", MessageBoxButtons.OK, MessageBoxIcon.Information);
			playerList.SetTextInSubItems(Banker, 1, "〇");	//Player Listに親の〇をつける
			tssl[1].Text = Bakuto[Banker].Name;				//親の表示
		}

		/////////////////////
		//コマ（賭金）を張る
		/////////////////////
		private void Place_Bets(bool flag = true)
		{
			for(int i = 0; i < NoOfBakuto; i++)
			{
				if(flag)	//引数をtrueにすると「賭金」を表示する
				{
					if(i == Banker)					//親であればスキップ
						continue;
					if(Bakuto[i].IsBankrupt)		//破産者であればスキップ
						continue;
					if(Bakuto[i].Name == "あなた")	//ユーザープレイヤーであれば
					{								//賭金入力ダイアログで設定する（初期値はBet()の戻り値）
						InputBetDlg ibDlg = new InputBetDlg(this.Icon, Bakuto[0]);
						ibDlg.ShowDialog();
						LastBet[i] = ibDlg.Bet;
						ibDlg.Dispose();
					}
					else
						LastBet[i] = Bakuto[i].Bet();	//博徒の最新賭金を記録する
					playerList.SetTextInSubItems(i, 2, String.Format("{0:C}", LastBet[i]));	//通貨表示
				}
				else		//引数をfalseにすると「賭金」「勝負結果」をブランクにする
				{
					playerList.SetTextInSubItems(i, 2, "");
					playerList.SetTextInSubItems(i, 3, "");
				}
			}
		}

		/////////////////////
		//チンチロリン一勝負
		/////////////////////
		private bool Match(int roller)	//親Bakuto[Banker]と子Bakuto[roller]の対局
		{
			//戻り値（true－親落ち、false－続投）
			bool change = false;
			//賽子を表示する
			dice1.Visible = true;
			dice2.Visible = true;
			dice3.Visible = true;
			int result = 0;		//賽子を振った結果（WinOrNotメソッドの戻り値）
			//親（Banker）の投賽
			for(int i = 0; i < 3; i++) 	//目無し（0）の場合、3回迄続けられる
			{
				//投賽処理
				dice1.DiceSound(false);		//代表して投賽音を鳴らす
				result = WinOrNot(dice1.Roll(), dice2.Roll(), dice3.Roll());
				if(result != 0)
					break;
			}
			//結果処理
			string str = "";
			if(result < 4)
			{	//resultは勝ち（正）または負け（負）で掛金の倍数
				if(result == 0)
				{
					str = "親の負け：目無しでした。";
					Bakuto[Banker].Update(-LastBet[roller]);
					playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", -LastBet[roller]));
					Bakuto[roller].Update(LastBet[roller]);
					playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", LastBet[roller]));
					change = true;
				}
				else if(result > 0)
				{
					str = "親の勝ち：親の" + result.ToString() + "倍取りです。";
					Bakuto[Banker].Update(LastBet[roller] * result);
					playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", LastBet[roller] * result));
					Bakuto[roller].Update(-LastBet[roller] * result);
					playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", -LastBet[roller] * result));
 				}
				else
				{
					str = "親の負け：親の" + (-result).ToString() + "倍付けです。";
					Bakuto[Banker].Update(LastBet[roller] * result);
					playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", LastBet[roller] * result));
					Bakuto[roller].Update(LastBet[roller] * -result);
					playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", LastBet[roller] * -result));
					change = true;
				}
			}
			else
			{
				//親の出目 = result -2;
				int banker_roll = result -2;	//2～5の場合の親の出目
				MessageBox.Show("親の出目は" + banker_roll.ToString() + "でした。", "親の出目", MessageBoxButtons.OK, MessageBoxIcon.Information);
				//子（roller）の投賽
				for(int i = 0; i < 3; i++) 	//目無し（0）の場合、3回迄続けられる
				{
					//投賽処理
					dice1.DiceSound(false);		//代表して投賽音を鳴らす
					result = WinOrNot(dice1.Roll(), dice2.Roll(), dice3.Roll());
					if(result != 0)
						break;
				}
				//結果処理
				if(result < 4)
				{	//resultは勝ち（正）または負け（負）で掛金の倍数
					if(result == 0)
					{
						str = "子の負け：目無しでした。";
						Bakuto[Banker].Update(LastBet[roller]);
						playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", LastBet[roller]));
						Bakuto[roller].Update(-LastBet[roller]);
						playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", -LastBet[roller]));
					}
					else if(result > 0)
					{
						str = "子の勝ち：子の" + result.ToString() + "倍取りです。";
						Bakuto[Banker].Update(-LastBet[roller] * result);
						playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", -LastBet[roller] * result));
						Bakuto[roller].Update(LastBet[roller] * result);
						playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", LastBet[roller] * result));
					}
					else
					{
						str = "子の負け：子の" + (-result).ToString() + "倍付けです。";
						Bakuto[Banker].Update(LastBet[roller] * -result);
						playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", LastBet[roller] * -result));
						Bakuto[roller].Update(LastBet[roller] * result);
						playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", LastBet[roller] * result));
					}
				}
				else
				{
					//子の出目 = result -2;
					if(banker_roll > result - 2)
					{
						str = "子の負け：親（" + banker_roll.ToString() + "）対子（" + (result - 2).ToString() + "）で負け。";
						Bakuto[Banker].Update(LastBet[roller]);
						playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", LastBet[roller]));
						Bakuto[roller].Update(-LastBet[roller]);
						playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", -LastBet[roller]));
					}
					else if(banker_roll == result - 2)
					{
						Bakuto[Banker].Update();
						Bakuto[roller].Update();
						str = "引き分け：親（" + banker_roll.ToString() + "）対子（" + (result - 2).ToString() + "）で分け。";
					}
					else
					{
						str = "子の勝ち：親（" + banker_roll.ToString() + "）対子（" + (result - 2).ToString() + "）で勝ち。";
						Bakuto[Banker].Update(-LastBet[roller]);
						playerList.SetTextInSubItems(Banker, 3, String.Format("{0:C}", -LastBet[roller]));
						Bakuto[roller].Update(LastBet[roller]);
						playerList.SetTextInSubItems(roller, 3, String.Format("{0:C}", LastBet[roller]));
					}
				}
			}
			MessageBox.Show(str, "チンチロリン勝負", MessageBoxButtons.OK, MessageBoxIcon.Information);
			//賽子を非表示にする
			dice1.Visible = false;
			dice2.Visible = false;
			dice3.Visible = false;
			//戻り値がtrueなら親落ち
			return change;
		}

		//////////////////////////////////////////
		//チンチロリン勝敗判定
		//戻り値：0（出目無し－3回まで投賽可能）
		//正－勝  1－1倍取り（出目6）
		//負－負  2－2倍取り（シゴロ－456）
		//        3－3倍取り（アラシ－ゾロ目）
		//       -1－1倍付け（出目1）
		//       -2－2倍付け（ヒフミ－123）
		//     4～7－出目の数（2～5の目）
		//////////////////////////////////////////
		private int WinOrNot(int D1, int D2, int D3)
		{
			int Num_OR = D1 | D2 | D3;
			int Num_AND = D1 & D2 & D3;
			int Num_XOR = D1 ^ D2 ^ D3;
			bool Num_EQ = (D1 == D2) | (D2 == D3) | (D3 == D1);
			if(Num_OR == Num_AND)					//アラシの場合
			{
				return 3;
			}
			else if(Num_XOR == 7 && Num_AND == 4)	//456の場合
			{
				return 2;
			}
			else if(Num_XOR == 0 && Num_OR == 3)	//123の場合
			{
				return -2;
			}
			else if(Num_EQ)							//目が出た場合
			{
				if(Num_XOR == 6)					//6の目の場合
				{
					return 1;
				}
				else if(Num_XOR == 1)				//1の目の場合
				{
					return -1;
				}
				else								//その他の目が出た場合
				{
					return Num_XOR + 2;
				}
			}
			else									//役も目も出ない場合
				return 0;
		}

		///////////////
		//親落ち・変更
		///////////////
		private void ChangeBanker()
		{
			//旧親の〇印を消す
			playerList.SetTextInSubItems(Banker, 1, "");
			//廻り胴なので次の親候補を仮親とする
			Banker++;
			if(Banker == NoOfBakuto)	//既に最後の博徒（[NoOfBakuto - 1]）まで来ていたら
				Banker -= NoOfBakuto;	//最初の博徒（0）に戻る
			//仮親が破産者の場合、その次にする
			for(int i = 0; i < NoOfBakuto - 1; i++)	//前の親は対象外なので（博徒数- 1）繰り返す
			{
				if(Bakuto[Banker].IsBankrupt)		//破産チェック
				{
					Banker++;
					if(Banker == NoOfBakuto)		//既に最後の博徒（NoOfBakuto - 1）まで来ていたら
						Banker -= NoOfBakuto;		//最初の博徒（0）に戻る
				}
				else								//破産者ではない
					break;							//その博徒に決定する
			}
			//新親に〇印をつける
			playerList.SetTextInSubItems(Banker, 1, "〇");
			//親の表示
			tssl[1].Text = Bakuto[Banker].Name;
		}
	}

	/////////////////////
	// PlayerListクラス
	/////////////////////
	public class PlayerList : Form
	{
		//フォームの「閉じるボタン」を無効化する
		//出典：https://www.codeproject.com/Articles/20379/Disabling-Close-Button-on-Forms
		private const int CP_NOCLOSE_BUTTON = 0x200;
		protected override CreateParams CreateParams
		{
			get
			{
				CreateParams myCp = base.CreateParams;
				myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON ;
				return myCp;
			}
		}

		//クラスメンバー変数
		public string Players_List = "";		//カンマ区切りプレーヤーリスト
		ListView player_List;					//プレーヤーリスト用リストビュー
		ContextMenu contextMenu;				//コンテキストメニュー
		MenuItem mi1, mi2, mi3;					//コンテキストメニューアイテム

		public PlayerList()
		{
			this.FormBorderStyle = FormBorderStyle.FixedSingle;	//サイズの変更を不可にする
			this.ClientSize = new Size(640, 137);	//親子合計6名
			this.BackColor = SystemColors.Window;
			this.MaximizeBox = false;				//最大化ボタンを非表示
			this.MinimizeBox = true;				//最小化ボタンを表示
			this.ShowInTaskbar = false;				//タスクバー上表示
			this.Left = 570;
			this.Top = 100;
			this.StartPosition = FormStartPosition.Manual;
			this.Text = "Player List";
			this.Load += new EventHandler(PlayerList_Load);
		}

		//WM_CREATE時処理
		private void PlayerList_Load(object sender, EventArgs e)
		{
			//リストビューの生成とプロパティの設定
			player_List = new ListView();
			player_List.Size = new Size(ClientSize.Width - 20, ClientSize.Height - 20);	//サイズ
			player_List.Location = new Point(10,  10);			//位置
			player_List.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			player_List.FullRowSelect = true;					//一行選択
			player_List.GridLines = true;						//グリッドラインの表示
			player_List.MultiSelect = true;						//複数選択を許す
			player_List.HoverSelection = false;					//ポイントで選択できるようにする
			player_List.Activation = ItemActivation.OneClick;	//シングルクリック選択
			player_List.CheckBoxes = false;						//チェックボックス無効化
			player_List.View = View.Details;					//リストビューの表示方法
			player_List.Scrollable = true;						//スクロールバーを表示
			//イベントハンドラの追加
			player_List.ColumnClick += new ColumnClickEventHandler(OnLV_ColumnClick);
			//ヘッダー定義
			player_List.Columns.Add("博徒名", 160, HorizontalAlignment.Left);
			player_List.Columns.Add("親", 32, HorizontalAlignment.Center);
			player_List.Columns.Add("賭金", 80, HorizontalAlignment.Center);
			player_List.Columns.Add("勝負結果", 344, HorizontalAlignment.Center);
			player_List.Columns.Add("破産者", 80, HorizontalAlignment.Center);
			player_List.Columns.Add("累計勝負数", 120, HorizontalAlignment.Center);
			player_List.Columns.Add("累計勝数", 120, HorizontalAlignment.Center);
			player_List.Columns.Add("累計負数", 120, HorizontalAlignment.Center);
			player_List.Columns.Add("累計勝率", 120, HorizontalAlignment.Center);
			//コンテキストメニュー関連
			mi1 = new MenuItem();
			mi1.Index = 0;
			mi1.Text = "博徒の読み込み";
			mi2 = new MenuItem();
			mi2.Index = 0;
			mi2.Text = "博徒の削除";
			mi2.Enabled = false;				//博徒を読み込んだ時に有効にする
 			mi3 = new MenuItem();
			mi3.Index = 0;
			mi3.Text = "確定";
			mi3.Enabled = false;				//定員が6名以内になった時に有効にする
 			contextMenu = new ContextMenu();
			contextMenu.MenuItems.Add(mi1);
			contextMenu.MenuItems.Add(mi2);
			contextMenu.MenuItems.Add("-");		//セパレーター
			contextMenu.MenuItems.Add(mi3);
 			player_List.ContextMenu = contextMenu;
			mi1.Click += new EventHandler(Read_Players);
			mi2.Click += new EventHandler(Del_Player);
			mi3.Click += new EventHandler(Done);
			//FormにListViewを追加
			this.Controls.Add(player_List);
		}

		//player_Listのコラムがクリックされた時
		private void OnLV_ColumnClick(object sender, ColumnClickEventArgs e)
		{
			//ListViewItemSorterを指定する
			player_List.ListViewItemSorter = new ListViewItemComparer(e.Column);
			//正順、逆順交互に並び替える（ListViewItemSorterを設定するとSortが自動的に呼び出される）
		}

		//「博徒の読み込み」処理
		public void Read_Players(object sender, EventArgs e)
		{
			//Playersフォールダーのデータファイルを読む
			GetDataFiles();
			if(player_List.Items.Count > 2)	//最低でも博徒は2名必要
				mi2.Enabled = true;
		}

		//「博徒の削除」処理
		public void Del_Player(object sender, EventArgs e)
		{
			int count = player_List.Items.Count;
			if(count > 2)
			{
				foreach(ListViewItem item in player_List.SelectedItems)
				{
					DialogResult dr = MessageBox.Show("博徒" + item.Text + "を削除しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
					if(dr == DialogResult.Yes)
					{
						//選択された博徒を削除する
						item.Remove();
						count--;
						if(count == 2)
						{
							MessageBox.Show("これ以上博徒を削除できません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
							mi2.Enabled = false;
							break;
						}
					}
				}
				if(count > 6)
					MessageBox.Show("まだ定員（6名）を" + (count - 6) + "名オーバーしています。除外する博徒をクリックしてください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				else
					mi3.Enabled = true;
			}
			else
			{
				MessageBox.Show("これ以上博徒を削除できません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				mi2.Enabled = false;
			}
			return;
		}

		//「確定」処理
		public void Done(object sender, EventArgs e)
		{
			//博徒名のリストを作成する
			for(int i = 0; i < player_List.Items.Count; i++)
			//{ListViewItem item in player_List.Items)
			{
				Players_List += player_List.Items[i].Text.TrimEnd();	//Textには"\r\n"が付いているので
				if(i < player_List.Items.Count - 1)
					Players_List += ",";
			}
			//ポップアップメニューを無効にする
			mi1.Enabled = false;
			mi2.Enabled = false;
			mi3.Enabled = false;
			MessageBox.Show("参加博徒が確定しました\r\nChinchirorin Casinoに戻って「開帳」メニューを選択してください。", "参加博徒確定", MessageBoxButtons.OK, MessageBoxIcon.Information);
			//親フォームにフォーカスを当てる
			this.Owner.Activate();
		}

		//Playersフォールダーの*.datファイルを取得
		public void GetDataFiles()
		{
			//ListViewのデータをクリアする
			player_List.Items.Clear();
			//Playersフォールダーの*.datファイルを表示
			IEnumerable<string> files = null;
			files = Directory.EnumerateFiles(".\\Players", "*.dat", SearchOption.TopDirectoryOnly);
			int count = 0;
			foreach (string file in files)
			{
				string temp = file.Replace(".\\Players\\", "");
				Player pl = new Player(temp.Replace(".dat", ""));
				ListViewItem item = player_List.Items.Add(pl.Name);
				item.SubItems.Add("");
				item.SubItems.Add("");
				item.SubItems.Add("");
				if(pl.IsBankrupt)
					item.SubItems.Add("Yes");
				else
					item.SubItems.Add("-");
				item.SubItems.Add(String.Format("{0:#,0}", pl.TotalGames));
				item.SubItems.Add(String.Format("{0:#,0}", pl.TotalWins));
				item.SubItems.Add(String.Format("{0:#,0}", pl.TotalLoses));
				if(pl.TotalGames > 0)
				{
					double rate = (double)pl.TotalWins / (double)pl.TotalGames;
					item.SubItems.Add(String.Format("{0:P3}", rate));
				}
				else
					item.SubItems.Add("N/A");
				count++;
			}
			if(count > 6)
				MessageBox.Show("定員（6名）を" + (count - 6) + "名オーバーしています。除外する博徒をクリックしてください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
			else
				mi3.Enabled = true;
		}

		//PlayerのSubItemsに文字列を設定する
		public bool SetTextInSubItems(int row, int column, string data)
		{
			if(column <= 0 || column > 3)		//エラーチェック
				return false;
			if(row >= player_List.Items.Count)
				return false;
			player_List.Items[row].SubItems[column].Text = data;
			player_List.Refresh();				//再描画
			return true;
		}
	}

	/////////////////////
	// PlayerViewクラス
	/////////////////////
	public class PlayerView : Form
	{
		//クラスメンバー変数
		ListView Player_View;					//プレーヤーリスト用リストビュー
		ContextMenu contextMenu;				//コンテキストメニュー
		MenuItem mi0, mi1, mi2, mi3;			//コンテキストメニューアイテム
		Form dlg;								//博徒名入力ダイアログ
		TextBox txb;							//同上ダイアログの入力テキストボックス
		Button btn;								//同上ダイアログの「決定」ボタン

		public PlayerView()
		{
			this.ClientSize = new Size(640, 137);
			this.BackColor = SystemColors.Window;
			this.ShowInTaskbar = false;			//タスクバー上表示
			this.Left = 580;
			this.Top = 110;
			this.StartPosition = FormStartPosition.Manual;
			this.Text = "Player View";
			this.Load += new EventHandler(PlayerView_Load);
		}

		//WM_CREATE時処理
		private void PlayerView_Load(object sender, EventArgs e)
		{
			//リストビューの生成とプロパティの設定
			Player_View = new ListView();
			Player_View.Size = new Size(ClientSize.Width - 20, ClientSize.Height - 20);	//サイズ
			Player_View.Location = new Point(10,  10);			//位置
			Player_View.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right);
			Player_View.FullRowSelect = true;					//一行選択
			Player_View.GridLines = true;						//グリッドラインの表示
			Player_View.MultiSelect = true;						//複数選択を許す
			Player_View.Activation = ItemActivation.OneClick;	//シングルクリック選択
			Player_View.CheckBoxes = false;						//チェックボックス無効化
			Player_View.View = View.Details;					//リストビューの表示方法
			Player_View.Scrollable = true;						//スクロールバーを表示
			//イベントハンドラの追加
			Player_View.ColumnClick += new ColumnClickEventHandler(OnLV_ColumnClick);
			//ヘッダー定義
			Player_View.Columns.Add("博徒ファイル名", 152, HorizontalAlignment.Left);
			Player_View.Columns.Add("破産", 48, HorizontalAlignment.Center);
			Player_View.Columns.Add("所持金", 120, HorizontalAlignment.Center);
			Player_View.Columns.Add("運", 48, HorizontalAlignment.Center);
			Player_View.Columns.Add("強気", 48, HorizontalAlignment.Center);
			Player_View.Columns.Add("累計勝負数", 120, HorizontalAlignment.Center);
			Player_View.Columns.Add("累計勝数", 80, HorizontalAlignment.Center);
			Player_View.Columns.Add("累計負数", 80, HorizontalAlignment.Center);
			Player_View.Columns.Add("累計勝率", 80, HorizontalAlignment.Center);
			//コンテキストメニュー関連
			mi0 = new MenuItem();
			mi0.Index = 0;
			mi0.Text = "博徒ファイルの新規作成";
			mi1 = new MenuItem();
			mi1.Index = 0;
			mi1.Text = "博徒ファイルの読み込み";
			mi2 = new MenuItem();
			mi2.Index = 0;
			mi2.Text = "博徒ファイルの削除";
 			mi3 = new MenuItem();
			mi3.Index = 0;
			mi3.Text = "終了";
 			contextMenu = new ContextMenu();
			contextMenu.MenuItems.Add(mi0);
			contextMenu.MenuItems.Add(mi1);
			contextMenu.MenuItems.Add(mi2);
			contextMenu.MenuItems.Add("-");		//セパレーター
			contextMenu.MenuItems.Add(mi3);
 			Player_View.ContextMenu = contextMenu;
			mi0.Click += new EventHandler(Make_Player);
			mi1.Click += new EventHandler(Read_Players);
			mi2.Click += new EventHandler(Del_Player);
			mi3.Click += new EventHandler(Done);
			//FormにListViewを追加
			this.Controls.Add(Player_View);
			//初期的に博徒ファイルを読み込む
			Read_Players(this, new EventArgs());
		}

		//Player_Viewのコラムがクリックされた時
		private void OnLV_ColumnClick(object sender, ColumnClickEventArgs e)
		{
			//ListViewItemSorterを指定する
			Player_View.ListViewItemSorter = new ListViewItemComparer(e.Column);
			//正順、逆順交互に並び替える（ListViewItemSorterを設定するとSortが自動的に呼び出される）
		}

		//「博徒ファイルの新規作成」処理
		public void Make_Player(object sender, EventArgs e)
		{
			//入力ダイアログを作る
			dlg = new Form();
			dlg.FormBorderStyle = FormBorderStyle.FixedSingle;	//サイズの変更を不可にする
			dlg.Size = new Size(240, 120);
			dlg.StartPosition = FormStartPosition.CenterParent;
			dlg.Text = "博徒名の入力";
			Label lbl = new Label();
			lbl.Size = new Size(200, 18);
			lbl.Location = new Point(10, 10);
			lbl.Text = "博徒名を入力してください。";
			dlg.Controls.Add(lbl);
			txb = new TextBox();
			txb.Size = new Size(200, 24);
			txb.Location = new Point(10, lbl.Height + 10);
			txb.Text = "（博徒名）";
			dlg.Controls.Add(txb);
			btn = new Button();
			btn.Size = new Size(48, 24);
			btn.Location = new Point(dlg.Width / 2 - 24, lbl.Height + txb.Height + 20);
			btn.Text = "決定";
			btn.Click += new EventHandler(btn_Click);
			dlg.Controls.Add(btn);
			dlg.ShowDialog(this);
		}

		//「博徒ファイルの新規作成」の名前入力ダイアログの処理
		public void btn_Click(object sender, EventArgs e)
		{
			if(txb.Text == "" || txb.Text == "（博徒名）")
			{
				MessageBox.Show("博徒の名前を正しく入力してください。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
			else
			{
				//Playerクラスインスタンスを作成、datファイルを書き込む
				Player pl = new Player(txb.Text);
				pl.FinalRecord();
				//博徒ファイルを再度読み込む
				GetDataFiles();
				//博徒名入力ダイアログを開放する
				dlg.Dispose();
			}
		}

		//「博徒ファイルの読み込み」処理
		public void Read_Players(object sender, EventArgs e)
		{
			//Playersフォールダーのデータファイルを読む
			GetDataFiles();
		}

		//「博徒ファイルの削除」処理
		public void Del_Player(object sender, EventArgs e)
		{
			if(Player_View.SelectedItems.Count < 1)
			{
				MessageBox.Show("削除する博徒名ファイルが未選択です。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
			else
			{
				foreach(ListViewItem item in Player_View.SelectedItems)
				{
					DialogResult dr = MessageBox.Show("博徒" + item.Text + "ファイルを削除しますか？", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
					if(dr == DialogResult.Yes)
					{
						//選択された博徒ファイルを削除
						File.Delete(".\\Players\\" + item.Text);	//ファイル削除
						item.Remove();						//リストビューから削除
					}
				}
			}
		}

		//「確定」処理
		public void Done(object sender, EventArgs e)
		{
			Close();
		}

		//Playersフォールダーの*.datファイルを取得
		public void GetDataFiles()
		{
			//ListViewのデータをクリアする
			Player_View.Items.Clear();
			//Playersフォールダーの*.datファイルを表示
			IEnumerable<string> files = null;
			files = Directory.EnumerateFiles(".\\Players", "*.dat", SearchOption.TopDirectoryOnly);
			foreach (string file in files)
			{
				string fn = file.Replace(".\\Players\\", "");
				Player pl = new Player(fn.Replace(".dat", ""));
				ListViewItem item = Player_View.Items.Add(fn);
				item.SubItems.Add(pl.IsBankrupt.ToString());
				item.SubItems.Add(String.Format("{0:C}", pl.Capital));
				item.SubItems.Add(pl.Luck.ToString());
				item.SubItems.Add(pl.BullBear.ToString());
				item.SubItems.Add(String.Format("{0:#,0}", pl.TotalGames));
				item.SubItems.Add(String.Format("{0:#,0}", pl.TotalWins));
				item.SubItems.Add(String.Format("{0:#,0}", pl.TotalLoses));
				if(pl.TotalGames > 0)
				{
					double rate = (double)pl.TotalWins / (double)pl.TotalGames;
					item.SubItems.Add(String.Format("{0:P3}", rate));
				}
				else
					item.SubItems.Add("N/A");
			}
		}
	}

	///////////////////////////////////////////
	//ListViewの項目の並び替えに使用するクラス
	///////////////////////////////////////////
	public class ListViewItemComparer : IComparer
	{
		private int m_column;
		private static int m_order = 1;	//毎回呼ばれるたびに正順、逆順を交代させるフラグ
		//ListViewItemComparerクラスのコンストラクタ
		public ListViewItemComparer(int col)
		{
			m_column = col;
			m_order *= -1;	//ListViewItemComparerが呼ばれる度に正順、逆順が変更される
		}
		//xがyより小さいときはマイナスの数、大きいときはプラスの数、同じときは0を返す
		public int Compare(object x, object y)
		{
			//ListViewItemの取得
			ListViewItem itemx = (ListViewItem) x;
			ListViewItem itemy = (ListViewItem) y;
			//xとyを文字列として比較する
			return string.Compare(itemx.SubItems[m_column].Text, itemy.SubItems[m_column].Text) * m_order;
		}
	}

	//////////////////////
	//InputBet ダイアログ
	//////////////////////
	public class InputBetDlg : Form
	{
		//クラスメンバープロパティ・変数
		public int Bet {get; private set;}	//賭金
		int Max;							//Playerの所持金残高
		ComboBox BetList;

		public InputBetDlg(Icon ico, Player pl)	//icoは親のアイコンを承継する。plはPlayerクラス
		{
			//ダイアログの属性設定
			this.Text = "賭金設定";
			this.ClientSize = new Size(320, 214);
			this.MaximizeBox = false;		// 最大化ボタン
			this.MinimizeBox = false;		// 最小化ボタン
			this.ShowInTaskbar = false;		//タスクバー上表示
			this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
			this.StartPosition = FormStartPosition.CenterParent;	// 親フォームの中央に配置
			//所持金確認と賭金初期設定
			Max = pl.Capital;
			Bet = pl.Bet();
			//コントロール設定
			//アイコン表示用ラベル
			Label imglabel = new Label();
			imglabel.Size = new Size(40, 40);
			imglabel.Location = new Point(10, 10);
			imglabel.BorderStyle = BorderStyle.Fixed3D;
			imglabel.Image = ico.ToBitmap();	//親のシステムアイコン
			this.Controls.Add(imglabel);
			//スタッツ表示用ラベル
			Label label1 = new Label();
			label1.Size = new Size(ClientSize.Width - imglabel.Width - 30, 18);
			label1.Location = new Point(imglabel.Width + 20, 10);
			label1.BorderStyle = BorderStyle.Fixed3D;
			label1.Text = "今回の勝負数\t：" + pl.ThisGames.ToString();
			label1.TextAlign = ContentAlignment.MiddleLeft;
			Label label2 = new Label();
			label2.Size = new Size(ClientSize.Width - imglabel.Width - 30, 18);
			label2.Location = new Point(imglabel.Width + 20, label1.Size.Height + 20);
			label2.BorderStyle = BorderStyle.Fixed3D;
			label2.Text = "今回の勝数\t：" + pl.ThisWins.ToString();
			label2.TextAlign = ContentAlignment.MiddleLeft;
			Label label3 = new Label();
			label3.Size = new Size(ClientSize.Width - imglabel.Width - 30, 18);
			label3.Location = new Point(imglabel.Width + 20, label1.Size.Height + label2.Size.Height + 30);
			label3.BorderStyle = BorderStyle.Fixed3D;
			label3.Text = "今回の負数\t：" + pl.ThisLoses.ToString();
			label3.TextAlign = ContentAlignment.MiddleLeft;
			Label label4 = new Label();
			label4.Size = new Size(ClientSize.Width - imglabel.Width - 30, 18);
			label4.Location = new Point(imglabel.Width + 20, label1.Size.Height + label2.Size.Height + label3.Size.Height + 40);
			label4.BorderStyle = BorderStyle.Fixed3D;
			label4.Text = "現在の所持金\t：" + String.Format("{0:C}", pl.Capital);
			label4.ForeColor = Color.Red;	//注意の為に赤字にする
			label4.TextAlign = ContentAlignment.MiddleLeft;
			Label label5 = new Label();
			label5.Size = new Size(ClientSize.Width - imglabel.Width - 30, 18);
			label5.Location = new Point(imglabel.Width + 20, label1.Size.Height + label2.Size.Height + label3.Size.Height + label3.Size.Height + 50);
			label5.BorderStyle = BorderStyle.Fixed3D;
			label5.Text = "PCの推奨賭金\t：" + String.Format("{0:C}", Bet);
			label5.ForeColor = Color.Blue;	//注意の為に青字にする
			label5.TextAlign = ContentAlignment.MiddleLeft;
			this.Controls.Add(label1);
			this.Controls.Add(label2);
			this.Controls.Add(label3);
			this.Controls.Add(label4);
			this.Controls.Add(label5);
			//賭金入力コンボボックス
			BetList = new ComboBox();
			BetList.Size = new Size(ClientSize.Width - imglabel.Width - 30, 24);
			BetList.Location = new Point(imglabel.Width + 20, label1.Size.Height + label2.Size.Height  + label3.Size.Height + label4.Size.Height + label5.Size.Height + 60);
			BetList.DropDownStyle = ComboBoxStyle.DropDownList;	//勝手な金額の入力はできない
			BetList.Text = String.Format("{0:C}", Bet);
			for(int i = 1; i <= 20; i++)	//1000円単位賭金リスト
			{
				BetList.Items.Add(String.Format("{0:C}", i * 1000));
			}
			this.Controls.Add(BetList);
			//決定ボタン
			Button btnOK = new Button();
			btnOK.Size = new Size(54, 28);
			btnOK.Location = new Point(ClientSize.Width - btnOK.Width - 10, ClientSize.Height - btnOK.Height - 10);
			btnOK.Text = "決定";
			btnOK.Click += new EventHandler(OnOK_Click);
			this.Controls.Add(btnOK);
		}

		private void OnOK_Click(object sender, EventArgs e)
		{
			//賭金コンボボックスが選択されたならその金額、そうでなければpl.Bet()のままとなる
			if(BetList.SelectedIndex > -1)
			{
				Bet = (BetList.SelectedIndex + 1) * 1000;
				if(Bet > Max)
				{
					MessageBox.Show("選択金額が所持金を超えたので所持金以内とします。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
					Bet = (Max / 1000) * 1000;	//千円単位はすう切り捨て
				}
			}
			else
				MessageBox.Show("金額が選択されなかったので、賭金はPCの推奨する" + String.Format("{0:C}", Bet) + "とします。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Question);
			Close();
		}
	}

	/////////////////////
	//Version ダイアログ
	/////////////////////
	public class VersionDlg : Form
	{
		public VersionDlg(Icon ico)
		{
			//ダイアログの属性設定
			this.Text = "バーション情報";
			this.ClientSize = new Size(320, 100);
			this.MaximizeBox = false;		// 最大化ボタン
			this.MinimizeBox = false;		// 最小化ボタン
			this.ShowInTaskbar = false;		//タスクバー上表示
			this.FormBorderStyle = FormBorderStyle.FixedDialog;		// 境界のスタイル
			this.StartPosition = FormStartPosition.CenterParent;	// 親フォームの中央に配置
			//コントロールの属性設定
			Button btnOK = new Button();
			btnOK.Size = new Size(40, 28);
			btnOK.Location = new Point(ClientSize.Width - btnOK.Width - 10, (ClientSize.Height - btnOK.Height) / 2);
			btnOK.Text = "OK";
			btnOK.Click += new EventHandler(OnOK_Click);
			Label imglabel = new Label();
			imglabel.Size = new Size(40, 40);
			imglabel.Location = new Point(10, (ClientSize.Height - imglabel.Height) / 2);
			imglabel.BorderStyle = BorderStyle.Fixed3D;
			imglabel.Image = ico.ToBitmap();	//親のシステムアイコン
			Label label = new Label();
			label.Size = new Size(ClientSize.Width - imglabel.Width - btnOK.Width - 40, ClientSize.Height- 20);
			label.Location = new Point(imglabel.Width + 20, (ClientSize.Height - label.Height) / 2);
			label.BorderStyle = BorderStyle.Fixed3D;
			label.Text = "Chinchirorin Version 1.0\r\nCopyright (c) 2023 by Ysama\r\n";
			label.TextAlign = ContentAlignment.MiddleCenter;
			label.Font = new Font("Times New Roman", 10, FontStyle.Bold);
			this.Controls.Add(btnOK);
			this.Controls.Add(imglabel);
			this.Controls.Add(label);
		}

		private void OnOK_Click(object sender, EventArgs e)
		{
			Close();
		}
	}
}
