*

[C#]マルバツゲームを作ろう

公開日: : C#, プログラミング

Twitterでお題を出してください、というツイートに脊椎反射でマルバツゲームとか言ってしまったんですが、
お題を出しておいて、自分の回答を出さないのはあれかなぁ、ということで、作ってみました。
30分ぐらいで作ったので、バグとかあるかも

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace MaruBatsu {
	class Program {
		
		static void Main(string[] args) {
			MaruBatsu maruBatsu = new MaruBatsu();
			maruBatsu.MaruBatsuControl();
		}		
	}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MaruBatsu {
	enum InputCode{
		True,
		Exists,
		END = 9,
		Error,
	}

	enum StatusCode {
		Continue,
		End,
		Victory,
	}

	class MaruBatsu {
		public int[,] Fields = new int[LineMax, ColMax];
		private string Player1 = "Player1";
		private string Player2 = "Player2";
		private const int Player1Num = 1;
		private const int Player2Num = 2;
		private const string Maru = "○";
		private const string Batsu = "×";
		private const int LineMax = 3;
		private const int ColMax = 3;
		private const int EndInput = 9;
		private const int VictoryNum = 3;

		public void MaruBatsuControl() {
			int nowPlayer = Player1Num;
			int code = (int)InputCode.True;

			while (code != (int)InputCode.END) {
				Console.Write(System.Environment.NewLine);
				OutputFields();
				string input = OutputAndInputNowPlayer(nowPlayer);
				code = CheckInput(input);
				if (code == (int)InputCode.True) {
					OutputToFields(input, nowPlayer);
					if (CheckVictory()) {
						Console.WriteLine((nowPlayer == Player1Num ? Player1 : Player2) + "の勝利です。");
						Fields = new int[LineMax, ColMax];
					}else if(CheckEnd()){
						Console.WriteLine("引き分けです");
						Fields = new int[LineMax, ColMax];
					}
					nowPlayer = GetNextPlayer(nowPlayer);
				} else {
					Console.WriteLine(GetMessage(code));
				}
			}
			
		}

		private string OutputAndInputNowPlayer(int PlayerNum) {
			Console.WriteLine("現在のプレイヤーは [ " + (PlayerNum == Player1Num ? Player1 : Player2) + " ] です");
			Console.WriteLine("次の手を入力してください(「0,0」で左上、「9」で終了)");
			Console.Write("入力 => ");

			return Console.ReadLine();
		}

		private void OutputFields() {
			for (int i = 0; i < LineMax; i++) {
				if (i > 0) {
					string[] lines = new string[ColMax];
					for (int j = 0; j < ColMax - 1; j++) {
						lines[j] = "┼";
					}
					string line = "─" + string.Join("─", lines);
					Console.WriteLine(line);
				}
				StringBuilder builder = new StringBuilder();
				for (int j = 0; j < ColMax; j++) {
					if (j > 0) {
						builder.Append("|");
					}
					switch (Fields[i, j]) {
						case Player1Num:
							builder.Append(Maru);
							break;
						case Player2Num:
							builder.Append(Batsu);
							break;
						default:
							builder.Append(" ");
							break;
					}

				}
				Console.WriteLine(builder.ToString());
			}
		}

		private bool CheckExists(string inputStr){
			string[] inputs = inputStr.Split(',');
			int i = int.Parse(inputs[0]);
			int j = int.Parse(inputs[1]);

			return Fields[i, j] > 0;
		}

		private int CheckInput(string inputStr){
			int result = (int)InputCode.Error;

			if (System.Text.RegularExpressions.Regex.IsMatch(inputStr, @"^[0-" + (LineMax - 1) + @"]\,[0-" + (ColMax - 1) + @"]$")) {
				if (CheckExists(inputStr)) {
					result = (int)InputCode.Exists;
				} else { 
					result = (int)InputCode.True;
				}
			} else if(System.Text.RegularExpressions.Regex.IsMatch(inputStr, ((int)InputCode.END).ToString())){
				result = (int)InputCode.END;
			}

			return result;
		}

		private void OutputToFields(string input, int nowPlayer){
			string[] inputs = input.Split(',');
			int i = int.Parse(inputs[0]);
			int j = int.Parse(inputs[1]);
			Fields[i, j] = nowPlayer;
		}

		private int GetNextPlayer(int nowPlayer) {
			if (nowPlayer == Player1Num) {
				nowPlayer = Player2Num;
			} else {
				nowPlayer = Player1Num;
			}

			return nowPlayer;
		}

		private string GetMessage(int e) {
			string result = null;

			switch (e) {
				case (int)InputCode.Error:
					result = "入力値が [ 0,0 ] の形式でありません。";
					break;
				case (int)InputCode.Exists:
					result = "既に入力されているフィールドです。";
					break;
				case (int)InputCode.END:
					result = "終了入力されました。";
					break;
				default:
					break;
			}

			return result;
		}

		private int CheckStatus() {
			int result = (int)StatusCode.Continue;

			return result;
		}

		private bool CheckVictory() {
			int cnt = 0;

			// Check Horizontal
			for (int i = 0; i < LineMax; i++) {
				cnt = 0;
				for (int j = 1; j < ColMax; j++) {
					if (Fields[i, j] == 0) {
						cnt = 0;
						continue;
					}
					if (Fields[i, j] == Fields[i, j - 1]) {
						cnt++;
					}
					if (cnt >= VictoryNum - 1) {
						return true;
					}
				}
			}

			// Check Virtical
			for (int i = 0; i < ColMax; i++) {
				cnt = 0;
				for (int j = 1; j < LineMax; j++) {
					if (Fields[j, i] == 0) {
						cnt = 0;
						continue;
					}
					if (Fields[j, i] == Fields[j - 1, i]) {
						cnt++;
					}
					if (cnt >= VictoryNum - 1) {
						return true;
					}
				}
			}

			// Check Slant from left top
			cnt = 0;
			for (int i = 1, j = 1; i < LineMax; i++, j++) {
				if (Fields[i, j] == 0) {
					cnt = 0;
					continue;
				}
				if (Fields[i, j] == Fields[i - 1, j - 1]) {
					cnt++;
				}
				if (cnt >= VictoryNum - 1) {
					return true;
				}
			}

			// Check Slant from left bottom
			cnt = 0;
			for (int i = LineMax - 1 - 1, j = 1; i >= 0; i--, j++) {
				if (Fields[i, j] == 0) {
					cnt = 0;
					continue;
				}
				if (Fields[i, j] == Fields[i + 1, j - 1]) {
					cnt++;
				}
				if (cnt >= VictoryNum - 1) {
					return true;
				}
			}


			return false;
		}

		private bool CheckEnd(){
			bool result = true;

			foreach (int field in Fields) {
				if (field == 0) {
					result = false;
					break;
				}
			}

			return result;
		}
	}
}

◆解説

private int CheckInput(string inputStr){
	int result = (int)InputCode.Error;

	if (System.Text.RegularExpressions.Regex.IsMatch(inputStr, @"^[0-" + (LineMax - 1) + @"]\,[0-" + (ColMax - 1) + @"]$")) {
		if (CheckExists(inputStr)) {
			result = (int)InputCode.Exists;
		} else { 
			result = (int)InputCode.True;
		}
	} else if(System.Text.RegularExpressions.Regex.IsMatch(inputStr, ((int)InputCode.END).ToString())){
		result = (int)InputCode.END;
	}

	return result;
}

ここがわかりづらいかも。正規表現でなんやかんややってます。
@”^[0-" + (LineMax - 1) + @"]\,[0-" + (ColMax - 1) + @"]$” で変数を使ってるのは3*3以上のマスにも対応しようとした痕跡。
勝利判定がめんどっちくなったので放棄。
このソースだと”[0-2],[0-2]“という正規表現になります。

 

実行するとこんな感じ。

wannabenote

座標指定で○とか×とか入れていきます。
wannabenote

既に入力されてるところは怒られます
wannabenote

座標的に有り得なかったり、入力がおかしいと怒られます
wannabenote

斜めも勝利判定ちゃんとしてます。
wannabenote

本当ならここからリファクタリングでしょうが、お遊びなのでここまで。
思ったよりも初心者向けじゃなかったようです。

ad

関連記事

wannabenote

[Visual Studio]いつもの文章をコピペするぐらいならSnippetizer使いませんか

Visual StudioのSnippetizerって使ってますか。 あれ? 意外に知らん人多いの

記事を読む

Wannabenote

[Unity]Unity2Dチュートリアル パズルを落下させる。

前回の続き。 とりあえず、パズルが消えたので、パズルを落としましょう。 以下のようにソースを

記事を読む

logo

プログラミング概論 導入

プログラミングは基礎から覚えた私ですので、やはり基礎から書いていきます。 よくプログラミングのサイ

記事を読む

logo

[C#, AS400]列挙体の文字列化&DB2/400にODBC接続

定数をなるべく書きたくないんです。 あとからメンテをするときに複数箇所変更しなくてはいけないから。

記事を読む

logo

[C#]AS400のメンバーを指定してデータにアクセスする

◆前提条件◆ CliantAccessをインストールしている。 .NET Framework3.

記事を読む

logo

[Unity]コードリファレンス ソケット通信の開始して接続して切断する。

オンラインゲームを作るためにはソケット通信が必要です。 今回はいきなりソースから。解説は下の方に。

記事を読む

logo

[C#]文字列のプロパティを初期化したい。空文字で初期化したい。

Twitterで適当に叫んでたときのネタをメモ。 C#でプロパティの初期化が面倒です。 たと

記事を読む

Unity2_1

[Unity]Unity2Dチュートリアル スプライトを利用する

前回の続き。 早速、スプライトを設置して作っていきましょう。 ※スプライトとは スプライ

記事を読む

logo

[Unity, C#]曲線を描こう エルミート曲線とベジエ曲線

演出を作る際に綺麗な曲線を描きたいですよね。 というわけでC#でエルミート曲線とベジエ曲線を計算す

記事を読む

Unity_

[Unity]Unity2Dチュートリアル 同じ色で繋がったパズルを消去する ソース解説

◆全文 using UnityEngine; using System.Collecti

記事を読む

ad

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑