C言語で素晴らしいオセロを作らないか?at TECH
C言語で素晴らしいオセロを作らないか? - 暇つぶし2ch331:329
07/12/03 14:22:10
>>328
URLリンク(kansai2channeler.hp.infoseek.co.jp)

332:デフォルトの名無しさん
07/12/03 14:29:39
>>328
ほらよ。
URLリンク(kansai2channeler.hp.infoseek.co.jp)

333:デフォルトの名無しさん
07/12/03 15:57:19
縦軸も横軸も数字になってるけど、普通は片方を
アルファベットにするもんだよ。

334:デフォルトの名無しさん
07/12/03 16:21:13
BOARDSIZEをdefineしてるのに10は決め打ちという不思議

335:デフォルトの名無しさん
07/12/03 17:07:43
>>329-331
こんなにミス、無駄がある現実・・・
配列を全部書くとイメージが凄いしやすいんですね。>>331のtxt頂きました有難うございます。
>>332のstaticとか縁の無い関数でしたが今少し使い道が分かった気がしました。
配列の初期化の方法でこういう方法がありましたかw参考になりました。
指摘コメントまで有難うございました。

>>333
列をアルファベットにするのが一般的っぽいので書き直す事にします
>>334
そこも直した方がいいみたいですね。ですがBOARDSIZEにしたら逆に見た目で
判断しずらくなったので長ったらしくなるまで少しの間数字にしておこうか迷う

336:デフォルトの名無しさん
07/12/03 17:55:31
>>335
オセロの派生版を作る野望がホンの微かでもないなら、8の決め打ちでもいいんじゃね?
BOARDSIZEを7にしたらどうせ同じルールじゃできなくなるわけだし。

337:デフォルトの名無しさん
07/12/11 14:49:59
>>335
最近は進んでるかい?

338:デフォルトの名無しさん
07/12/14 02:48:51
すいません、PCが壊れてしまい修理してました…。やっと戻ってきて再開できそうです。
派生盤等は現状で自分には考えられませんので決め打ちにしてみます。
PC戻ってきてもOCN規制で2chに書き込めず携帯から2ch発見しましたw
やれなかった分追い込みます。

339:デフォルトの名無しさん
07/12/15 03:14:44
プログラム初心者だが俺も作ってみようかな

340:デフォルトの名無しさん
07/12/15 03:18:28
がんばれ
協力するよ

341:339
07/12/15 08:44:36
332を参考にして交互に打てるのを作ってみました。
URLリンク(www.vipper.org)

かなり時間かかった。
とりあえず寝よう。。。

342:デフォルトの名無しさん
07/12/15 09:33:49
お疲れさん

343:デフォルトの名無しさん
07/12/15 10:24:16
>>341
勝手にアドバイスさせてもらうと、
isPlaceable() 内のdx, dyを
dx[] = {-1, 0, 1, -1, 1, -1, 0, 1};
dy[] = {-1, -1, -1, 0, 0, 1, 1, 1};
とすると、ループで書ける(x+dx[i]*count の形で表せる)のですっきりするよ。
同様にplace() も簡潔に書けると思う。

344:339
07/12/18 00:58:47
>>343
なんとかループに直すことができました。
あと、とりあえずランダムに打つAIをのっけてみました。

URLリンク(www.vipper.org)

次は適当な評価関数を作ってMinMax法を実装してみようと思います。

345:デフォルトの名無しさん
07/12/18 01:03:45
>>344
盤面はどうやって戻すつもり?

346:339
07/12/18 01:48:53
>>345
差分(打った場所、引っくり返した場所)を取っておこうかと思うのですが
はたしてこのままでいけるのかどうか実はよくわかってないです・・・

347:デフォルトの名無しさん
07/12/23 14:21:20
俺も大昔プログラミングの勉強する時にオセロを作ったよ。
作りこんでいくと遊び感覚でプログラミングの基本が勉強できるから良い課題だと思う。
中級を目指すなら、そのうち以下くらいは挑戦してみては? (今は意味不明かもしれんが・・・)

ポインタ→各種関数へのデータの引渡し
構造体→各種状態の保存
共用体→汎用関数からのステータス
ツリー構造→着手進行から高速サーチ可能なBook
再帰呼び出し→MinMax探索(αβ探索)
線形リスト→探索関数内での空マス保持リスト
ハッシュテーブル→探索局面の置換表
ソート→Move Ordering

F/W開発するハードエンジニアには、

ビット操作(含むMMX)→ビットボードによる高速化
同時実行率の高いコードの作成→処理の高速化
CPUキャッシュヒット率の高いコードの作成→処理の高速化

なんかも面白いと思う。

モンテカルロ法とか使って囲碁のプログラム書くのも良いけど、
基本の勉強にはオセロの方が色んな意味でわかり易い。

348:デフォルトの名無しさん
07/12/23 14:31:25
むりやり勉強とオセロを結びつけなくて良いよ

349:デフォルトの名無しさん
07/12/23 14:39:26
ど素人乙

350:デフォルトの名無しさん
07/12/23 17:29:24
モンテカルロ法はマルチスレッドの入門にいいかも

351:デフォルトの名無しさん
07/12/24 04:18:33
ニューラルネットワーク→葉局面評価関数

352:デフォルトの名無しさん
08/01/16 03:59:48
オセロ作るのにスタックを用いてるソース等見るのですが
スタックのがいいのですかね?

353:デフォルトの名無しさん
08/01/16 04:06:50
すいませんageてしまった

354:デフォルトの名無しさん
08/01/16 05:47:39
>>352
スタックを用いるといいのは盤面をintか何かの配列で表現するとき。
bit boardで表現するときは盤面全体をコピーしたほうがいいからスタックは不要。

355:デフォルトの名無しさん
08/01/16 06:04:20
>>354
配列で表現してみた方が自分にはイメージしやすいので、スタックを考慮して考えてみる事にします
レスありがとうございました!

356:デフォルトの名無しさん
08/01/20 02:47:48
論理的にしらみつぶしで先読みするタイプのものではなく
実際に対戦してみて経験を積むようなプログラムって
どのように書けばよいのでしょうか

357:デフォルトの名無しさん
08/01/20 05:09:44
>>356
強化学習が当てはまるけど
それぞれ独立した手法で通常は併用されるもの

358:デフォルトの名無しさん
08/01/20 05:40:58
強化学習はの実装はこれがわかりやすい
URLリンク(www.vector.co.jp)

359:デフォルトの名無しさん
08/01/20 10:03:16
宣伝乙

360:デフォルトの名無しさん
08/01/21 01:25:32
Cプログラマ必須テキスト!

URLリンク(mori.eco.to)


361:デフォルトの名無しさん
08/01/23 00:02:55
強化学習面白いな
確かHeraklesも使ってるんだっけ

362:デフォルトの名無しさん
08/01/27 06:19:42
AIを実装しようと挑戦中なのですが、MiniMax法について質問させて頂きます。

先手、後手ともに最善の手を取った場合を数手先読みし最善の場所を
決めるのがMiniMax法ですよね?
いざ実装してみようと試みたのですが最善手を評価する際のMAXとMIN
を以下のようにしたのですが、このようなやり方はダメな例ですか?

まずBord[10][10]というメインとなるボードと、それとは別に8*8の盤面にあらかじめ
数値を入れた盤面 (この数値の差分から数手先の最善手を決める) を用意しようと
考えています。

363:362
08/01/27 06:37:24
すいません何言ってるか分からないですよね。とりあえず>>362の方法で作ってみます
その上でどうか尋ねてみます。

364:デフォルトの名無しさん
08/01/27 09:43:00
MinMax法やばす・・・難しすぎるんだけど
とりあえずMiniMax法を作る上でのコツか何かありませんか

365:デフォルトの名無しさん
08/01/27 10:44:34
NegMax の方が実装は楽だが,minmax が作れないんじゃ一緒だろうねぇ.肝の部分は再帰使って数行で書けるんだけど.
プログラム例が載ってる本でも買えば?

366:デフォルトの名無しさん
08/01/27 10:45:23
int minmax (int min, int max)
{
for (i = 0; i < n; i++) {
move (i);
v = -minmax (-max, -min);
undo ();
if (v > max)
return v;
if (v > min)
min = v;
}
return min;
}

今30秒くらいで書いたけど基本はこれだけだと思う

367:デフォルトの名無しさん
08/01/27 11:30:57
>>365
ネット上の読み物で出来たらいいんですが、買うことを考えるべきですかね・・・
>>366みてみるとundoとかいう機能を作りずらい作りになってしまっている予感です
ネット上の拾いものからその行程が出来ないか試してみます
参考例ありがとうございました

368:デフォルトの名無しさん
08/01/27 15:40:51
書籍購入を躊躇うようなら、その程度ってこった。

369:デフォルトの名無しさん
08/01/27 15:46:51
NegaMax、MinMaxくらいならネットの説明だけでも十分すぎる。
まじで。

370:デフォルトの名無しさん
08/01/27 19:02:14
そんな脳を俺に下さい・・・

#define BOARD_SIZE 8
int Board[10][10];

自作関数1: ・x と y の座標を引数に貰い、Board[x][y] ( A1と打ったならば x = A(1)、y = 1 )
         について8方向を調べたあと置ける場所があるならばその場所を 返し、ひっくり返す。
        ・調べる方向は左上からy行x列方向に。
        ・手を指して次の盤面の状態にする

371:デフォルトの名無しさん
08/01/27 19:03:38
先手黒から見た評価関数の一部の例
>>366での
for (i = 0; i < n; i++) {
move (i);
v = -minmax (-max, -min);
undo ();
の部分だと思います
─────────────────────
/* ネット上の拾いものの解説 */
while( 打てる手がある ){

  ①手を差して次の盤面を作る;

  ②val = minimax( 盤面, depth - 1 );       一手先を読む再帰。3手まで読んでみるつもり

  ③盤面を1手戻す;
─────────────────────
/* 上記を例に作ってみた */
blackturn( int **board , depth )           2次元配列のポインタと、3手読みたいので3を貰う
{
  int val;
  if( depth == 0 ) return 評価値(盤面);

  for( y=1; y<=BOARD_SIZE; y++ ) {    盤面全部を検索し置ける場所を8*8全部調べる
    for( x=1; x<=BOARD_SIZE; x++ ) {
①     if( 自作関数1 ) {          board[x][y]に石が置けるならひっくり返してみる
        ターンを次にする;
        色を変える;
②       val = blackturn( &board , depth - 1 );

③問題点  ここの処理がスタックを用いておらず出来ません。通常どのように行って居るのでしょうか?
        長々と見ずらく申し訳ないですが伝わって頂ければ幸いです

372:デフォルトの名無しさん
08/01/27 19:56:38
石を返せることが分かってから返す際に石を置いた場所と返した場所の情報スタックに記録しておく
返した場所の代わりに方向とそれぞれの方向で返した数を記録してもいい

373:デフォルトの名無しさん
08/01/27 20:26:17
>>372
ネット上からスタックの例を見て条件満たせるよう作ってみます。
レスどうもありがとうございます!

374:デフォルトの名無しさん
08/01/27 20:26:47
もう世界一のプロが敗北してだいぶ経つんだし強さはもういらないだろ。
あとは人間との対局で統計データを取りながら
自動的にぎりぎりの強さで負けるような
ナチュラルな強さ調整機能をつけてくれ。

375:デフォルトの名無しさん
08/01/27 20:28:11
黙れ門外漢

376:デフォルトの名無しさん
08/01/27 22:15:23
>>375
お前のことか?

377:デフォルトの名無しさん
08/01/27 23:05:05
>>374>>376だよ(笑)

378:デフォルトの名無しさん
08/01/27 23:56:00
と門外漢が申しております

379:デフォルトの名無しさん
08/01/28 00:25:11
お前らこういう言い合い好きなんか

380:デフォルトの名無しさん
08/01/28 04:15:18
見るのも仕掛けるのも受けてたつのも好きだ

381:デフォルトの名無しさん
08/01/28 04:33:45
まぁそれくらいしか能が無いしな
がんばれ

382:デフォルトの名無しさん
08/01/28 06:23:57
石を返す処理って1方向ずつじゃないとダメっぽいんだな・・・
糞コード全開だぜ・・・

383:デフォルトの名無しさん
08/01/28 06:53:01
>>372の続きでスタックの質問なのですが
石を返す”場所”をスタックに書き込む処理というのは

Board[x][y]というBoardがあったとしますよね。
f5という入力の場所の記録を行う場合には
f5という数値を入れるのでしょうか?
スタックには       

             ← スタックポイントがここ
方向
石の数
場所
方向
石の数
場所(F5)       1番最初のデータ

という風に入れればいいのでしょうか?

384:デフォルトの名無しさん
08/01/28 10:14:42
>>383
これ無視して下さい。一から作り直すことにします

385:デフォルトの名無しさん
08/03/06 22:37:11
>>380
可能です。
以上。
はい、次。

386:デフォルトの名無しさん
08/03/06 23:05:43
誤爆か?

387:デフォルトの名無しさん
08/03/07 08:51:01
>>386
最近の流行

388:デフォルトの名無しさん
08/03/07 09:00:18
誤爆か?

389:デフォルトの名無しさん
08/03/23 01:42:36
あげ

390:デフォルトの名無しさん
08/06/19 01:43:37
再帰使わないで囲碁プログラムできないか?



391:デフォルトの名無しさん
08/06/19 01:46:01
できるよ

392:デフォルトの名無しさん
08/06/20 10:10:58
つーか,囲碁でも将棋でも再帰は使わない方が普通だと思うが

393:デフォルトの名無しさん
08/06/20 10:14:20
スレ違いなんだから話を引き伸ばすなよ



394:デフォルトの名無しさん
08/07/01 20:58:30
アルファベータ検索とか再帰だろ

395:デフォルトの名無しさん
08/07/02 13:25:00
概念的にはそうだが,実際は自分で管理してループにする方が普通
全データローカルスタックに取るわけにも行かないし

396:デフォルトの名無しさん
08/07/02 16:30:33
>>394
×検索
○探索


397:デフォルトの名無しさん
08/08/04 03:03:57
評価関数のパラメータに使う盤面の特徴量ってどんなのがありますか?
パターン、パリティ、クアッドパリティ、モビリティ、ポテンシャルモビリティ、他にあれば教えてください。
思いつきでもかまいませんので。


398:デフォルトの名無しさん
08/08/05 01:00:46
思いつきとしては、安定度みたいなのがあっても良い気がする。

αβ探索で深読みすると浅読みで良手だったのが悪手になったりするでしょ?
これって、その局面を進めていくとそういう局面を発見するからだって考えがちだけど、
単純に考えれば、浅読みの評価値が間違っているとも言える訳で。
評価関数が、局面の善悪を出力するのなら、1手読みで十分な筈でしょ?

俺としては、深読みが有効なのは評価値にはランダムな誤差があって、
何段ものミニマックス探索がその誤差をフィルタリングする結果、
安定度の高い(評価誤差が少ない)局面を選択できるからだと思ってるんだよね。

今はパターンの重みを決める時とかは、結果的にそのパターンが現れた時の
最終的な石差の平均値に収束するように決めてるでしょ?
でも、実際にはそのパターンが現れた時に勝つこともあれば負けることもある。
勝てる局面で下手をして負けるってこともあるけど、
実はそうではなくて、そのパターンを含む局面は本質的に不安定なのかもしれない。
と、考えてみると安定度というパラメータが見えてくる。

パターンAは50%は大負けで50%は大勝だとすると
普通に学習させるとこのパターンは勝ち負けに影響しないと判断されて重みは0になる。
10%は僅差負けで90%は大勝のパターンBと100%僅差勝ちのパターンCでは、
10%は僅差で負けるパターンBの重みの方が大きくなるのが普通だよね?
それで良いんだろうか?ってこと。
これらのパターンが選択可能な時、より確実に勝ちたかったら、パターンCを選びたいよね?

安定度っていうのはそういうこと。
今の評価関数にはこういうのが入っていないと思う。


399:デフォルトの名無しさん
08/08/07 02:53:31
>>398
評価関数が正確なら1手読みで十分だけれど、

逆に、
局面が最後まで読めるのなら
評価関数は石数を数えるだけで良いと考えると

読みの深さを増やすほど強くなりそうなことがわかる

だから、評価関数を正確にすることだけではなく
計算速度が速い評価関数が使われてるんだ。

>今はパターンの重みを決める時とかは、結果的にそのパターンが現れた時の
>最終的な石差の平均値に収束するように決めてるでしょ?

評価にMinimaxが使われているのだから、
評価関数のスコアも平均値ではなくて、
自分、相手が共に評価関数の決める最善手を指したときのスコアに
近づくようになってると思う。

だから

>パターンAは50%は大負けで50%は大勝だとすると
>普通に学習させるとこのパターンは勝ち負けに影響しないと判断されて重みは0になる。
>10%は僅差負けで90%は大勝のパターンBと100%僅差勝ちのパターンCでは、
>10%は僅差で負けるパターンBの重みの方が大きくなるのが普通だよね?

こんな風に勝率で評価関数を決めていないと思うんだが。

もし、そのやり方に沿って決めるなら
Minimax法が使えなさそう。

400:デフォルトの名無しさん
08/08/08 02:15:55
>>399
評価関数が局面から一定の値を導出するのであれば(極端な話、ハッシュ関数でも)
AIとしての強弱はともかくMinimax法は使える。


401:デフォルトの名無しさん
08/08/08 20:50:29
>Minimax法は使える
はぁ?

402:デフォルトの名無しさん
08/08/08 23:45:00
ひぃ?

403:デフォルトの名無しさん
08/08/09 00:13:50
ふぅ。

404:デフォルトの名無しさん
08/08/09 01:26:46
へぇ・・・

405:デフォルトの名無しさん
08/08/09 02:06:45
hint : static evaluation function, heuristic evaluation function


406:デフォルトの名無しさん
08/08/09 09:09:26
Minimaxを使う目的を分かってない人が混ざってるようだ

407:デフォルトの名無しさん
08/08/09 13:31:15
雑魚が混ざってきたか

408:デフォルトの名無しさん
08/08/11 02:16:50
URLリンク(slashdot.jp)

409:デフォルトの名無しさん
08/08/11 09:37:27
>勝つ可能性が一番高い動きを取り続けた。まるで機械のようだった

ワロタ

410:デフォルトの名無しさん
08/08/12 12:20:09
ミニマックスとアルファベータの違いがわからん
>>366に枝狩りの処理を入れたらアルファベータ?

どうでもいいけど評価値得てないよ・・・ minとmaxをアホみたいに
引っくり返してるアホ関数だなそれはw

411:デフォルトの名無しさん
08/10/20 02:17:59
age

412:デフォルトの名無しさん
08/12/04 20:42:21
ほす

413:デフォルトの名無しさん
08/12/05 12:29:18
読む->引き分けか勝ちが出る
優先順位に置く
完成

414:デフォルトの名無しさん
08/12/06 16:57:36
>>374
>もう世界一のプロが敗北してだいぶ経つんだし強さはもういらないだろ。
勝ち切る手のDB出来ちゃったからな

>あとは人間との対局で統計データを取りながら
>自動的にぎりぎりの強さで負けるような
>ナチュラルな強さ調整機能をつけてくれ。
序盤20手:大負けしない手を打つ
中盤20手:引き分けか2手差で負けるくらいの手を打つ
終盤20手:全力で勝ちに行く

このくらいでナチュラルに強い打ち手になると思うけど

415:デフォルトの名無しさん
08/12/06 16:58:56
2手差->2石差
すまんこ


416:名無し
08/12/25 01:19:00
オセロ懐かしい
父親が森田オセロ(8bitパソコン)より強いヤツをめざして、ORや多次元尺度など色んな手法を試していたな。

417:デフォルトの名無しさん
08/12/26 15:13:51
プログラム作成者の能力以上の強さにはならない件

418:デフォルトの名無しさん
08/12/26 22:34:13
関係ない書き込みばっかで本題が全く進行してねぇw

419:デフォルトの名無しさん
08/12/30 23:36:12
URLリンク(down11.ddo.jp)

420:デフォルトの名無しさん
08/12/31 01:16:31
>>419
NetBSD/MIPSだが、動かないぞ。

421:デフォルトの名無しさん
08/12/31 01:35:47
ソースは無し?

422:デフォルトの名無しさん
08/12/31 08:00:33
思考ルーチン以外のところは終わっているテンプレートオセロプログラムってあるの?
ないにしても、どういうテンプレートにしておけば組み込みやすいのだろうか?
データ構造とか、必要な関数とか、それらの関係性とか。
前に(学部でC++習ったときのプロジェクト)オセロ作ったことあるんだけど、
今見ると、この構成じゃ、思考ルーチンいれにくいなぁと思ったのであります。

423:デフォルトの名無しさん
08/12/31 12:13:57
URLリンク(www.vector.co.jp)

424:デフォルトの名無しさん
08/12/31 12:42:09
>>417
技術的にはそうだけど実際の強さは自分より強い物が作れるだろ
第一技術的に高度な物が強くなるとは限らないし

425:デフォルトの名無しさん
08/12/31 12:44:05
チェスのチャンピオンに勝ったプログラムだって
プログラマがチャンピオンより強かったわけじゃないしな。

426:424
08/12/31 12:45:25
例え話をすると素数を出すプログラムを作った人がその素数をそこまで数え上げられるわけじゃないだろ?
そういうこと

427:デフォルトの名無しさん
08/12/31 19:22:26
神の一手に一番近いのはプログラムかもしれないな

428:デフォルトの名無しさん
08/12/31 22:56:49
何を今更

429:デフォルトの名無しさん
09/01/01 00:34:42
Googleの社員の個人情報がググれるみたいなもんか


430:デフォルトの名無しさん
09/01/03 20:27:48
>>422
あらかじめ独立化することを考えておかないと、修正は難しいだろうね
どうせなら思考部分を別プロセスにすると、プログラム同士で対戦とか
簡単に出来て面白そう
Windowsだとoverhead大きいかな

431:デフォルトの名無しさん
09/01/03 21:08:14
最後の行関係ない

432:デフォルトの名無しさん
09/01/06 15:41:18
>>422
チェスのChess Engine Communication Protocolみたいに規格を決めればいいんじゃねえの。
参照:URLリンク(www.tim-mann.org)

433:デフォルトの名無しさん
09/01/06 16:19:31
オセロで他のプログラムと対局するのは
GGSっていうサーバを介するのが一般的


434:デフォルトの名無しさん
09/01/06 16:57:04
「神の一手は誰でも打てる。2手目以降の全てが平凡なのだ」 ―俺俺

435:デフォルトの名無しさん
09/01/14 20:53:49
第二法だが、コマンドを打つ。
光学的なコマンドを打つ。
光学的なコマンドを打つ。
物理段差という肉体計算の処理です。
この手の光線にきづかないように。
1+x+x+1+a+x+x+a+x+x+a+a+a+a+a+a+1+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a
+a+a+a+a+a+a+a+a+a+a+a+a+a a 1

436:デフォルトの名無しさん
09/01/14 20:54:56
>>453はこのスレッドのオセロの作者です。

437:デフォルトの名無しさん
09/01/14 20:56:06
上記更新
>>453>>423のオセロの作者です。

438:デフォルトの名無しさん
09/01/14 20:57:09
上記更新
>>453>>423のオセロの作者によるものです。

439:デフォルトの名無しさん
09/01/14 21:00:29
上記更新
>>453>>422のオセロの作者によるのです。

440:デフォルトの名無しさん
09/01/14 21:01:47
>>453>>422のオセロの作者によるものです。
上記更新

441:デフォルトの名無しさん
09/01/14 21:02:37
脳が無くなった。

442:デフォルトの名無しさん
09/01/14 22:15:20
>>453
おいおい、まじかよ。冗談じゃないぜ。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch