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

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

ただいまの
回答率

87.48%

神経衰弱のコード

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 5,761

score 12

以下の内容をコードに組み込みたいのですが、どうすればよいのか分からず質問させていただきます。
「トランプカードの52枚からランダムで数字が同じ8ペア(16枚)が自動で選択され画面上に数字が見えないように表示される。」
以下のコードのeighturnメソッドにて行おうと思っています。
namespace Shinkeisuijaku
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Card turnCard;

        Cards cards;
    
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Hide();
            button2.Visible = true;
            cards = new Cards();
            cards.shuffleCards();
            for (int i = 0 ; i < 52 ; i++)
            {
                Card C = cards[i];
                Controls.Add(C);  //カードオブジェクトを配置               
                C.Location = new Point(72 * (i % 13) + 20, 100 * (i / 13) + 20);                         
            }            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button2.Hide();
            button3.Visible = true;
            for (int i = 0; i < 52; i++)
            {
                Card C = cards[i];              
                C.eightturn();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            button3.Hide();
            for (int i = 0; i < 52; i++)
            {
                Card C = cards[i];             
                C.Click += new EventHandler(card_Click);  //クリックイベントの定義              
                C.turn();
            }
        }

         private void card_Click(object sender, EventArgs e)
        {
            Card C = (Card)sender;
            if (C.SurFace) return;  //カードが表なら何もしない
            C.turn();  //カードを表にする

            if (turnCard == null)  //先に表にしたカードがないなら、1枚目のカードとして記憶する
            {
                turnCard = C;
            }
            else
            {
                if (C.Number == turnCard.Number)  //数字が同じなら
                {    
                    MessageBox.Show("カードを取れた!");
                    if (GameOver)  //ゲーム終了なら
                    {                        
                        MessageBox.Show("おわり。");
                        Application.Restart();
                    }
                }
                else
                {    
                    MessageBox.Show("残念!");
                    C.turn();  //2枚のカードを裏にする
                    turnCard.turn();
                }
                turnCard = null;  //記憶した1枚目のカードをリセットする
            }            
        }
         private bool GameOver
         {
             get
             {
                 for (int i = 0 ; i < cards.Length ; i++)
                 {
                     if (!cards[i].SurFace)
                     {
                         return false;  // ゲーム中
                     }
                 }
                 return true;  // ゲーム終了
             }
         }
    }
    class Card : System.Windows.Forms.Label
    {
        private bool BackFace;  //トランプの表裏
        public bool SurFace
        {
            get
            {
                return BackFace;
            }
            set
            {
                BackFace = value;
            }
        }

        private int intNumber;  //トランプの数字(1~13)
        public int Number
        {
            get
            {
                return intNumber;
            }
            set
            {
                intNumber = value;
            }
        }
         
        private int intSuits;  //トランプの柄( 0:ハート 1:クラブ 2:ダイヤ 3:スペード )
        public int Suits    
        {
            get
            {
                return intSuits;
            }
            set
            {
                intSuits = value;
            }
        }

        public Card()  //初期状態
        {
            this.SurFace = false;
            this.Image = System.Drawing.Image.FromFile("カードの裏.jpg");
            this.Size = new System.Drawing.Size(58, 85);
        }

        public void turn()  //トランプを裏返す処理
        {
            if (SurFace)  //表ならカードを裏にする
            {
                SurFace = false;
                this.Text = null;
                this.Image = System.Drawing.Image.FromFile("カードの裏.jpg");
            }
            else  //裏ならカードを表にする
            {
                SurFace = true;
                this.Text = Number.ToString();
                this.Font = new Font("MS Pゴシック", 12);
                switch (Suits)
                {
                    case 0:
                        this.Image = System.Drawing.Image.FromFile("ハート.jpg");
                        break;
                    case 1:    
                        this.Image = System.Drawing.Image.FromFile("クラブ.jpg");
                        break;
                    case 2:
                        this.Image = System.Drawing.Image.FromFile("ダイヤ.jpg");
                        break;
                    default: 
                        this.Image = System.Drawing.Image.FromFile("スペード.jpg");
                        break;
                }
            }
        }

        public void eightturn()  //8ペアのカードを表にする処理
        {            
            SurFace = true;           
            switch (Suits)
            {
                case 0:
                    this.Image = System.Drawing.Image.FromFile("ハート.jpg");
                    break;
                case 1:
                    this.Image = System.Drawing.Image.FromFile("クラブ.jpg");
                    break;
                case 2:
                    this.Image = System.Drawing.Image.FromFile("ダイヤ.jpg");
                    break;
                default:
                    this.Image = System.Drawing.Image.FromFile("スペード.jpg");
                    break;
            }
            
        }

        int id;
        public int Index 
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
    }
    class Cards
    {
        private Card[] playingCard;

        public Card this[int idx] 
        {
            get
            {
                return playingCard[idx];
            }                        
        }

        public int Length 
        {
            get
            {
                return playingCard.Length;
            }
        }

        public Cards()
        {
            playingCard = new Card[52];  
            createCards();  
        }

        public Card createCard(int intNumber) 
        {
            Card C = new Card(); 
            C.Number = 1 + intNumber % 13; 
            C.Suits = intNumber / 13;
            return C;
        }

        public void createCards()
        {
            for (int i = 0 ; i < 52 ; i++)
            {
                playingCard[i] = createCard(i);
            }
        }

        public void exchangeCards(int intA,int intB)  
        {
            Card C = this.playingCard[intA];  
            this.playingCard[intA] = this.playingCard[intB];
            this.playingCard[intB] = C;
        }

        public void shuffleCards()
        {
            Random Rnd = new Random();
            for (int i =0 ; i < 52 ; i++)
            {
                int R = Rnd.Next(52);
                exchangeCards(i, R);
            }
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

トランプカードの52枚からランダムで数字が同じ8ペア(16枚)が自動で選択され
まずはトランプのシャッフルのアルゴリスムから始めることをお勧めします。
http://dobon.net/vb/dotnet/programing/arrayshuffle.html
シャッフルが終わったあと、カードの並びはランダムになっているはずです。また、仕様が変更された場合にも対処できるでしょう(8ペアから16ペアに変更など)
ペアの選択法については
  1.  リストを作成し、選択されたカードをリストから削除していく
  2.  ペアが選択されているフラグを持ち、チェックしながら探索する
この2つの手法が考えられます。
画面上に数字が見えないように表示される
こちらに関しては描画の問題かと思われます。
  • 裏を向いている間は描画しない(空白または空の文字列)
  • 表を向いている間に描画する(ターンしたとき数字を代入)
などで対応できるかと思われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/20 18:46

    ご回答ありがとうございます。
    そうしたら良いものか手付かずであったため、この方法で考えてみたいと思います。

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る