Cでオセロゲームのプログラムを作ろうと思ってますが
下記のプログラムに構造体、2分木(ゲーム木)、リスト構造、ミンマックス法、バックトラック法等を含みたいのですが
どのように書いていったらいいかわかりません。
どなたかわかる方いましたらよろしくお願いします。
#include <stdlib.h>
#include <stdio.h>
#define BOARD_SIZE 8
#define WALL '*'
#define BLACK 'x'
#define WHITE 'o'
#define NONE ' '
char board[ BOARD_SIZE+2 ][ BOARD_SIZE+2 ] ;
void board_initialize() {
int i , j ;
/* 周囲を壁で囲む */
for( i = 0 ; i < BOARD_SIZE+2 ; i++ ) {
board[ 0 ][ i ] = WALL ;
board[ BOARD_SIZE+1 ][ i ] = WALL ;
board[ i ][ 0 ] = WALL ;
board[ i ][ BOARD_SIZE+1 ] = WALL ;
}
/* 内部を何もない状態にする */
for( i = 1 ; i <= BOARD_SIZE ; i++ ) {
for( j = 1 ; j <= BOARD_SIZE ; j++ ) {
board[ i ][ j ] = NONE ;
}
}
/* オセロの初期状態の配置 */
board[ BOARD_SIZE/2 ][ BOARD_SIZE/2 ] = WHITE ;
board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2+1 ] = WHITE ;
board[ BOARD_SIZE/2 ][ BOARD_SIZE/2+1 ] = BLACK ;
board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2 ] = BLACK ;
}
void board_print() {
int i , j ;
printf( " " ) ;
for( i = 1 ; i <= BOARD_SIZE ; i++ )
printf( "%2d" , i ) ;
printf( "\n" ) ;
for( j = 1 ; j <= BOARD_SIZE ; j++ ) {
printf( "%2d:" , j ) ;
for( i = 1 ; i <= BOARD_SIZE ; i++ ) {
switch( board[ j ][ i ] ) {
case WALL : printf( "■" ) ; break ;
case BLACK : printf( "●" ) ; break ;
case WHITE : printf( "○" ) ; break ;
case NONE : printf( "+" ) ; break ;
}
}
printf( "\n" ) ;
}
}
int main(void) {
board_initialize() ;
board_print() ;
}
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
まず実質先制の
白のターンで考えると
白の場所を探す。
白の周囲の黒を探す。
その黒の直線上のに白or壁がなく空きがあること。
置ける場所がなかったらパス
それを繰り返す。
リバーシは一手に対しての評価をゲーム中で行うのは非常に困難です。
処理面を考えると全通りから勝つ組み合わせを摘出し
それ自体を評価値にし負けない手を選択するよう
プログラムを新たに起こしたほうが良いかもしれません。
No.4
- 回答日時:
まずは、人対人の対戦ができるようにするのが第一段階でしょう。
次に、どこでもいいから、置けるところに置くというルーチンを作るのが第2段階。
で、評価関数を取り入れるのがその次の段階で、
おっしゃるような方法を取り入れるのは、さらにその後の段階かと思います。
No.3
- 回答日時:
オセロのプログラミングをするなら、バイブルと呼べる本が「思考ゲームプログラミング」(森田和郎 他、アスキー出版局)です。
古い本なので図書館や古本屋で探してみてください。手始めとして「ある盤面に対して、座標(x, y)に黒の石を置けるかどうかを判定する関数」は書けますか? これが全く見当がつかないようだと、オセロに取り組むにはまだちょっと早いと思われます。
No.2
- 回答日時:
補足:参考リンク。
それぞれアルゴリズムが書かれているので、それを読んだだけでプログラム化できるだけの技量を持たないと応用できません。まず、アルゴリズム理解するところから始めましょう。次にサンプルプログラムをネット探して動きをデバッガなどで追って理解すること。理解したと思ったら何も見ずに自力でプログラム化、それが出来たらオセロへの応用です。
・2分木(ゲーム木)
http://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC% …
・リスト構造
http://ja.wikipedia.org/wiki/%E9%80%A3%E7%B5%90% …
・バックトラック法。
http://ja.wikipedia.org/wiki/%E6%B7%B1%E3%81%95% …
・ミンマックス方は、ミニマックス法の間違いかな?
http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%8B% …
・アルファ・ベータ法
http://ja.wikipedia.org/wiki/%CE%91-%CE%B2%E6%B3 …
No.1
- 回答日時:
無理です。
思考ルーチンの基本部分さえ書いていない状況では思考ルーチンそのものを丸々書いてくれって事になります。そのような依頼はここでは削除対象になります。まぁ、掲示板に掲載できるほど小さくも無いでしょうが。「思考ルーチンの作り方が分らない」→「思考ルーチンの仕組みが分らない」→「そもそも思考ルーチンの仕様を箇条書きにも出来ない」ってことだと思うので、そこから始めてください。もし既に出来ているなら、書いてもらえますでしょうか?
・構造体。
基本仕様が決まらないとどのような情報を保持して良いかわからないので書けません。本人が決めるべきことです。
・2分木(ゲーム木)、リスト構造、ミンマックス法、バックトラック法。
そいうテクニックの前に、もっと簡単な思考ルーチンから初めて発展させていくのが良いかと思います。挑戦は良いですが一度に挑戦しすぎです。
それぞれのサンプルプログラムはググれば沢山見つかりますので、それを参考にして自力でまずプログラムできる様になってからオセロの思考ルーチンに応用してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- 英語 文法的解釈を教えてください 1 2023/06/22 10:05
- 英語 意味を教えてください 1 2022/11/05 08:51
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- デスクトップパソコン 自作パソコンで、プリント基盤から実装してる人いますか? 2 2022/08/29 16:04
- 2ちゃんねる あにまん掲示板で変な人に絡まれました 1 2023/04/22 15:44
- 英語 マーブル柄のまな板は英語表記にしたらこちらであっていますでしょうか? Marble pattern 1 2022/06/30 21:14
- その他(ゲーム) ミラボレアスに並ぶのはアルバトリオンとグラン・ミラオスだけ←これ 1 2023/04/08 14:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
hit&bolwのプログラミングがで...
-
両替プログラムなど
-
strcmp
-
srand(time(NULL))の使い方
-
(構造体)双方向連結リストの作成!
-
C言語での、年複利の計算方法...
-
コマンドラインに出力した文字...
-
ifなんですが
-
筆算(加法)について
-
printf で二進表示を行いたい。
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
c言語で2000年以降カレンダーを...
-
WM_CLOSEで閉じれないウィンド...
-
球の体積と表面積を表示するプ...
-
cshの文字列操作(0埋め)
-
(C言語)西暦年月日を入力して...
-
C言語のfor文問題で・・・
-
ホームページをC言語で作りたい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
コンパイルエラーについて
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報