• ベストアンサー

javaアプレットで五目並べ

タイトルのとおり、五目並べ(連珠)を今、作成しております。 勝敗判定や、石を置くところまでは上手くできたんですが、禁じ手の三三ができません。 どなたか知恵を貸していただけないでしょうか? 私が、考えていたのは、3マスずつ黒の碁石か空白かを縦横斜めにみていき、共通の空白部分があって、その空白部分に黒の碁石が打たれたら三三の判定を下すというやり方です・・・。

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • poohron
  • ベストアンサー率59% (574/971)
回答No.2

プログラミングに関してはほとんど素人なので的外れかもしれませんが… >共通の空白部分に黒の碁石が打たれたら そうすると下の図の▲に打たれたときは三三の判定がうまくいかない気がします。 (実戦ではこんな石の置き方はしないでしょうけれど。)  一二三四五 1+++++ 2+++●+ 3++●●+ 4+▲+●+ 5+++++ それと、三三が出来上がるのは黒が打たれた時にその黒石が三三を構成している石になるはずです。 なので、 1. 打たれた黒石によって三ができていないか探す 2. この時点で三が2つできていたらアウト→禁じ手の処理へ 3. できる三が1つだけなら、その三を構成する残りの2つの黒石が三を作っていないか探す 4. (既に1つは三ができているはずなので)三が2つできていたらアウト→禁じ手の処理へ ※上の図で言えば四2の黒石が三を2つ作っているのでアウトと判定されますね。 こんな流れではどうでしょう?

masa888r
質問者

お礼

じんそくな回答ありがとうございます。 poohronさんの言うとおり私の今の考え方では三三の判定が完全にはうまくいきませんね。アドバイスありがとうございます。 今から、修正してみます。また、問題が発生したらまた知恵を貸していただけると幸いです。

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

盤面ぜんぶ調べなくてもいいんじゃないでしょうか。 いきなり三々ができるわけではなく、 黒が、ある点に打ったときにできるわけだから、 黒が打った点を中心に、4方向(縦・横・両斜め)を調べて、 二つ以上三連ができていればそれは三々だ…という考え方でどうでしょう。 この程度なら、打ってから考えても時間はほとんどかからないでしょう。 AIが三々を避ける場合は まず、仮想的に打ってみて、 仮想的な盤面と打った点を判定ルーチンに渡し、 「これ三々ですかね?」 とチェックするようにすればいいと思います。

masa888r
質問者

お礼

迅速な回答ありがとうございます。 なるほど~!!打ったところだけ中心に調べれば、全部調べずに済みますし効率も良いですね~! 参考になりました。早速試して見ます。

関連するQ&A

  • javaアプレットでフレームでのタイマーが起動しない

    現在、五目並べをアプレットで作っていて、タイトルが面からボタンを押す事で、フレームを呼び出してゲームをスタートさせるようにするところまで作りました。 しかし、碁石を置いたり、勝敗判定、禁じ手などゲームとしては動かせる事ができるのですが、持ち時間を表示するためのタイマーが起動しません・・・。 そこで、質問なのですがフレームにタイマーをつける事というのはできるのでしょうか?

    • ベストアンサー
    • Java
  • C言語で三目並べをするプログラムの作成

    C言語で三目並べ(いわゆる○×)をするプログラムを作成したいのですがうまくいきません;; どなたか教えてください。よろしくお願いします。 条件 ・コンピュータの手はランダムに決定するものとする(空いているところに打つ) ・盤面を表現する配列は3×3の二次元配列とし、グローバルに宣言する ・以下のような関数を作成すること:盤の表示、○×を打つ、3つ並んだかチェック ・他にも必要に応じて関数を宣言すること ヒント集 ・マスの状態は空:0 ○:1 ×:2など数値で定義するとよい。 ・char stone[3][3]={"-","○","×"};などと宣言しておくと便利? ・9マスしかないので、9マス打ち切ったら終了→このとき勝敗が決まっていなければ引き分け ・ループの考え方は2通りできる  1.先手後手がセットで1ループ、9マス目に先手が打ったらbreak 2.先手、後手それぞれ1ループ,nマス目は、n%2=0なら先手、n%2=1な  ら後手 ・三目並んだかのチェックは工夫のしどころ  ・手盤の人の石だけチェックする  ・打ったところの縦横は必ずチェック、斜めはどうする? ・作っていく順  ・石の入力+盤面表示、コンピュータの手番、3つ並んだかチェック、勝敗表示  ・石の入力+盤面表示、3つ並んだかチェック、勝敗表示、コンピュータの手番

  • 碁石を交点に置く理由-マスの中に置けば良いじゃん

    囲碁ってゲームあるじゃん。石を碁盤に打ってくんだけど、その打つ場所に違和感があります。 碁盤に線が縦横19本走ってて、その交点に石置いてるけど、何故でしょう?線に囲まれたマスの中に石を置けば良いじゃん。 将棋もチェスもオセロも、マスの中に駒置くよ。別に交点に置いても良くて、どちらでもルールの本質は保たれるけど、マスの中の方がシックリくるじゃん。囲碁もマスの中に碁石を置こうぜ。 石の色を赤青でやってる囲碁は見たことあります。んで、碁盤のサイズを19から変えてるのも見たことあります。 んが、マスの中に石置く囲碁は見たことないなー。

  • 連珠のルールはなぜあんなに分かりにくい? 三珠交替はなぜだめ?

    連珠の原始ルールである五目並べはほとんどの人が子供の時に覚えます。将棋や囲碁を知っている子どもの数と五目並べを知っている子どもの数は圧倒的に五目並べが多いと思います。ところが、五目並べを大人でも競技できるようにした連珠になってしまうと競技人口は将棋や囲碁にくらべて逆に圧倒的に少なくなってしまいます。ルールが分かりにくいというのが、そうなってしまった原因の一つのように思えます。たとえば「三珠交替」はまだ比較的わかりやすいのに「珠型交替・五珠二ヶ所打ち」は分かりにくいです。なぜ、三珠交替ではだめなのでしょうか? べつの質問になってしまいますが、三珠交替のように一方が開始の形を決めて、もう一方がどちらかを選ぶルールで先手後手の不均衡が解消できるのなら、そもそも黒の禁じ手も必要なくなると思うのですが、これについてはどうなのでしょうか? 一方がケーキを2つに分けてもう一方が好きな方を取るのと同じで子供でも考え方を理解しやすいと思うのですが。三珠交替では均衡が取れないのなら五珠交替にすればいいのでは?

  • 五目並べのプログラムを配列と関数を使ってつくりたいのですが、どなたか教

    五目並べのプログラムを配列と関数を使ってつくりたいのですが、どなたか教えていただけますか? あと作る際に次の条件を入れてつくれますでしょうか? 1:斜めの判定を入れる 2:手札を切る部分を関数でつくる 3:3×3を禁止にするプログラムを入れる

  • java

    java プログラミングで3×3の○×ゲームを作りたいのですが、エラーが出てしまいます。 どこに問題があるかわかりません。 教えていただけたら嬉しいです。 長くなってしまいますが、ご了承ください(コメント一部略)。 import java.io.*; // マスにの中身が // 空白: 0 // O : 1 // X : 2 class ox { // 勝敗の判定をするメソッド // 勝敗が付いていなければ0 を // O の勝ちなら1 を // X の勝ちなら2 を // 引き分けなら-1 を // それぞれ返す。 static int judge( int board[][] ) { int i, j, flag; for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][i]; // <=> flag = flag & board[j][i] if( flag != 0 ) return flag; } // 縦の列を調べる for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[i][j]; if( flag != 0 ) return flag; } // 左上→右下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][j]; if( flag != 0 ) return flag; // 右上→左下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[2-j][j]; if( flag != 0 ) return flag; // まだ置けるマスがあるかの判定 flag = 1; for( i = 0; i < 3; ++i ) { for( j = 0; j < 3; ++j ) flag *= board[i][j]; } // flag != 0 ってことは、置けるマスは無い→勝負が付いた // どちらかが勝ったのなら、上でreturn しているはず // ということで、引き分け if( flag != 0 ) return -1; // 何事もなければ、勝負続行 return 0; } // 番面の様子を表示するメソッド static void show ( int board[][] ) { String display = ""; String masu[] = { " ", "O", "X" }; int i; display += " |1|2|3\n"; for( i = 0; i < 3; ++i ) { display += "-+-+-+-\n"; display += (i+1) + "|" + masu[board[0][i]] + "|" + masu[board[1][i]] + "|" + masu[board[2} System.out.println( display ); } static int isreach( int three[], int turn ) { int i, result; // 各マスの値を2 乗して足し合わせる result = 0; for( i=0; i<3; ++i ) result += three[i]*three[i]; // リーチなら、下の条件を満たすはず if( result == 2*turn*turn ) { for( i=0; i<3; ++i ) if( three[i] == 0 ) break; return i; } return -1; } static int rival( int board[][] ) { int x,y,i,j,n; int three[] = new int[3]; // x, y が未定である事を明示 for( i=0; i<3; ++i ) { for( j=0; j<3; ++j ) three[j] = board[j][i]; 続きは追記にて

  • オセロの最小差勝利?

    皆様にお聞きしたいのですが、 オセロゲームの勝敗は、ゲーム終了時の黒石と白石の数が多い方が勝利者になりますが、下記のような条件の場合その黒と白の数が差がもっとも少ない勝利パターンは@@対@@になるのでしょうか? 条件:パスは使わない。    64マス全てに石が納まる。 宜しくお願いします。

  • javaアプレットが動きません

    InternetExplorerのブラウザを使って動画ダウンロードサイトのvid-dlを使ってます。外国でしかも合法な動画です。このvid-dlが突然使えなくなりました。どうやらjavaで動くようです。正確にはjavaアプレットのようです。お手上げです。くるくると回ったままです。 経緯を述べますと、ニコ生みるためのAdobeFlashプレイヤーが他のアドオンが有効になっていたため、みれませんでした。そこで全部無効にしたらみれるようになりました。再度元に有効だったものを有効にし直すと、ダウンロードサイトvid-dlが使えなくなりました。アドオンの中にjavaも存在しており、上記理由のため無効にしてから有効に戻しました。わかりません、おそらくjavaアプレットの不具合と思いますがわかりますか? 尚、勝手に詮索して違法とか馬鹿な事言わなくていいです。それなら回答しないでください。合法な動画だし、外国でやってます。

  • javaアプレットって??

    ど素人の質問ですが、辞書で調べてもjavaアプレットってjavaとどう違うのかわかりません・・・。 どういうのか教えてくださいσ(^^) よろしく♪

    • ベストアンサー
    • Java
  • Javaアプレットについて・・・

    Javaアプレットについてなんですけど、マウスのポインタに画像がついてくるようにするには、どうやるのですか?できれば、自分で作った画像をついてくるようにさせたいです。

    • ベストアンサー
    • Java