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

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

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

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

Q&A

1回答

7827閲覧

神経衰弱のコード

Hoshi

総合スコア10

C#

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

0グッド

0クリップ

投稿2015/03/19 19:55

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

lang

1namespace Shinkeisuijaku 2{ 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 Card turnCard; 11 12 Cards cards; 13 14 private void button1_Click(object sender, EventArgs e) 15 { 16 button1.Hide(); 17 button2.Visible = true; 18 cards = new Cards(); 19 cards.shuffleCards(); 20 for (int i = 0 ; i < 52 ; i++) 21 { 22 Card C = cards[i]; 23 Controls.Add(C); //カードオブジェクトを配置 24 C.Location = new Point(72 * (i % 13) + 20, 100 * (i / 13) + 20); 25 } 26 } 27 28 private void button2_Click(object sender, EventArgs e) 29 { 30 button2.Hide(); 31 button3.Visible = true; 32 for (int i = 0; i < 52; i++) 33 { 34 Card C = cards[i]; 35 C.eightturn(); 36 } 37 } 38 39 private void button3_Click(object sender, EventArgs e) 40 { 41 button3.Hide(); 42 for (int i = 0; i < 52; i++) 43 { 44 Card C = cards[i]; 45 C.Click += new EventHandler(card_Click); //クリックイベントの定義 46 C.turn(); 47 } 48 } 49 50 private void card_Click(object sender, EventArgs e) 51 { 52 Card C = (Card)sender; 53 if (C.SurFace) return; //カードが表なら何もしない 54 C.turn(); //カードを表にする 55 56 if (turnCard == null) //先に表にしたカードがないなら、1枚目のカードとして記憶する 57 { 58 turnCard = C; 59 } 60 else 61 { 62 if (C.Number == turnCard.Number) //数字が同じなら 63 { 64 MessageBox.Show("カードを取れた!"); 65 if (GameOver) //ゲーム終了なら 66 { 67 MessageBox.Show("おわり。"); 68 Application.Restart(); 69 } 70 } 71 else 72 { 73 MessageBox.Show("残念!"); 74 C.turn(); //2枚のカードを裏にする 75 turnCard.turn(); 76 } 77 turnCard = null; //記憶した1枚目のカードをリセットする 78 } 79 } 80 private bool GameOver 81 { 82 get 83 { 84 for (int i = 0 ; i < cards.Length ; i++) 85 { 86 if (!cards[i].SurFace) 87 { 88 return false; // ゲーム中 89 } 90 } 91 return true; // ゲーム終了 92 } 93 } 94 } 95 class Card : System.Windows.Forms.Label 96 { 97 private bool BackFace; //トランプの表裏 98 public bool SurFace 99 { 100 get 101 { 102 return BackFace; 103 } 104 set 105 { 106 BackFace = value; 107 } 108 } 109 110 private int intNumber; //トランプの数字(1~13) 111 public int Number 112 { 113 get 114 { 115 return intNumber; 116 } 117 set 118 { 119 intNumber = value; 120 } 121 } 122 123 private int intSuits; //トランプの柄( 0:ハート 1:クラブ 2:ダイヤ 3:スペード ) 124 public int Suits 125 { 126 get 127 { 128 return intSuits; 129 } 130 set 131 { 132 intSuits = value; 133 } 134 } 135 136 public Card() //初期状態 137 { 138 this.SurFace = false; 139 this.Image = System.Drawing.Image.FromFile("カードの裏.jpg"); 140 this.Size = new System.Drawing.Size(58, 85); 141 } 142 143 public void turn() //トランプを裏返す処理 144 { 145 if (SurFace) //表ならカードを裏にする 146 { 147 SurFace = false; 148 this.Text = null; 149 this.Image = System.Drawing.Image.FromFile("カードの裏.jpg"); 150 } 151 else //裏ならカードを表にする 152 { 153 SurFace = true; 154 this.Text = Number.ToString(); 155 this.Font = new Font("MS Pゴシック", 12); 156 switch (Suits) 157 { 158 case 0: 159 this.Image = System.Drawing.Image.FromFile("ハート.jpg"); 160 break; 161 case 1: 162 this.Image = System.Drawing.Image.FromFile("クラブ.jpg"); 163 break; 164 case 2: 165 this.Image = System.Drawing.Image.FromFile("ダイヤ.jpg"); 166 break; 167 default: 168 this.Image = System.Drawing.Image.FromFile("スペード.jpg"); 169 break; 170 } 171 } 172 } 173 174 public void eightturn() //8ペアのカードを表にする処理 175 { 176 SurFace = true; 177 switch (Suits) 178 { 179 case 0: 180 this.Image = System.Drawing.Image.FromFile("ハート.jpg"); 181 break; 182 case 1: 183 this.Image = System.Drawing.Image.FromFile("クラブ.jpg"); 184 break; 185 case 2: 186 this.Image = System.Drawing.Image.FromFile("ダイヤ.jpg"); 187 break; 188 default: 189 this.Image = System.Drawing.Image.FromFile("スペード.jpg"); 190 break; 191 } 192 193 } 194 195 int id; 196 public int Index 197 { 198 get 199 { 200 return id; 201 } 202 set 203 { 204 id = value; 205 } 206 } 207 } 208 class Cards 209 { 210 private Card[] playingCard; 211 212 public Card this[int idx] 213 { 214 get 215 { 216 return playingCard[idx]; 217 } 218 } 219 220 public int Length 221 { 222 get 223 { 224 return playingCard.Length; 225 } 226 } 227 228 public Cards() 229 { 230 playingCard = new Card[52]; 231 createCards(); 232 } 233 234 public Card createCard(int intNumber) 235 { 236 Card C = new Card(); 237 C.Number = 1 + intNumber % 13; 238 C.Suits = intNumber / 13; 239 return C; 240 } 241 242 public void createCards() 243 { 244 for (int i = 0 ; i < 52 ; i++) 245 { 246 playingCard[i] = createCard(i); 247 } 248 } 249 250 public void exchangeCards(int intA,int intB) 251 { 252 Card C = this.playingCard[intA]; 253 this.playingCard[intA] = this.playingCard[intB]; 254 this.playingCard[intB] = C; 255 } 256 257 public void shuffleCards() 258 { 259 Random Rnd = new Random(); 260 for (int i =0 ; i < 52 ; i++) 261 { 262 int R = Rnd.Next(52); 263 exchangeCards(i, R); 264 } 265 } 266 } 267}

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

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

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

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

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

guest

回答1

0

トランプカードの52枚からランダムで数字が同じ8ペア(16枚)が自動で選択され

まずはトランプのシャッフルのアルゴリスムから始めることをお勧めします。
http://dobon.net/vb/dotnet/programing/arrayshuffle.html
シャッフルが終わったあと、カードの並びはランダムになっているはずです。また、仕様が変更された場合にも対処できるでしょう(8ペアから16ペアに変更など)
ペアの選択法については
0. リストを作成し、選択されたカードをリストから削除していく
0. ペアが選択されているフラグを持ち、チェックしながら探索する
この2つの手法が考えられます。

画面上に数字が見えないように表示される

こちらに関しては描画の問題かと思われます。

  • 裏を向いている間は描画しない(空白または空の文字列)
  • 表を向いている間に描画する(ターンしたとき数字を代入)

などで対応できるかと思われます。

投稿2015/03/20 01:25

yuu.s

総合スコア24

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

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

Hoshi

2015/03/20 09:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問