• 締切済み

リーチ判定

こんにちは。 C++の勉強を始めて半年の初心者です。今、コンソールでビンゴゲームを作っていますが、リーチ判定のやり方がわからなくて、みんなさんにお助けお願いしたく、投稿しました。 2次元配列を使わずに、int getCardNum(int row, int col)という関数を使ってリーチの判定をしたいのですが、自分の考えたコードが全く動作しなくて困っています。 皆さん、よろしくお願いします。

みんなの回答

回答No.1

この世に魔法はない、という前提で質問する必要があります。 あなたの考えたコードを掲載せずに、それをネットの向こうから 推測してアドバイスするというのは不可能なんです。 まずはご自身のコードを掲載してください。

hikurah
質問者

お礼

すいません。間違って、違うボタン押してしまいました。質問を投稿し直します。

hikurah
質問者

補足

その通りですね。すいません。 自分の書いたコードです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列の配列の比較

    こんにちは。タイトルどおり簡単な質問なのですが、どうしても確認したいのでお願いします。 とあるメソッドで、2次元配列の中にいくつか大文字のOが入ってるのですが、与えられた配列にOがあればtrueを返し、なければfalseを返します。 public boolean cellAt(int row, int col){ if(space[row][col].equals("O")) return true; else return false; } rowとcolはテストメソッドから値を受け取ります。 これでプログラム自体は動くのですが、WebCatという自動的に採点するものがあるのですが、それによるとエラーがでてしまいます・・・。 どこが違うのかは教えてくれないのですが・・・。 上で間違っているとすれば、文字列の比較くらいしかないんじゃないかと思うのですが、 space[row][col].equals("O") これで比較できますよね? 他のを調べて、if (Arrays.equals(space[row][col], "O"))これを試してもみたのですが、赤線が出てしまって無理でした。 どなたか宜しくお願いします。

  • 動的配列を宣言するためにnew演算子とdelete演算子を用いる方法が

    動的配列を宣言するためにnew演算子とdelete演算子を用いる方法があります。 2次元配列は以下のように宣言して作れるのは分かったのですが、 (実際に使って動かしてみました。) int **pp; pp = new int*[ROW]; // 行を作る for(int i = 0; i < ROW; i++) // 列を作る pp[i] = new int[COL]; http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section02/section02_07.html(引用) 3次元配列をどのように作ったらいいか分かりません。 教えてください。宜しくお願いします。

  • C++でビンゴカードのリーチ判定

    C++でビンゴゲームを作っています。C++の勉強を始めて半年の初心者なので、よく分からなくて、皆さんにお助けをお願いしたく投稿しました。 自分で作ったリーチ判定の関数が正しく動作してないので、どうやってやるか教えていただきたいです。よろしくお願いします。 //リーチの判定 int BingoGame::checkReach(int cell){ int reachRow, reachCol, reachDiag1, reachDiag2; int matchCnt = 0; int no_matchCnt = 0; //横 for(int i = 0; i < cell; i++){ for(int j = 0; j < cell; j++){ if(mObj_card.getNum(i, j) == 0){ matchCnt++; } else if(mObj_card.getNum(i, j) != 0){ no_matchCnt++; reachRow = mObj_card.getNum(i, j); } } if(matchCnt == (cell - 1) && no_matchCnt == 1){ cout << "reachRow: " << reachRow << endl; return reachRow; } } //縦 for(int i = 0; i < cell; i++){ for(int j = 0; j < cell; j++){ if(mObj_card.getNum(j, i) == 0){ matchCnt++; } else if(mObj_card.getNum(j, i) != 0){ no_matchCnt++; reachCol = mObj_card.getNum(j, i); } } if(matchCnt == (cell - 1) && no_matchCnt == 1){ cout << "reachCol: " << reachCol << endl; return reachCol; } } //斜め1 for(int i = 0; i < cell; i++){ if(mObj_card.getNum(i, i) == 0){ matchCnt++; } else if(mObj_card.getNum(i, i) != 0){ no_matchCnt++; reachDiag1 = mObj_card.getNum(i, i); } } if(matchCnt == (cell - 1) && no_matchCnt == 1){ cout << "reachDiag1: " << reachDiag1 << endl; return reachDiag1; }   //斜め2 for(int i = 0; i < cell; i++){ if(mObj_card.getNum(i, cell - 1 - i) == 0){ matchCnt++; } else if(mObj_card.getNum(i, cell - 1 - i) != 0){ no_matchCnt++; reachDiag2 = mObj_card.getNum(i, cell - 1 - i); } } if(matchCnt == (cell - 1) && no_matchCnt == 1){ cout << "reachDiag2: " << reachDiag2 << endl; return reachDiag2; } // return 0; }

  • 3次元配列の動的確保

    2次元配列は、 // 動的確保 int **mat = new int*[row]; for(i = 0; i < row; i++) mat[i] = new int[col]; //解放 for(i = 0; i < row; i++) delete [] mat[i]; delete [] mat; で、生成と開放はできたのですが、3次元となると、途端にわからなくなります。 かれこれ1時間半は試行錯誤はしているのですが、たどり着きそうにありません。 どなたかご教授願います。

  • javaプログラミング

    ただいまjavaで3×3のビンゴの制作で練習しております。 ビンゴカードの数字、ビンゴのボール?の数字を1~9で制作しました。 まず、一つの配列に1~9の数字をランダムで配置し、そしてそれを3×3の二次元配列で配置し、そしてさらにもう一つの配列にビンゴボールの番号をランダムで配置し、照らし合わせていくというプログラムを作りました。 3×3の数字で、出てきたボールの数字と対応した、二次元配列にある数字を0に変更(入れ替え)というところまで、できました。そこで最後にビンゴかどうかの判定をするところで詰まってしまいまして、縦、横、ななめいづれかに0が並ぶとビンゴ達成なのですが、ビンゴの判定方法のソースコードがわかりません。for文で回してみたりif文でやってみたりしたのですがどれもダメでした。一例や、ヒントなど。回答よろしくお願いします。 色々調べてみたのですが、自分のように全部配列に入れて動かしているソースが見つからず質問させていただきました。

  • AVRによるマトリクスLED制御

    AVRによるマトリクスLED制御 この度大学でAVRによるマトリクスLED制御を行う事になったのですが、プログラム面で今行き詰っています. void PointDisplay(int* pointlist[8][8],int time)//指定した座標のLEDを点灯させる { PORTB=init_PORTB; PORTD=init_PORTD; for(int loop=0;loop<=time;loop++) { for(int k=0;k<=7;k++){ switch(k){ case 0: ROW1_on; break; case 1: ROW2_on; break; case 2: ROW3_on; break; case 3: ROW4_on; break; case 4: ROW5_on; break; case 5: ROW6_on; break; case 6: ROW7_on; break; case 7: ROW8_on; break; } for(int j=0;j<=7;j++){ if(pointlist[k][j]==1){ switch(j){ case 0: COL1_ready; break; case 1: COL2_ready; break; case 2: COL3_ready; break; case 3: COL4_ready; break; case 4: COL5_ready; break; case 5: COL6_ready; break; case 6: COL7_ready; break; case 7: COL8_ready; break; } } } PORTB=init_PORTB; PORTD=init_PORTD; } } } 以上が使用する関数で,実行内容としては2次配列pointlistを関数PointDisplayに渡し,time分だけループするという関数になります. マトリクスLEDは8×8のTOM-1588BHです.(データシートも添付しております 引用) 使用しているAVRはATmega168Pで,PORTD0~7をLEDの1~8pinにPORTB0~7をLEDの9~16pinに接続しています.(回路がわかりやすくなるように)そしてそれを#defineで定義しそれぞれをビット制御しています. 行き詰っている理由はintの配列を4つまで定義してコンパイル>実行すると思ったとおりにLEDに表示されるのですが,5つ以上定義してコンパイル>実行すると3,4つめの配列が乱れてしまいます.(ひとつ右にずれたりひとつ上にずれたり) 4つまでは正常に動作しているのでハード面は問題ないと考えて,ソフト面を見直しているのですが,なぜ悪いのかが理解できません.(オーバーフローとかそんなんですかね?) こういったマイコンを扱うプログラムは経験が少なく,データシートも英文なので困っています.どなたか詳しい方,知恵を貸していただけないでしょうか?お願い致します.

  • ループを使った掛け算のプログラミング

    こんにちわ。 Loopを使い、1~12までの掛け算の表を作ります。Rowが初め、Colが二番の変数になり、 Row、Colともに一つずつ増えます。 1x1=1 1x2=2 ........ 1x12=12 2x1=2 ........ 12x12=144 というようにすべての掛け算を表示させたいのですが、私が作ったプログラムで 上記のように表示されるのか、わからなくなってきてしまいました。 言語は問いませんのでアドバイスお願い致します。 下記が私が疑似コードで書いたものです。 Declare row, col, total As int   For (row=1; row<=12; row++)   For (col=1; col<=12; col++)   Calculate total=row*col   Display "row" + "*" + "col" + "=" + "total"   EndFor EndFor よろしくお願いします。

  • RAW画像高速表示について

    画像処理ソフトの研究をc言語で行っています。 GUIの導入を目指してVC++の勉強を始めたのですが、RAW画像をうまく表示できず困っています。 現在練習と言うことで、スクロールバーの値によって画像を二値化して表示する処理を行っています。 表示部分を以下のように書いた(ほとんど本を丸写したので意味もちゃんとわかっていませんが)のですが、動作が遅すぎて困っています。 (IMG:unsigned char型の二次元配列にRAWデータを格納したもの) 高速で表示することはできないのでしょうか? アドバイス等、よろしくお願いします。 void Cimage_binView::writeImg(void) {  CClientDC myDC(this);  CDC *pDC = m_pict.GetDC();  int col,row;  int I;  CRgn myRgn;  RECT rect;  m_pict.GetClientRect(&rect);  myRgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);  pDC->SelectObject(&myRgn); //画像出力  for(col=0;col<256;col++)   for(row=0;row<256;row++)   {    I=IMG[col][row];        if(I<m_sbar1.GetScrollPos())I=0;//スクロールバーの値より小さければ黒    else I=255;//大きければ白にする }    pDC->SetPixel(row,col,RGB(I,I,I));  } }

  • セグメンテーションエラーがでます

    今、cでオセロゲームを作っています。 コンピュータと対戦できるようにしたいのですが、セグメンテーション違反になってしまいます。 p[LEN*LEN]を大域変数にするとうまく動きますが、以下のように局所変数にして関数で受け渡しをすると、 数回ループさせたところでエラーで強制終了します。 おそらく関数find_legal_moveへのp[]の渡し方が悪いのだと思いますが、なぜか分かりません。 以下にプログラムの一部を載せますので、お手数ですが原因を教えていただけないでしょうか。 よろしくお願いします。 #define LEN 10 /* ボードの1辺 */ #define opponent(player) (3-(player)) /* 1の相手は2, 2の相手は1 */ typedef struct {  int row; /* 行 */  int col; /* 列 */  int dr, dc; /* 行, 列の向き */ } Position; // 裏返る石の個数 int count_turn_over(int board[][LEN], int player, Position p) {  int i;  for (i=1; board[p.row+i*p.dr][p.col+i*p.dc]==opponent(player); i++);  if (board[p.row+i*p.dr][p.col+i*p.dc] == player)   return i - 1;  else   return 0; } // playerが(row, col)に石を置けるかどうかをチェック int is_legal_move(int board[][LEN], int player, Position p) {  if ((p.row < 1 || p.row > 8) || (p.col < 1 || p.col > 8))   return 0;  if (board[p.row][p.col] != 0) return 0;  for (p.dr = -1; p.dr <= 1; p.dr++)   for (p.dc = -1; p.dc <= 1; p.dc++)    if (count_turn_over(board, player, p) != 0)     return 1;  return 0; } // playerがどこに石を置けるか int find_legal_move(int board[][LEN], int player, Position p[]) {  Position pos;  int i = 0;  for (pos.row = 1; pos.row < LEN - 1; pos.row++)   for (pos.col = 1; pos.col < LEN - 1; pos.col++)    if (is_legal_move(board, player, pos) != 0) {     p[i].row = pos.row;     p[i].col = pos.col;     i++;    }  return i; } // computerの入力 void computer(int board[][LEN], int player, Position *pos) {  int i, num, max;  Position p[LEN * LEN];  printf("コンピュータの番です\n");  // 一番多く取れるところを取る  num = find_legal_move(board, player, p);  max = count_turn_over(board, player, p[0]);  pos->row = p[0].row;  pos->col = p[0].col;  for (i = 1; i < num; i++) {   int tmp = count_turn_over(board, player, p[i]);   if (max < tmp) {    pos->row = p[i].row;    pos->col = p[i].col;   }  } }

  • 条件判定文でのパタンマッチができない

    ある配列(列)の中から大文字'P'または小文字'p'どちらかの数を数えるために次のような判定を繰返したいのですが、正規表現を使ってどのように書けばよいのでしょうか。 次の場合"P","p"どちらにもヒットしません。 初歩的なことを質問しているとは思いますが回答をお願いいたします。 if ($data[$row][$col] eq "[Pp]"){ $cnt_p++; } $data には次のような値が入っていて1,2列目にある"P"または"p"の数を計数したいのです。 P01 0P0 p11

    • ベストアンサー
    • Perl