質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2858閲覧

Unity(C#)で7並べを作っていますが、AIが作れません。

Kuronekoya

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/04/13 06:09

いつもお世話になっております。どうぞご教示ください。

クリックすればカードを置いて、ターン交代、またクリックすれば…と、一人では遊べるようにはできました。
ちなみに、数字1〜Kをx、マーク(スペードやハート)1〜4をyに入れてカードを区別しています。ダイアモンドの7ならCard(6, 2)というような形です。

しかしAIを作るのが初めてで、かなりてこずっています。

置けるカードに、「同じマークで数字の離れたカードを持っている」場合は距離の遠さが遠いほど点数を加算、また、「同じマークで連続したカードを複数枚持っている」場合も点数を加算。のように置けるカードそれぞれに点数を付け、高い点から優先的にカードを置く、という形にしようかとは思っているのですが、Card(x, y)にどうすれば点数をつけることができるのかわかりません。おそらく基本的な事がわかっていないのだとは思うのですが…

手札をマークで分けて、情報を保持させ、マーク毎に何枚所持しているかを確認できるようにしようとしてみました。一応現在のScriptを載せさせていただきます。
わかりづらければすみません。

Class GameManager

//カードの枚数
private const int CardNumber_X = 13; //カードの数字
private const int CardNumber_Y = 4; //カードのマーク

//持っているカード
Cards[,] mPlayerCard = new Cards[CardNumber_X, CardNumber_Y];

//持っているカードを1枚づつ確認して点数をつける
for (int x = 0; x < CardNumber_X; ++x) {
for (int y = 0; y < CardNumber_Y; ++y) {
mGamePlayer [1].AICardCheck (mPlayerCard [x, y], x, y); //mGamePlayer[1]はコンピュータの番
}
}

Class GamePlayer

//マーク毎の持っている枚数
private int count;
//点数
private int mPoint;

//点数を加算していく
public void AddPoint(Cards card, int x, int y){
switch (y) {
//マークがスペードならmSpadeCardsへ
case 0:
mSpadeCards [x, y] = card;
break;
case 1:
mDiamondCards [x, y] = card;
break;
case 2:
mHeartCards [x, y] = card;
break;
case 3:
mSpadeCards [x, y] = card;
break;
}
switch (y) {
//同じマークのカードを複数枚持っている場合は枚数分加算
case 0:
count = mSpadeCards.Length;
mPoint = mPoint + count;
break;
case 1:
count = mDiamondCards.Length;
mPoint = mPoint + count;
break;
case 2:
count = mHeartCards.Length;
mPoint = mPoint + count;
break;
case 3:
count = mCloverCards.Length;
mPoint = mPoint + count;
break;
}
}

上記の方法であっているのでしょうか?考え方、Script、なんでもおかしいところはご指摘いただけると幸いです。何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

Unityについては知らないので外しているかも知れませんが。
Cardsというクラスは、Unityのクラスでしょうか?
もし、Kuronekoyaさんが定義する予定のクラスならば、その定義を提示して貰った方が良いです。

データ構造を決める時は、要件を満たせる構造を幾つか考え、より良いと思われるものを採用します。
現在の要件は下記と思います。

置けるカードに、「同じマークで数字の離れたカードを持っている」場合は距離の遠さが遠いほど点数を加算、また、「同じマークで連続したカードを複数枚持っている」場合も点数を加算。

これを行いやすいデータ構造を考えてみましょう。
それは、既に場に置かれているカードが何か表現でき、かつ、プレイヤーが持っているカードを表現できる必要があります。
同じカードを複数のプレイヤーが持っていることはないし、既に場に出ているカードをプレイヤーが持っていることはないですね。

例えば、Cardsではなくboolとし、場に出ているカード、プレイヤーが持っているカードを下記のようにすることが考えられます。

bool[,] mLayout = new bool[CardNumber_X, CardNumber_Y];
bool[,] mPlayerCard = new bool[CardNumber_X, CardNumber_Y];

そして、mLayoutの既に場に出ているカードの端から、「外側」方向に向かってスキャンしてmPlayerCard をチェックすることで、お望みの点数を計算できるのではないでしょうか?

投稿2016/04/13 06:33

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kuronekoya

2016/04/15 01:43

ありがとうございます、とっても参考になりました! おかげで、見方を変えて取り組んでいけております。 拙い質問だったにも関わらず、丁寧に答えてくださって本当に感謝しております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問