三目並べのコードの続きについて

このQ&Aのポイント
  • 三目並べのコードの続きについて
  • 三目並べのゲームの表示をダイアログボックスに変更したい
  • 引き分けのプログラムの設定方法を知りたい
回答を見る
  • ベストアンサー

三目並べのコードの続きについて。ビジュアルベーシック2008。

三目並べのコードの続きについて。ビジュアルベーシック2008。 いつもお世話になっております。前回から三目並べのゲーム作りに苦戦しております。 今回は三目並べで、3つ揃った場合は勝ち、揃わなかったら負け、とスコアをカウントしていきたいのです。 例 勝った回数:1回 負けた回数:2回 しかし問題なのが、三目並べのゲームのある”同じページ”に表示するのではなく、新しく追加したダイアログボックスの中に表示したいのです。三目並べのページにあるラベルをダイアログボックスにCALLしたり様々に試しているのですが上手くいきません。どうかお知恵をお貸し下さい。 また前回でも触れましたが、”勝ち”と”負け”のプログラムは成功しましたが”引き分け”をどのように設定すればいいのかわかりません。地道に9つのボタンのXとOを指定して何十通りもコードを打つしかないのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こちらが作ると、このようになってしまいますが、お分かりになるでしょうか? BlankCount で、空白を数えるわけです。 If BlankCount() < 1 Then で、リセットされずに、最後まで来たら、Tie になるわけですね。 '//   Private _Buttons As New List(Of Button)   Private GameCount As Integer   Private XCount As Integer   Private OCount As Integer Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   GameCount = 0   '配列に格納   Me._Buttons.Add(Me.Button1)   Me._Buttons.Add(Me.Button2)   Me._Buttons.Add(Me.Button3)   Me._Buttons.Add(Me.Button4)   Me._Buttons.Add(Me.Button5)   Me._Buttons.Add(Me.Button6)   Me._Buttons.Add(Me.Button7)   Me._Buttons.Add(Me.Button8)   Me._Buttons.Add(Me.Button9)   For i As Integer = 1 To 9     With Button(i)       Button(i).Text = ""     End With   Next i End Sub   Function BlankCount()    Dim Cnt As Integer    For i As Integer = 1 To 9      With Button(i)        If .Text = "" Then          Cnt = Cnt + 1        End If      End With    Next i    BlankCount = Cnt  End Function  Private Function Button(ByVal index As Integer) As Button    Return DirectCast(Me.Controls("Button" & index.ToString), Button)  End Function   Private Sub win()   If Button1.Text = "X" And Button2.Text = "X" And Button3.Text = "X" Or _     Button4.Text = "X" And Button5.Text = "X" And Button6.Text = "X" Or _     Button7.Text = "X" And Button8.Text = "X" And Button9.Text = "X" Or _ '   省略     MessageBox.Show("X is the winner!")     Call DisableButtons()     Call Reset()     XCount = XCount + 1 'Winカウント   ElseIf _     Button1.Text = "O" And Button2.Text = "O" And Button3.Text = "O" Or _ '   省 略     MessageBox.Show("X lose the game")     OCount = OCount + 1     Call DisableButtons()     Call Reset()   End If   If BlankCount() < 1 Then     MessageBox.Show("Tie")     Call DisableButtons()     Call Reset()   End If End Sub Reset の中で、GameCount = GameCount + 1 として数えます。

chirosaku_v
質問者

お礼

コードまで的確に書いて下さり、本当になんと感謝していいのかわかりません。これからも慣れない英語で頑張ってシリーズと化したVBの最後の課題を頑張って参りますのでなにとぞご指導よろしくお願いいたします。

その他の回答 (3)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

プログラムは作ってないので考え方、参考。 エクセル1回起動し終了までの勝敗ですか?。 昨日起動、今日起動とかの過去の通算の勝敗ですか?。 外部データに勝敗を保持すれば、どちらでも問題なくできます。 9マス埋まらないものはゲームに含めない、なら、 「勝ち」「負け」以外が「引き分け」となるので、 =「勝ち」でもなく「負け」でもないのが「引き分け」 9マスしかない、○×2択ということで 9ビット「000-000-000」をイメージした構造でもできる、と思います。 2列同時に並んだ「勝ち」もあるのでしょうか?。 (人対戦ではないと思いますがプログラム的にはパターンあり得ますので。)

chirosaku_v
質問者

補足

過去ではなく、ただプログラムを起動してから終了するまでの回数を記録したいのです。 外部データの保持は皆様の回答からStaticを使う、という事なので頑張ってみようと思います。 2列同時はなく、本当にシンプルに3つ揃ったら勝ち、と簡単なものです。

  • shinkami
  • ベストアンサー率43% (179/411)
回答No.3

途中参加です 9つのボタンのXとOを指定して何十通りもコードを打つしかないのでしょうか。 同じ式を繰り返し使うときは「ユーザー定義関数」はいかがでしょう VBはないので EXCEJのVBAですが 例 Function 勝敗(カードA, カードB, カードC)   If カードA = "○" Then A = 1 Else A = 0   If カードB = "○" Then B = 1 Else B = 0   If カードC = "○" Then C = 1 Else C = 0   勝敗 = "引分"   If A + B + C = 0 Then 勝敗 = "負" Else If A * B * C = 1 Then 勝敗 = "勝" End Function Private Sub 判定ボックス_Click()   判定ボックス = 勝敗(札A, 札B, 札C) End Sub シリーズの質問は前回のURLがあれば途中参加でも… ツイッター気分でした

chirosaku_v
質問者

お礼

わかりやすいコードありがとうございます!毎回シリーズの質問をさせて頂いておりますので是非次も参加して頂ければとても助かります!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

>”勝ち”と”負け”のプログラムは成功しましたが”引き分け”  1 2 3  4 5 6  7 8 9 -----  1,2,3  4,5,6  7,8,9  1,4,7  2,5,8  3,6,9  1,5,9  3,5,7 縦が、3通り 横が、3通り 斜めが、2通り ------ 合計: 8 通りです。 >地道に9つのボタンのXとOを指定して何十通りもコードを打つしかないのでしょうか この部分が良く分からないのですが、 X, ○ の片方ずつ、文字として調べるか、ひとつにまとめるなら、数値化して、X = 1, ○ = -1, 未入力= 0 として、3 が成り立つのを調べか、どちらかで、Win, Lose になるのは、もうお済みのことだと思います。 Tie を求めるというのは、結果的に、未入力を探すことになるのだと思います。未入力がない状態で、どちらにも、Win がでていないなら、Tie ということになると思います。 簡単な方法としては。 --------- X の8通りの組み合わせチェック ○の8通りの組み合わせチェック 未入力のチェック >8 (>7 ですと、複雑になります) --------- で、Xか○に、該当が立たないなら、Tie ですね。 (8回目まで入れて、最後を入力しなくても、Tie になることがあることは、今は、調べていません) >三目並べのゲームのある”同じページ”に表示するのではなく、新しく追加したダイアログボックスの中に表示したいのです。 その集計を、モジュールレベル変数(Form の外に変数を置くか、Static 変数)を設けて、その変数に、記録を残します。 >勝った回数:1回 >負けた回数:2回(相手の勝った数) そして、Game数を決めて、別のDialog(MessageBox?)を出せば良いと思います。 ここまで来ると、私自身、こういうものは作ったことがありませんので、同じものを作ってみないと、どこに問題が出てくるのか分からないですね。

関連するQ&A

  • 三目並べのコードについて。ビジュアルベーシック2008

    三目並べのコードについて。ビジュアルベーシック2008 現在三目並べのコードにて苦戦しています。 ×が3つ揃えば勝ち、Oが3つ揃えば勝ち、というメッセージが表示されるコードも完了しました。 しかし引き分け、つまり9つのボタンの内3つ揃わなかった場合、どのようなコードにすればいいでしょう?色々やっているのですが、メッセージボックスすら表示されません。 また、勝ち、や引き分け、のメッセージ表示後、自動的にリセットしたく Private Sub reset()         Button1.Text = "" Button1.Enabled = True Button2.Text = "" Button2.Enabled = True Button3.Text = "" Button3.Enabled = True Button4.Text = "" Button4.Enabled = True Button5.Text = "" Button5.Enabled = True Button6.Text = "" Button6.Enabled = True Button7.Text = "" Button7.Enabled = True Button8.Text = "" Button8.Enabled = True Button9.Text = "" Button9.Enabled = True を Private Sub win() If Button1.Text = "X" And Button2.Text = "X" And Button3.Text = "X" Then MessageBox.Show("You are the winner with X!") Call disablebuttons()        Call reset() ・・・以下続く とCALLで呼び出しているのですが、9つきちんとリセットされてくれず必ず9つのボタンのうち一つだけ窪み(何も表示されない状態)になってしまいます。一体どうすればよいでしょう? また、ボタンにカーソルが触れると色が変わるようにしたいのですが、もしお知恵を貸していただけるようでしたらよろしくお願いいたします。

  • ビジュアルベーシック2008、変数とグラフィックについて

    ビジュアルベーシック2008、変数とグラフィックについて こんにちは、いつも本当に皆様に助けられながら初心者なりにビジュアルベーシックを学んでおります。前回、三目並べの勝ち(3つ揃った場合)と負け(揃わなかった場合)の回数を別のダイアログに表示するためにはStatic変数(データを保持する変数)が必要だと教えて頂きました。それで現在Static変数を設定しているのですが 勝ちの場合 Static totalDecimal As String totalDecimal = Label1.Text = +1 三目並べと同じページに回数を記録しているコードを活用してみたのですが…うまくいきませんでした。 3つ揃ったらメッセージボックスに勝ち、と表示→違うダイアログボックスの中のラベルに1と表示としたくて何度もStaticに挑戦しているのですが…。何か良い方法はないでしょうか。 もう一つ、現在VBを使ってグラフを作っています(期末テストの課題です)なんとか日本の国旗のコードは完成したのですが、 Private Sub Button2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Button2.Paint 以下グラフィックのコード とこれではボタンを押してもグラフィックが表示されません。Call ButtonやもしButton2がクリックされた時グラフィックを表示、など試しているのですがエラーが出てしまいます。毎度頼ってばかりで申し訳ありませんがよろしくお願いいたします。

  • Friend変数について(VB2008)

    Friend変数について(VB2008) 今まで本当にお世話になり半分コーナー化してしまった自分のVBへの無知さを改めて此処で実感致しました。大方、プログラムは完成しましたが、再びスコア表示の所でつまずいております。 前回質問させて頂いたのですが(http://okwave.jp/qa/q5910705.html) 三目並べの勝ち(3つ揃った場合)と負け(揃わなかった場合)の回数をゲームのあるフォームとは別に新しいダイアログ内に表示するためのコードとして ダイアログ内に、Label を置き ゲームのフォーム内の勝ち負けを判定する場所に Label1.Text += 1 StatisticDialog.Label1.Text = Label1.Text を書いてスコアを表示しているのですが、突然「FRIEND関数」を使いなさいという指示がでてしまい…。 Friend関数を自分なりにも調べて色々試行錯誤してはいるのですが、やはり表示されません。どなたかご教授をお願いいたします。

  • サッカーくじBIGって本当にランダム三択なのか?

    ランダム三択で14試合選べば、確率的には、勝ちも負けも引き分けもそれぞれ4.7試合ずつ出るはずですよね? 今までBIGは10回くらいしか買ったことないのですが、、 ほとんど、ホームの勝ち数<アウェイの勝ち数<引き分け数、というパターンです。 引き分けは5~8試合くらい。 純粋にランダムで選んでこういうパターンばかりというのは、相当確率低そうですが、本当にBIGの目はランダムに選んでいるのでしょうか? ここで訊くのも間抜けですが、参考として質問です。

  • ラグビーの「勝ち点」

    社会人ラグビーが始まりましたが、 ラグビーの「勝ち点」って 「勝ち」3 「引き分け」2 「負け」1 なんですね。 「勝ち2」「分け1」「負け0」でも同じじゃないかと思うのですが、単に「弱いチームでも0点じゃかわいそうだ」という理由だけなんでしょうか? サッカーみたいに「勝ち」と「分け」の差のほうが「分け」と「負け」の差より大きいほうが、あくまで勝ちをねらう、という攻撃的なゲームにはプラスになるように思うのですが・・・。 たしか、20年ほど前、攻撃的なゲームをすすめるために「トライ」の得点を上げたことがあったと記憶しているのですが・・。 (個人的には、「勝ち2」「分け0」「負け-1」ぐらいでもいいと思う。「勝ち」点なんだから「勝ってもらう」ものでしょう。)

  • C言語で五目並べを作成しているのですが…

    学校のC言語の授業で5×5マスの五目並べを作っています。 教科書を見ながら、がんばっていましたが行き詰ってしまったので、ヒントを下さい。 基本的なことしか習っていないので、あまり高度なことはできません。 行き詰った点 ・すでに置かれているマスには置けないようにすること。 ・縦、横、斜めのどれか5マス揃うと、勝利と表示されてゲームが終 了すること。 ・引き分けの表示の仕方 面倒とは思いますが、どうかよろしくお願いします。 ↓CPPファイル ttp://sugar310.dip.jp/cgi/upload/source/up21525.jpg ttp://sugar310.dip.jp/cgi/upload/source/up21527.zip

  • 3目並べのプログラムについての質問です

    以下のようにプログラムをつくりました #include <stdio.h> #include <stdlib.h> #include <time.h> void cleanSquare(void); void hand(char); void hand_CPU(char); void printSquare(void); void judge(void); void three(char, char, char); char square[3][3]; int nokori = 9; int main( void ) { cleanSquare(); printSquare(); while(1) { printf("Your turn.\n"); printf("Input (x,y) :"); hand('o'); printf("CPU chose (x,y):"); hand_CPU('x'); } } void cleanSquare(void) { int x, y; for(x = 0; x < 3; x++) { for(y = 0; y < 3; y++ ) { square[x][y] = ' '; } } } void hand(char mark) { int h, v; scanf("%1d%1d", &h, &v); while(square[h][v] != ' ' ) { printf("%1d-%1dは埋まっています。再入力(横縦):", h, v); scanf("%1d%1d", &h, &v); } square[h][v] = mark; nokori--; printSquare(); judge(); if(!nokori) { printf("引き分け\n"); exit(1); } } void hand_CPU(char mark) { int h, v; srand(time(NULL)); //scanf("%1d%1d", &h, &v); h = rand() % 3; v = rand() % 3; printf("(%d,%d)\n", h, v); while(square[h][v] != ' ' ) { printf("%1d-%1dは埋まっています。再入力(横縦):", h, v); scanf("%1d%1d", &h, &v); } square[h][v] = mark; nokori--; printSquare(); judge(); if(!nokori) { printf("Tie \n"); exit(1); } } void printSquare(void) { int cnt; printf("\n 0 1 2\n"); printf(" -------------\n"); for(cnt = 0; cnt < 3; cnt++) { printf("%1d| %c | %c | %c |\n", cnt, square[0][cnt], square[1][cnt], square[2][cnt]); printf(" -------------\n"); } } void judge(void) { int x, y; for(y = 0; y < 3; y++) { three(square[0][y], square[1][y], square[2][y]); for(x = 0; x < 3; x++) { three(square[x][0], square[x][1], square[x][2]); three(square[0][0], square[1][1], square[2][2]); three(square[2][0], square[1][1], square[0][2]); } } } void three(char a, char b, char c) { if(a == ' ') { return; } if(a == b && b == c) { if(a == 'o') { printf("Win! \n"); } else { printf("Lose. \n"); } exit(1); } return; } 以前、学校の課題としてでたものを復習していたのですが、わからない部分がでてきました。 このプログラムを次のように改造したいのですが、どのように改造すればいいのかわかりません 1.ゲーム全体を関数化する main関数でこの関数を呼び出すと何回もゲームができるようにする int game(int n)と宣言しようと考えています 2.マス目の大きさを関数game()が引数として受け取ったnを、n×nのマス目でゲームができるようにする nは、ゲームごとにmain関数で入力 10×10までの大きさ 3.自分の番の時に、座標を入力する時に負の値が入力されたら、ゲームを終了させる 4.勝敗の記録と表示 例えば、引き分けを0、勝ちを1、負けを2、途中終了を-1 を戻り値として返すようにして、途中終了以外の場合はゲームの成績を 勝ち:3、負け:2、引き分け:0のように表示する 5.ゲーム終了後に続けるか、やめるかの選択 文字を一文字入力して、'y'なら1を返し、'n'なら0を返す それ以外の文字だったら、再入力させるという処理を関数化する int newgame(void)として宣言しようと考えています また、この関数の戻り値が0の場合プログラムの終了、1なら新しいゲームの開始 です。長くて申し訳ないですm(_ _)m よろしくお願いしますm(_ _)m

  • 延長戦終了後

    延長戦で引き分けに終わると 12回裏に守備についていた大抵のビジターチームスタッフは 勝ったように迎えるのはなぜなのでしょうか? それで攻撃のホームチームは負けた時のように去っていきます。 同じ引き分けなのにどうしてここまで対応が違うのか不思議です。 ビジターでの引き分けは勝ちに等しい ホームでの引き分けは負けに等しいという感じなんでしょうか?

  • 数A確率です

    問題は、「A、B二人がじゃんけんをしながら、次の約束で階段をのぼる。1回のじゃんけんの結果、勝った人は二段登り、負けた人はそのまま位置にとどまる。また引き分けなら、二人とも一段ずつ登る。6回のじゃんけんを終えた時点で、Aが最初の位置からちょうど8段登った位置にいる確率を求めよ。」です。(1)A勝ち2、引き分け4(2)A勝ち3、引き分け2、負け1、(3)A勝ち4、引き分け0、負け2 の三通りの場合が考えられるのがわかったのですが、 解答式をみると、(2)の式が、6C3・3C2・(1/3)3乗(1/3)2乗(1/3) となっていたのですが、式の途中の3C2・(1/3)3乗(1/3)2乗(1/3)がわかりません。どなかたわかりやすく解説お願いします

  • 確率の問題です

    確率の問題です。(2)からよくわからないので教えてください。よろしくお願いします。 サイコロ2 個を振って、その目の合計数で賭けをする場合について、以下の設問に答えよ。 (1) 第1 投目の合計数が7 または11 の時に「勝ち」、2、3、12 の時に「負け」、それ以外を「引き分け」とした場合、「勝ち」、「負け」、「引き分け」になる確率をそれぞれ求めよ。 (2) 第1 投目が「引き分け」の場合は、その時の合計数を「場の数」と定義して、第2 投目以降は合計数が7 か、または「場の数」になるまで振り続ける。もしも、合計数が7 になる前に「場の数」になった場合は「勝ち」、それ以外は「負け」とする。この時、第何投目に勝負がついたかまで考慮すると式が複雑になるので、「勝ち」の確率は、第2 投目における「場の数」が出る確率PA と、7 が出る確率PB からPA/(PA+PB)で近似できるものとする。この時、第1 投目が「引き分け」という条件下で、「勝ち」、「負け」になる確率をそれぞれ小数点以下2 桁まで求めよ。 (3)上記(1)、(2)の結果から、最終的な「勝ち」、「負け」の確率をそれぞれ小数点以下2 桁まで求めよ。

専門家に質問してみよう