C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 乱数を利用したゲーム


(過去ログ 117 を表示中)

[トピック内 25 記事 (1 - 20 表示)]  << 0 | 1 >>

■68874 / inTopicNo.1)  乱数を利用したゲーム
  
□投稿者/ hi* (1回)-(2013/11/23(Sat) 12:24:50)

分類:[.NET 全般] 

2013/11/23(Sat) 13:58:19 編集(投稿者)
vb.net初心者です。
アプリであるtouchmemberのようなものを自分で作りたいと思っています。
まずtextbox1つ、button4つで作ろうとしています。
乱数をtextboxに表示させ、buttonにも乱数を表示させます。
textboxの数字とbuttonの数字が同じものだけ押せるようにして、
一致したら次の乱数に行くようにしたいのですがどういう風に
プログラムをかけばいいかわからずに困っています。

アドバイスおねがいします。
今のところ書いてみたのがこれです。

引用返信 編集キー/
■68875 / inTopicNo.2)  Re[1]: 乱数を利用したゲーム
□投稿者/ Jitta (98回)-(2013/11/23(Sat) 13:04:29)
Jitta さんの Web サイト
No68874 (hi* さん) に返信
> vb.net初心者です。
> アプリであるtouchmemberのようなものを自分で作りたいと思っています。
> まずtextbox1つ、button4つで作ろうとしています。
> 乱数をtextboxに表示させ、buttonにも乱数を表示させます。
> textboxの数字とbuttonの数字が同じものだけ押せるようにして、
> 一致したら次の乱数に行くようにしたいのですがどういう風に
> プログラムをかけばいいかわからずに困っています。

 まず、プログラムとはなんだと考えるか、説明してみてください。
おそらく、プログラムという物がなんなのかわかっていないと思います。
なので、作り方がわからないのだと思います。
わかっている物は作れるかもしれませんが、わからない物を作ることはできません。
納得できますよね?

 ということで、あなたが作りたい物を、あなたは本当にわかっているでしょうか。
プログラムは、あなたがしたいことを、コンピューターにさせるための命令書です。
あなたは、「命令書が書けない」といっているわけです。
これには、2つのタイプがあります。
「どのように命令すれば良いか、わからない」と、
「どのような命令があるのか、わからない」です。
このコードを見ると、「どのように命令すれば良いか、わからない」だと思います。
そうすると、VB とか言語は二の次で、まずは、日本語で命令、あるいは実現するための手順を作れなければなりません。

 そういうわけで、まず、あなたが作りたい物は、何が、どのようになれば、実現できるのか、日本語で、かいてみてください。
たとえば、

> 乱数をtextboxに表示させ、buttonにも乱数を表示させます。

ですが、乱数とは、どんな数字でしょうか。それを、いつ、テキストボックスや、ボタンに表示するのでしょうか。
今のコードでは、それがわかりません。
フォームをメモリにロードしたときに、1〜5の数を4回、ArrayList 型のインスタンスに格納しています。
それは、何を意図しているのでしょうか。

まずは、あなたが実現したい物を、何が、どんなときに、どのようになれば良いのか、順序立てて書き出してください。
それをコード化するのは、もっと後です。
プロのプログラマーでも、よっぽど自信が無い限り、いきなりコードを書いたりしません。
まして、コンピュータに伝える方法を知らない人が、自分の考えていることもまとまっていないのに、
いきなり動くコードがかけるわけがありません。
まず、させたいことをまとめてください。
引用返信 編集キー/
■68879 / inTopicNo.3)  Re[2]: 乱数を利用したゲーム
□投稿者/ hi* (2回)-(2013/11/23(Sat) 14:03:50)
No68875 (Jitta さん) に返信

ありがとうございます。
私がしたいことは下のようなことです。

1 textboxに1〜4の乱数を表示させる。
2 button4つに1〜4の乱数を表示させる。(4つとも数字をかぶらせない)
3 textboxの数字とbuttonの数字で同じものをクリックできるようにする。
4 正解したらtextboxとbuttonの乱数がシャッフルする。

この繰り返しをできるようにしたいと考えています。
引用返信 編集キー/
■68882 / inTopicNo.4)  Re[3]: 乱数を利用したゲーム
□投稿者/ Jitta (100回)-(2013/11/23(Sat) 18:17:27)
Jitta さんの Web サイト
No68879 (hi* さん) に返信
> 私がしたいことは下のようなことです。
>
> 1 textboxに1〜4の乱数を表示させる。
> 2 button4つに1〜4の乱数を表示させる。(4つとも数字をかぶらせない)
> 3 textboxの数字とbuttonの数字で同じものをクリックできるようにする。
> 4 正解したらtextboxとbuttonの乱数がシャッフルする。
>
> この繰り返しをできるようにしたいと考えています。

 はい。
ですから、「textboxに1〜4の乱数を表示させる」タイミングは、いつですか?
乱数を得る方法は、「VB 乱数」ででも計算すれば、 http://jeanne.wankuma.com/tips/vb.net/random/next.html 等が得られます。
提示されているコードでは・・・あれ?削除しちゃいましたか。
たしか、何度も Random を呼ばれていましたが、Random を呼ぶのは1度で良くて、cRandom.Next() の部分で取得します。
これで得た数を、TextBox の Text プロパティに設定すればいいでしょう。

 他人が質問に答えられるのは、情報があるからです。
情報によって、答えが取り得る範囲を狭められるからです。
あなたの質問は、算数にたとえると、「3と5の計算をしない」というようなものです。
これでは、足すのか、引くのか、もっと他の演算をするのか、わかりません。


> 3 textboxの数字とbuttonの数字で同じものをクリックできるようにする。
> 4 正解したらtextboxとbuttonの乱数がシャッフルする。

 ここの真意がわかりません。
「クリックできるようにする」と書かれると、「他のボタンは押せない」と解釈します。
そうすると、次の「正解したら」がわかりません。
正解しかしようがないのですが?


まずは、あなたが実現したい物を、【何が】、【どんなときに】、【どのようになれば良いのか】、順序立てて書き出してください。
コンピュータは、順番に計算します。
いつ、何を、どの順番で計算するのか、というのは、コンピュータにとっては非常に重要な情報です。

引用返信 編集キー/
■68883 / inTopicNo.5)  Re[4]: 乱数を利用したゲーム
□投稿者/ Jitta (101回)-(2013/11/23(Sat) 18:21:35)
Jitta さんの Web サイト
例:

プログラムが起動する。
画面に、テキストボックスと、ボタン1、ボタン2、ボタン3、ボタン4が表示される。
テキストボックスに、1〜4のいずれかが表示される。(1)
ボタン1〜4に、他のボタンとかぶらない、1〜4が表示される。
ユーザが、いずれかのボタンを押すまで待機する。(2)
ユーザが、いずれかのボタンを押したとき:
  ボタンに表示されている数と、テキストボックスの数が一致しないなら、(2)に戻る。
  ボタンに表示されている数と、テキストボックスの数が一致したら、(1)に戻る。

引用返信 編集キー/
■68887 / inTopicNo.6)  Re[5]: 乱数を利用したゲーム
□投稿者/ hi* (3回)-(2013/11/23(Sat) 21:31:36)
No68883 (Jitta さん) に返信

Jitta さんが書いていただいだいたものとほぼ一緒なのですが、

プログラムが起動する。
画面に、テキストボックスと、ボタン1、ボタン2、ボタン3、ボタン4が表示される。
テキストボックスに、1〜4のいずれかが表示される。(1)
ボタン1〜4に、他のボタンとかぶらない、1〜4が表示される。
ユーザが、いずれかのボタンを押すまで待機する。(2)
ユーザが、いずれかのボタンを押したとき:
 ボタンに表示されている数と、テキストボックスの数が一致しないなら、(2)に戻る。
 ボタンに表示されている数と、テキストボックスの数が一致したら、(1)に戻る。


テキストボックスが4だとします。
ボタン1が3、ボタン2が4、ボタン3が1、ボタン4が2を表示しました。
テキストボックスの4と一致するのは、ボタン2の4です。
このときに、他の3つのボタンはクリックしても反応しない、
もしくは、クリックすらできないようにしたいです。
見事ボタン2をクリックできることができたら、
テキストボックスに1〜4のいずれかが表示する。

この繰り返しをしたいんです。
引用返信 編集キー/
■68888 / inTopicNo.7)  Re[6]: 乱数を利用したゲーム
□投稿者/ shu (424回)-(2013/11/23(Sat) 22:19:39)
No68887 (hi* さん) に返信

乱数使って数字を並び替えたいということでよいのでしょうか?

それならトランプの並び替えと同じ考え方でよいので
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=11425
に投稿した内容を参考にしてみて下さい。
引用返信 編集キー/
■68889 / inTopicNo.8)  Re[7]: 乱数を利用したゲーム
□投稿者/ hi* (4回)-(2013/11/23(Sat) 22:26:55)
No68888 (shu さん) に返信

わざわざ添付していただいてありがとうございます。

乱数の使い方はわかります。
テキストボックスの数字とクリックしたボタンの数字が
あっているかいないかの判断するプログラムを書きたいんです。
引用返信 編集キー/
■68890 / inTopicNo.9)  Re[6]: 乱数を利用したゲーム
□投稿者/ Jitta (102回)-(2013/11/23(Sat) 23:00:35)
Jitta さんの Web サイト
2013/11/23(Sat) 23:11:23 編集(投稿者)

No68887 (hi* さん) に返信

 問い方を変えます。

誰でも良いので作って欲しいのですか。
それならば、 http://sdrv.ms/I7guBE こちらをどうぞ。←ボタン1つの番号が4固定になっていたので修正した
これで良いのなら、コードも載せます。

それとも、自分で作れるようになりたいですか。
それならば、「プログラムとは、自分がしたいことをコンピュータにわかるように書き並べることである」ということを、理解してください。



> Jitta さんが書いていただいだいたものとほぼ一緒なのですが、
>
> プログラムが起動する。
> 画面に、テキストボックスと、ボタン1、ボタン2、ボタン3、ボタン4が表示される。
> テキストボックスに、1〜4のいずれかが表示される。(1)
> ボタン1〜4に、他のボタンとかぶらない、1〜4が表示される。
> ユーザが、いずれかのボタンを押すまで待機する。(2)
> ユーザが、いずれかのボタンを押したとき:
>  ボタンに表示されている数と、テキストボックスの数が一致しないなら、(2)に戻る。
>  ボタンに表示されている数と、テキストボックスの数が一致したら、(1)に戻る。
>
>
> テキストボックスが4だとします。
> ボタン1が3、ボタン2が4、ボタン3が1、ボタン4が2を表示しました。
> テキストボックスの4と一致するのは、ボタン2の4です。
> このときに、他の3つのボタンはクリックしても反応しない、
> もしくは、クリックすらできないようにしたいです。
> 見事ボタン2をクリックできることができたら、
> テキストボックスに1〜4のいずれかが表示する。
>
> この繰り返しをしたいんです。

「(1)に戻る」、「(2)に戻る」と書いています。
(1)に戻ったら、数字の割り当て直しを行います。
ですから、ご要望の通りになっています。

 人間にわかるように、プログラムがどのような計算を行うか、書くことができました。
次に、それぞれの「動作」を行うための条件が明確になっているか、確認します。

> プログラムが起動する。
これは、ユーザが行うことなので、とりあえず飛ばします。

> 画面に、テキストボックスと、ボタン1、ボタン2、ボタン3、ボタン4が表示される。
これは、開発時にそのように画面を設計すれば良さそうです。

> テキストボックスに、1〜4のいずれかが表示される。(1)
ここで、「1〜4のいずれか=乱数を表示する」必要があります。
乱数の範囲は1〜4と、整数であること、上限下限が明らかになっていますから、これで良さそうです。

> ボタン1〜4に、他のボタンとかぶらない、1〜4が表示される。
ここでまた、乱数が必要なようです。
ボタンは4つあり、それぞれ1つの数字が表示されますが、表示する数字がこのときに決定されます。
ですからここでは、「割り当てた数字」と、「他のボタンが表示している数字」を知る必要がありそうです。

> ユーザが、いずれかのボタンを押すまで待機する。(2)
ここで、ユーザーが「ボタンを押した」ことを知る必要があります。
これは、Click イベントを使えば良さそうです。
イベントの定義は開発時にデザイナでできます。
ですから、デザイナで定義すれば、特にすることはなさそうです。
「待機する」も、Visual Studio を使ってプログラムを作るのであれば、特に何もする必要は無いでしょう。

ということは、テキストボックスとボタンに乱数を割り当てるのは、
「画面が表示されるとき」ということになります。
また、先に書いてしまいますが、テキストボックスと押したボタンの数が同じであれば新しい乱数を割り当てるので、
「正解したとき」にも必要になります。
ですから、「乱数を割り当てる」のようなメソッドとして切り出しておいて、
「画面が表示されるとき」に呼び出すのが良さそうです。


> ユーザが、いずれかのボタンを押したとき:
これは、Click イベントの定義になります。

>  ボタンに表示されている数と、テキストボックスの数が一致しないなら、(2)に戻る。
>  ボタンに表示されている数と、テキストボックスの数が一致したら、(1)に戻る。
まとめてしまいますが、ここから、「ボタンに表示されている数を知る」ことと、
「押したボタンに表示されている数を知る」ことが必要だとわかります。


ということで、
・4つのボタンにそれぞれ異なる数を割り当てる方法
・ボタンに割り当てられた数を知る方法
を考えなければならなさそうです。

というところまで、大丈夫でしょうか。

引用返信 編集キー/
■68891 / inTopicNo.10)  Re[8]: 乱数を利用したゲーム
□投稿者/ Jitta (103回)-(2013/11/23(Sat) 23:17:36)
Jitta さんの Web サイト
No68889 (hi* さん) に返信
> ■No68888 (shu さん) に返信
>
> わざわざ添付していただいてありがとうございます。
>
> 乱数の使い方はわかります。
> テキストボックスの数字とクリックしたボタンの数字が
> あっているかいないかの判断するプログラムを書きたいんです。

ああ、やっと、欲しい情報が出た。

VB なら、

If テキストボックスに表示した数字 = クリックしたボタンの数字 Then
  一致
Else
  不一致
End If

ではなかったですか?
引用返信 編集キー/
■68901 / inTopicNo.11)  Re[9]: 乱数を利用したゲーム
□投稿者/ hi* (5回)-(2013/11/24(Sun) 15:36:27)
No68891 (Jitta さん) に返信

引用返信 編集キー/
■68902 / inTopicNo.12)  Re[10]: 乱数を利用したゲーム
□投稿者/ hi* (6回)-(2013/11/24(Sun) 15:41:09)
> ■No68891 (Jitta さん) に返信
>
遅くなってすいません。
毎回適切な返事をありがとうございます。


IFの中身の書き方が分からなくてもしよかったら教えていただけますか?
引用返信 編集キー/
■68903 / inTopicNo.13)  Re[11]: 乱数を利用したゲーム
□投稿者/ Jitta (106回)-(2013/11/24(Sun) 16:40:58)
Jitta さんの Web サイト
No68902 (hi* さん) に返信
>>■No68891 (Jitta さん) に返信
>>
> 遅くなってすいません。
> 毎回適切な返事をありがとうございます。
>
>
> IFの中身の書き方が分からなくてもしよかったら教えていただけますか?

 テキストボックスも、ボタンも、Text プロパティによって、表示されている内容にアクセスできます。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.text.aspx

ですから、

If textBox1.Tet = 押されたボタン.Text Then
  同じだったときの処理
End If

という書き方ができます。

 しかし、「押されたボタン」というのが何か、わからなければなりません。

>もしくは、クリックすらできないようにしたいです。

というのは、押されたボタンの判別ができないから、ということだったのでしょうか。


 いくつか方法があります。一番簡単なのは、全てのボタンに Click イベントを追加することです。
ボタン一つ一つについて独立した「押されたときの処理」ができますから、

Sub button1_Clicked(...)
  If textBox1.Text = button1.Text Then
    正解の時の処理
  End If
End Sub

Sub button2_Clicked(...)
  If textBox1.Text = button2.Text Then
    正解の時の処理
  End If
End Sub

という書き方ができます。
もっとも、4つくらいならまだ良いですが、ボタンが増えればこんなの書いてられません。
もし、処理の内容が変わったら、修正漏れが発生するかもしれません。


 そこで、メソッドの引数に注目します。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.click.aspx
http://msdn.microsoft.com/ja-jp/library/2ccyd347.aspx
> sender オブジェクトは、イベントの発生元を示します。

「オブジェクトの発生元」とというのは、イベントを発生させたオブジェクトです。
ボタンのクリック イベントなら、クリックしたボタンそのものを指します。
ですから、

If sender = Me.button1 Then
  クリックしたのはボタン1
Else If sender = Me.button2 Then
  クリックしたのはボタン2
Else 以下略

と、調べることができます。
が、普通はこんな面倒なことはせず、

If ((Button)sender).Text = textBox1.Text Then
  正解の処理
End If

とします。

VB は詳しくない、かつ、C# しかインストールしていないので、
ここに載せたコードの断片は、動作のチェックをしていません。
引用返信 編集キー/
■68904 / inTopicNo.14)  Re[11]: 乱数を利用したゲーム
□投稿者/ Jitta (107回)-(2013/11/24(Sun) 16:43:35)
Jitta さんの Web サイト
No68902 (hi* さん) に返信
>>■No68891 (Jitta さん) に返信
>>
> 遅くなってすいません。
> 毎回適切な返事をありがとうございます。
>
>
> IFの中身の書き方が分からなくてもしよかったら教えていただけますか?

 判定の方を書きましたが、それとも、「いかにして繰り返すか」の方だったでしょうか?

 こちらはもっと簡単で、「テキストボックスに乱数を表示する。ボタンに1〜4のどれかを表示する。」
という処理を、1つのメソッドとして切り出しておき、
「フォームを表示するとき」と、「正解の時」に呼び出せばいいです。

引用返信 編集キー/
■68905 / inTopicNo.15)  Re[12]: 乱数を利用したゲーム
□投稿者/ hi* (7回)-(2013/11/24(Sun) 20:42:24)
No68904 (Jitta さん) に返信

いつも質問に適切な答えをありがとうございます。
しっかりと理解しながらだいたいできてきました。

今困っているのが、4つのボタンに表示する乱数を4つともかぶらないようにさせたいのですが、
どうやったらいいでしょうか?

Dim cRandom As New System.Random()
Dim ransuu1 As Integer = cRandom.Next(1, 5)
button1.Text = rannsuu1.ToString()

この乱数の出し方でやっているんです。
引用返信 編集キー/
■68906 / inTopicNo.16)  Re[13]: 乱数を利用したゲーム
□投稿者/ shu (425回)-(2013/11/24(Sun) 21:37:18)
No68905 (hi* さん) に返信
> ■No68904 (Jitta さん) に返信
>
> いつも質問に適切な答えをありがとうございます。
> しっかりと理解しながらだいたいできてきました。
>
> 今困っているのが、4つのボタンに表示する乱数を4つともかぶらないようにさせたいのですが、
> どうやったらいいでしょうか?
>
回答済ですが、解決されているとのことではなかったのですか?
引用返信 編集キー/
■68907 / inTopicNo.17)  Re[14]: 乱数を利用したゲーム
□投稿者/ hi* (1回)-(2013/11/24(Sun) 21:50:57)
No68906 (shu さん) に返信

「割り当てた数字」と、「他のボタンが表示している数字」を知る必要がありそうです。
と解答していただいたものですよね?

そのやり方がいまいちわかりません。
引用返信 編集キー/
■68912 / inTopicNo.18)  Re[15]: 乱数を利用したゲーム
□投稿者/ shu (426回)-(2013/11/25(Mon) 09:24:11)
No68907 (hi* さん) に返信

No68888で回答した内容です。
引用返信 編集キー/
■68917 / inTopicNo.19)  Re[16]: 乱数を利用したゲーム
□投稿者/ hi* (8回)-(2013/11/25(Mon) 10:28:27)
No68912 (shu さん) に返信
> ■No68907 (hi* さん) に返信

重複しないようにできますか?
引用返信 編集キー/
■68921 / inTopicNo.20)  Re[17]: 乱数を利用したゲーム
 
□投稿者/ 魔界の仮面弁士 (424回)-(2013/11/25(Mon) 11:06:33)
2013/11/25(Mon) 11:10:06 編集(投稿者)

No68917 (hi* さん) に返信
> 重複しないようにできますか?
回答内容を理解する前に、条件反射的に質問されてはいないでしょうか?


shu さんの回答は、「トランプの並び替え」のサンプルです。

まずはプログラムの実装方法からは一旦離れて、並び替えたトランプカードから
先頭の数枚を取り出したとき、そこに重複カードが存在しうるかどうかを、
頭に思い描いてみてください。

トランプ内に同じカードがある場合(ジョーカー2枚を含んだ54枚のデッキとか、
カードを2セット使った104枚のデッキなど)であれば重複もするでしょうが、
元のデッキ内に同じカードが無ければ重複することはありませんよね。


ですから、作り方次第では、重複するようにもしないようにもできるという事になります。
やろうと思えば、カードごとに出現率を変えるようなこともできますし。


まず、hi*さんが表示したい数は、どの範囲なのでしょうか?

たとえば、1〜3 の範囲の数字を、4回引き当てるようなゲームだとすれば、
重複なしにする事は不可能ですよね。

1〜5の範囲の重複しない値を 4 回当てるゲームにするならば、
1 回目は 20% の確率ですが、4回目は 50% の確率になります。

1〜4の範囲だとすれば、3回引いた後の 4 回目の値は確定してしまうため、
この場合、厳密には「乱数」ゲームではなくなってしまうかと思います。



トランプ型の乱数生成の場合、決まった山札からランダムに選んだカードを引いていく実装が
使われることが多いですが、この場合、一度引いたカードを山札に戻すのか、一度引いたカードを
山札から取り除くのかによって、重複の発生有無が変わってきますよね。
(shu さんの「並び替え」の例は、山札から取り除く方のパターンに相当します)


山札から取り除く場合、回数を重ねるごとに、乱数の母数が減少することになります。
4種の値を4回当てるようなゲームだと、1回目の値はそれぞれ20%の確率で決まりますが、
4回目の値はランダムの余地が残されず、100%決定されてしまいます。


山札に戻す実装の場合、毎回の確率は変動しませんが、以前選んだカードが重複して引かれる可能性が生じます。
この場合、同じカードだったら再度引きなおすという作り方にすることもできますが、
抽選回数が増えるにつれて再抽選に陥る可能性が高まるため、抽選回数の多いゲームには向きません。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -