忍者ブログ

ぐれーすけーるブログ

ゲームプログラミングを独習中なんだぜ☆

↑同人活動☆w
ホームページ☆
『きふわらべ』のダウンロード
は、ホームページへ飛ぶ↑☆

ぐれーすけーる は、ゲーム86パーセントでお送りするんだぜ☆↑押すと最新記事に飛ぶぜ☆



第25回世界コンピュータ将棋選手権1日目に
初出場した『きふわらべ』の記事はこちら↑☆
↑東方二次創作音楽
CD78サークル分買った
No image
(↑終了)
秋葉原裏通りの潰れそうなオリジナル同人
ソフト店『さんげっと』の記事はこちら☆

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【将棋】めざせ世界コンピュータ将棋選手権☆(69) きふわらべの開発を地味に進めるんだぜ☆ww

2015-03-22 10:56

Grayscale.P025_KifuLarabe.L100_KifuIO.KifuParserA_Impl

というクラスが、ビューとドキュメントを結合してしまっていて 開発の障害なので、

  ・棋譜パーサーA
  ・ビューA

の2つに分けたいんだぜ☆
できはするんだろうが、どうやるのか☆ 今日は やってみるんだぜ☆



まず、いきなり手のひらを返すようだが、 棋譜パーサーA には
ビュー の操作は含まれていない☆

棋譜パーサーAは イベントハンドラー を登録できる仕組みにしてあって、
棋譜パーサーAが動いている最中に 画面上も動くように 拡張できるしかけになっている☆

今回、GUIをクライアント、棋譜パーサーをサーバー、と ぶったぎる計画なので、
棋譜パーサーに、画面を動かすイベントハンドラーは登録できない、ようにする予定☆


棋譜パーサーAに、画面上の操作を入れんな☆ という改造計画なんだぜ☆



では、どのような イベントハンドラー を登録しているのか調べてみたんだぜ☆


  ・新しい局面図が作成された直後

        → 登録: 特に、なにもしない空っぽの処理


消せ☆www


  ・平手初期局面にリセットしたとき

        → 登録: 画面を再描画します


むう☆ 棋譜パーサーA を使うような処理があるんだったら、GUI側は
問答無用で 画面を再描画するように改造しよう☆w


  ・一手進めたとき

        → 未使用


消せ☆www



12:57

ざっくり改造したら
棋譜入力テキストボックスに、2回指し手を入力してしまう制御の流れになって
しまったんだぜ☆

  ・棋譜をパースした直後に    テキストボックスに指し手の符号を追加する☆
  ・画面を再描画するタイミングで、テキストボックスに指し手の符号を追加する☆

パースの直後に 画面操作を実行する作りをやめて、
画面操作をするタイミングを決めておいて、何をそのときやるのか 溜めておく、
という作りにした方が良さそうだな☆ww


14:18

符号が表示されなくなったんだぜ☆ww
見直すぜ☆ww 符号を表示する
  shogiGui.Shape_PnlTaikyoku.SetFugo( ... )
の呼出し箇所一覧☆

  ・Util_InGui#IttesasiPaint
  ・Util_InGui#Makimodosi_Gui
  ・SceneB_1TumamitaiKoma#MouseLeftButtonUp
  ・SceneB_2OkuKoma#MouseLeftButtonUp
  ・WidgetsLoader_KifuNarabe#After_NaruNaranai

思ったよりいっぱいあった☆ww
ここに、
  ・Ui_PnlMain#timer1_Tick
も追加したんだが、

1手指したあとに、再描画がスルーされることがあるな☆ww
タイマーは必ず通るだろうと思って再描画を置いておいたんだが、
タイマーによる再描画は優先順位が低くなるように排他処理をしたので すっとばされる☆ww

これは、空っぽの符号を[コマ送り]することで 再描画をさせることにする☆ww


15:04

で、次は ビュー部分から、こんなの将棋サーバー側でやることだろ、と思う部分を
切り離せるか試してみるぜ☆


独特な仕組みなんだが、

    テキストボックスに符号を入れる。
     ↓
    [コマ送り]ボタンを押す。
     ↓
    棋譜が更新される。

で、1セットになっている☆ これが開発の足を引っ張っている☆ww
いったん、
次のような形に変更したい☆ww


    テキストボックスに符号を入れる。
     ↓
    [コマ送り]ボタンを押すと、符号は 記憶される。
     ↓
    [レシーブ]ボタンを押すと、記憶された符号を使って 棋譜が更新される。



というように、テキストボックスを よそもの にすることで、
[コマ送り]ボタン無しでも 棋譜更新 が進むようにするんだぜ☆
[レシーブ]ボタンさえあればいい、みたいな☆ww


16:47

改造を進めていくと、Komaokuri_Srv メソッドが空っぽのメソッドになっていた☆ww
いつ消した☆ww

中には TuginoItteSusumu_Srv といったメソッドが入っていたはずなのだが☆ww



17:37

消してしまっていたメソッドを復旧させたんだぜ☆

そして、
.exe を参照設定に入れていたという 変なこともやめて .dll を参照設定に
入れなおしたんだぜ☆



17:56

[コマ送り]ボタンを押したあとと、
[巻き戻し]ボタンを押したあとで、
画面の再描画処理が異なる☆wwwww

そろえろ☆www


[コマ送り]ボタンを押したら、入力棋譜テキストボックス の符号が1つずつ消えていって
欲しいんだが、
その機能も なくなってしまった模様☆ww
普及作業なんだぜ☆ww


18:35

[コマ送り]ボタンは修復したんだが、[再生]ボタンは壊れているんだぜ☆
これも直すぜ☆


19:00

[再生]ボタンは動くようにした……んだが 途中で強制終了しているんだぜ☆
なぜなんだぜ☆……(/_\);;


[再生]ボタンはどうやら、棋譜のほとんど全部を再生し終わったあとで
強制終了しているんだぜ☆
直せなかったんだが、対コンピューター は動いているので 先に進むぜ☆


19:19

次☆

駒を進ませる(1手指す)という処理なんだが、

  Ui_02Action#Komamove1a

これも 画面がやるような部分と、将棋サーバーがやるような部分が、いっしょくたに
なっていて 開発の進行を妨げている☆

  ・画面がやるような部分
  ・将棋サーバーがやるような部分

に、ばっさり分けたいと思うんだぜ☆ 2箇所で使われている☆

  ・P200_KifuNarabe.L050_Scene. SceneB_2OkuKoma#MouseLeftButtonDown
  ・P200_KifuNarabe.L100_GUI.  WidgetsLoader_KifuNarabe#After_NaruNaranai



23:27

ちょっぴり 分けた☆

次にやりたいのは、


  ・サーバーに処理を投げる。
  ・サーバーからの返信を待ち続ける。
  ・サーバーからの返事を受け取る。
  ・何か作業を進める。
  ※くり返し


という1セットのプログラミングを、何個も連続させる、といった
処理の流れへ改造したいんだぜ☆

実現の仕方としては、タイマーを使う方法がある☆


タイマー(100ミリ秒毎)

  state = 1 のとき
    処理A
  state = 2 のとき
    処理B
  state = 3 のとき
    処理C


といった作りにしておいて、処理が終わるたびに state の数字を変えていくんだぜ☆



とりあえず、 P200_KifuNarabeプロジェクトに L051_Timed フォルダーを
掘っておいたんだぜ☆
今後、このタイマーを使ったプログラムに置き換えていくぜ☆




. ほっほー☆ GUIと将棋サーバーに分ける作りを進めていると、1本のプロシージャだったプログラムが、メインループ回してwait置いて、state変数のswitchで状態遷移しまくるゲーム風プログラムに大改造なんだぜ☆wwwww こうなるのか☆ww


. GUIをゲームエンジンAIMSに置き換えれば楽できるぞ、と思ったんだが、置き換えるために一旦、ゲームエンジンAIMSに置き換えられる構造にしてから 置き換えよう、とやり始めたら多分これ ゲームエンジンSHOGISみたいなものを作るはめになってるな☆wwwww




微速微進 寄り道 遅々前進☆! なんだぜ☆wwww


拍手[0回]

PR

【将棋】めざせ世界コンピュータ将棋選手権☆(68) 電王戦も見つつも、きふわらべの改造を進めよう☆ww

2015-03-21 12:07

Ui_01MenuB#ReadLine_TuginoItteSusumu(...) この関数を変えよう☆ww
参照箇所は2箇所☆

  ・Ui_01Menu#Komaokuri_GUI(...)
  ・Ui_01MenuLoop#Saisei

その前に、 Ui_PnlMain が画面で、
Ui_PnlMain#Response で再描画が始まるんだが、
これを、ボタンを押したときに 直接呼び出すのではなく、
1つ 間に 何か仲介を かまそう☆w


Ui_PnlMain#Response の使用箇所は次の7つ☆
  ・KifuNarabeImpl#Response(...)
  ・Ui_PnlMain#timer1_Tick(...) <その1>
  ・Ui_PnlMain#timer1_Tick(...) <その2>
  ・Ui_PnlMain#Ui_PnlMain_Load
  ・Ui_PnlMain#Ui_PnlMain_MouseMove
  ・Ui_PnlMain#Ui_PnlMain_MouseDown
  ・Ui_PnlMain#Ui_PnlMain_MouseUp

おっ☆ これは単純に 1個 に統一できたんだぜ☆w
  ・KifuNarabeImpl#Response(...)

ふむ☆
次に、 Ui_PnlMain#Response(...) の引数の中には、 ResponseImpl response というのが
あるんだが、これを KifuNarabeImpl クラスのプロパティにしてしまいたいんだぜ☆

現状、引数を細かく渡しているんだが、

  どんっ!

と、大きなグループで渡したい☆ これは イメージで説明すると、


きめ細かなプログラムのイメージ図
  ・ . ・   ・・   ・
    ・  .・  ・・・   ・
   ・・ ・  ・・  ・ ・   精密で緻密☆!
  ・    ・    ・・  ・  だが手を付けにくい☆
   ・ ・・ ・・ ・  .  ・
  ・  .  ・    ・ ・

大きくまとめられたプログラムのイメージ図

    ● ・     ●
       ●         ・ 荒くてすっぽ抜けているが、
          ・    ●   手を付けやすい☆!
     ・        ・

という感じなんだぜ☆ 後者にしたいんだぜ☆ww
ここで問題なのは、

  マウスクリックや、通信、タイマーからの、指示の同時発生

なんだぜ☆ GUIが使われるようになりだした時代以降の
プログラムが複雑になる理由の1つに、マルチタスク がある☆

  父「部屋を掃除しろ」
  母「宿題をしろ」
  兄「寝ろ」

という指示が 同時に飛んできた 弟 は、どうすればいいだろうか☆?

部屋を掃除してから 宿題をし、寝る のがいいと わたしは思うんだが、
コンピューターの解答としては、 寝ながら掃除をしつつ宿題もする という
答えになるかもしれないんだぜ☆

順番に1つずつやるのを シングルタスク
同時進行でやるのを マルチタスク という☆



ここでわたしは、

  マルチタスクをなるべく禁止して、できるだけシングルタスク

にしたいんだぜ☆
なぜなら、さっき説明したとおり 緻密流 → かいつまみ流 にしたいからだぜ☆

かいつまみたいから、シングルタスクにする☆ww
緻密が嫌だから、シングルタスクにする☆ww



再掲しよう☆
Ui_PnlMain#Response の使用箇所は次の7つ☆
  ・KifuNarabeImpl#Response(...)      ←棋譜の自動再生中
  ・Ui_PnlMain#timer1_Tick(...) <その1>  ←タイマー
  ・Ui_PnlMain#timer1_Tick(...) <その2>  ←タイマー
  ・Ui_PnlMain#Ui_PnlMain_Load      ←.exeダブルクリック
  ・Ui_PnlMain#Ui_PnlMain_MouseMove   ←マウス操作
  ・Ui_PnlMain#Ui_PnlMain_MouseDown   ←マウス操作
  ・Ui_PnlMain#Ui_PnlMain_MouseUp    ←マウス操作

ということで、
  「棋譜の自動再生中」に「タイマー」が働きながら「マウス操作」もされる
と、父、母、兄 のマルチタスクになっているな☆

これを単純に いっしょくた に統合すると 弟 が爆発する可能性が高い☆
まず最初にやることは、

  父、母、兄 を シングルタスクに沿わせる(順番を決めてしゃべれ)

にすることだぜ☆ これを実現する方法の1つに 排他処理(はいたしょり) がある☆


排他処理とは、スネ夫の言葉を借りれば

  「このゲームは3人用なんだ☆ のび太はダメー」

で言い表せるように、 特権を持つ者と、持たざるもの に分ける制度なんだぜ☆


今回、そんな排他処理の中でも シンプルな手法の1つ、ミューテックス を
使ってみようと思うんだぜ☆

  「この弟は1人用なんだ☆ 母、兄はダメー」

という手法だぜ☆ ひとりずつ入ってください、みたいな
文化祭のオバケ屋敷の 1人用バージョン みたいな感覚だぜ☆

オバケ屋敷の出口に 受付がいて、 オバケ屋敷の中に今、客がいるかどうか
覚えておく☆
オバケ屋敷の入り口にも 受付がいて、入っていいか 出口の受付と連携を取るんだぜ☆


この仕組みで重要なのは、

  カウントを取る方ではなくて、
  待たせている客をどうするのか

の方なんだぜ☆

  「マウスクリックをしたんだぜ☆ でも何も起きないんだぜ☆! バーロー!」

となるのか、

  「タイマーは今回無視して、マウスクリックを優先しよう」

となるのか、

  「マウスクリックとタイマー、合体させて1人の客にしてしまおう」

とするのか、

  「棋譜再生が優先だろう。マウスクリックとタイマーは無視しよう」

とするのか、ルールを決めておく必要があるんだぜ☆


  (1)起動     の解決中は、他全部          は無視する☆
  (2)棋譜再生モードの解決中は、タイマー、マウスクリック は無視する☆
  (3)マウスクリックの解決中は、タイマー         は無視する☆
  (4)タイマー   の解決中は、次のタイマー       を無視する☆

という感じで良さそうだな☆


16:25

メモ: W050_UsiLoop#AtLoop_OnPosition(...) から KifuNarabeImpl を参照するには、
    どこだっけ☆ww

きふわらべ は、GUI を持っていなくて、
きふならべ は、GUI を持っているんだぜ☆

きふわらべ のメソッドの中から GUIのメソッドを参照しようとしている部分は
構造が怪しいんだぜ☆ww


17:30

将棋エンジン     には GUI情報 は要らなくて、
将棋エンジンも GUIも、 棋譜情報  を持っているんだぜ☆

共通部分は、その差を飲み込むんだぜ☆


17:50

ServerInterface オブジェクトを、将棋GUIが持っていて、
それを将棋サーバーだと思って使うように作っている☆

使用箇所を一覧しておくぜ☆
  ・Ui_01Menu#Makimodosi  ※[巻き戻し]ボタン
  ・Ui_01MenuB#ReadLine_TuginoItteSusumu  ※[コマ送り]や[再生]

うむ、実質 2箇所だけか☆



(スレッド1)再描画を指示 → テキストボックスに棋譜入力
(スレッド2)タイマー→ テキストボックスの棋譜読取→[コマ送り]等を指示 


棋譜の[巻き戻し]、[コマ送り]、[再生]を GUI がやっているんだが、
これを将棋サーバーに持って行きたいんだぜ☆



03:29

「棋譜パーサーA」という部品が、GUIと 将棋サーバー部の両方を兼ねていて
分割の障害になっているんだぜ☆

日曜日に直せるといいんだぜ~☆

微速微進☆ 寄り道 遅々前進☆w





拍手[0回]

【将棋】めざせ世界コンピュータ将棋選手権☆(67) 新しい形に移植しやすい形にするんだぜ☆ww

2015-03-19 20:15

今日 やりたいことは☆


現状、きふわらべ は、将棋サーバーと画面は一体型になっているんだぜ☆
要は 1本のソフト なんだぜ☆

これを。

こんな感じで、PC画面部分と、将棋サーバー部分が、
まるで別の2つのソフトに分かれているみたいに
分けたいんだぜ☆ww
そこで。

こんな風に、1つのソフトの中に 擬似的に、読み/書き 部分を作るんだぜ☆

  ・メソッドを直接 呼び出せない☆
  ・文字列を 送ることだけができる☆

という作りにするわけだな☆



22:08

ファイル・パス で大混乱している☆wwww まとめてみるんだぜ☆ww


──────────────────────────────

わたしの C#ソリューションは 次のフォルダーにおいている☆

  C:\Users\Takahashi\Documents\Visual Studio 2012\Projects_Shogi\

これを【ホーム】と呼ぶことにするぜ☆ww

──────────────────────────────

【ホーム】の下は、ライセンス管理を便利にするために、オーサーで分けている☆ww


  【ホーム】
    ├──By_Circle_Grayscale
    ├──By_Circle_ProjectDark
    ├──By_NeueCC
    ├──By_NLua
    └──など


わたしは、自分のサークルである By_Circle_Grayscale フォルダーの中だけを改造している☆
他のフォルダーは、ライブラリ参照してるだけだぜ☆ww

──────────────────────────────

By_Circle_Grayscale フォルダーの下は、モジュールなんだぜ☆
循環参照をなくすために、シンプルな ピラミッド型になっている☆

  By_Circle_Grayscale
    ├──P006_Syugoron
    ├──P012_KnowledgeShogi
    ├──P025_KifuLarabe
    ├──P050_KifuWarabe
    ├──P100_ShogiServer
    ├──P200_KifuNarabe
    ├──P400_KifuNarabeVs
    ├──P800_AIMS
    └──など

P*** という数字が小さい方には、P*** の数字が大きいものは入っていない、
という決め事なんだぜ☆

──────────────────────────────

P800_AIMS フォルダーの下は、サンプル・プログラムが いくつか入っている☆

  P800_AIMS 
    ├──CSProxyLua
    ├──RetroShogi
    ├──StdProxyAIMS
    ├──StdProxyAIMS_Kaizo
    └──など

ここで今、RetroShogi で実験をしている☆

──────────────────────────────

RetroShogi が、いわゆる AIMS用のフォルダーなんだぜ☆

  RetroShogi
    ├──AIMS.exe
    ├──AIMS.lua
    ├──boot.lua
    └──など

──────────────────────────────

だが、指摘によって こんな置き方 変だ、
ということが 分かったので

配置を やり直すんだぜ☆wwwwww



22:27
  教えてもらったまんまなんだが、
  次のように 出力先フォルダーを作っておきたい☆ww

  わたしの2015年作品群フォルダー
      C:/Projects_AIMS/2015

  の中に、

  KifuWarabe
    ├─ ComputerPlayer/
    │  └─「KifuWarabe.exe」等、Windowsコンソールアプリケーション
    ├─ GameServer/
    │  └─「ShogiServer.exe」等、Windowsコンソールアプリケーション
    ├─ Terminal/
    │  └─「Settei.exe」等、Windowsフォームアプリケーション
    ├─ Data/
    │  └─各種データ.csv 等
    ├─ img/
    │  └─各種画像.png 等
    ├─ Logs/
    │  └─各種ログ.txt 等
    │
    ├AIMS.exe
    ├AIMS.lua
    ├boot.lua
    ├common.lua
    ├各種License.txt
    ├StdProxyAIMS.dll
    └など

拍手[0回]

【将棋】めざせ世界コンピュータ将棋選手権☆(66) 将棋ゲームサーバーをプログラムするんだぜ☆wwえっ☆ww2時間とか3時間で☆ww?

2015-03-18 20:41



今 何やっているかというと、ローカルPCで動く サーバーを作ろうとしている☆ww

えっ、2時間とか 3時間で☆wwww?
リーマンに時間はないんだぜ☆ww

いわゆる通信はしない☆ww
標準入出力を使って 同じPCの中で アプリとアプリを 連携するだけなんだぜ☆ww



設計図を描くいいツールを持っていないので、ドット絵で設計図を描くぜ……☆(^q^)


まず最初に、ゲームCDを買ってきて パソコンを入れると、
AIMS.exe というファイルが入っている☆

これをダブルクリックすると ゲームのタイトル画面が出てくる☆
そして その流れで、将棋サーバーは 起動される☆





AIMSと、将棋サーバーは、標準入出力で 通信する☆
そして。


将棋サーバーは 将棋エンジン を起動する☆ww
『きふわらべ』でも、『GPS』でも、『Apery』でもなんでもいいんだぜ☆

『USI』という種類を使っている 将棋エンジン なら 起動の仕方は同じなんだぜ☆ww
そして。


ゲーム画面とは別に、PC用のウィンドウ画面も出す☆ww
棋譜を貼り付けたり、PC操作の方が楽なこともあるだろう☆www
ゲームを一時停止して、そういうことができるようにする☆ww


そして。


これが 読み、書き 通信が起こっている関係なんだぜ☆

「書」は、 送信ボタンを1発押すだけなんだが、
「読」は、 いつメッセージが届くのか 毎秒動きっぱなしで 監視している☆

レトロゲーム画面や PC画面、 将棋エンジンは、
将棋サーバーからのメッセージを待ち受けているだけなんだが、


将棋サーバーだけ、3つも 待ち受けているわけだぜ☆
同時に3か所からメッセージが飛んできたとき、どうさばくか テクニックがいるんだぜ☆w



テクニックとは☆


「今 対応中なので」と、忙しいときは 「後にして」 という仕掛けを用意するんだぜ☆



    将棋エンジン「△3四歩だぜ」

    将棋サーバー「わかったんだぜ☆
           折り返し連絡するんで、じっとしていてくれ」

    将棋エンジン「そーなのか☆ww」

      ……10秒後……

    将棋サーバー「はい、▲6六歩なんだぜ☆」


という感じなんだぜ☆

相手を待ちぼうけにさせておく のがテクニックなんだぜ☆




将棋サーバーは、

    ・「レトロゲーム画面 からのメッセージ
       を待っている / が1件ある」

    ・「将棋エンジン   からのメッセージ
       を待っている / が1件ある」

    ・「PC画面     からのメッセージ
       を待っている / が1件ある」

という感じに作ることにするぜ☆

2件、3件 立て続けに送っても無視することにする☆ww

レトロゲーム画面、将棋エンジン、PC画面 たちは、
将棋サーバーから連絡があるまで、立て続けに2件目のメッセージを
送ってはいけないという 決まりにしておくぜ☆ww



23:45

.@prjlight おっおっ☆ これは始まりそうなんだぜ☆w寄り道が☆ww コンピュータ将棋×レトロゲーという寄り道が☆wwページ最後『StdProxyAIMS_Kaizo.7z』 grayscale.iza-yoi.net/shogi/page16.h… #きふわらべ #コンピュータ将棋 #GE_AIMS




微速微進 寄り道☆w 遅々前進☆wwなんだぜ☆wwwww


拍手[0回]

【将棋】めざせ世界コンピュータ将棋選手権☆(65) きふわらべのGUIをゲームエンジンAIMSで置き換えようとしているんだぜ☆ww

2015-03-17 23:33


次の土曜日は電王戦FINAL 第2戦なんだぜ☆




いっぽう きふわらべ は……☆



Lua言語で こんな感じで ごちょごちょ書いて……☆ww
将棋の画面を レトロゲーム風にしようとしている☆ww





ゲームエンジンAIMSは、サーバーとだけ やりとり してくれれば
いいはずなんだぜ☆ 多分……☆

やってみないとわからないことが多いんだぜ☆

微速微進 寄り道☆w 遅々前進☆www



拍手[0回]

ブログ内検索

PR



絶版・品切れ本を皆さまからの投票で復刊させる読者参加型のリクエストサイト
復刊ドットコム

ネイフィールウォーター

応援フリーエリア

デジゲー博
むずでょは、第1回から毎年 出展しているんだぜ☆

ウサギのように新品入荷☆
カメのようにまだ置いてある既刊☆

同人ソフト一押し店 さんげっと
むずでょは、さんげっと を応援しているんだぜ☆

TVアニメ「Charlotte(シャーロット)」公式サイト
ニコ生の Angel Beats! 一挙放送が 面白かったので次のも応援するぜ☆ww

プロフィール

HN:
むずでょ
性別:
非公開

最新コメント

[01/02 Free Tax Marlboro Gold Regular Cigarettes Coupons 3 Cartons]
[12/30 Hot Selling Newport Regular Cigarettes Outlet 160 Cartons]
[12/29 http://www.patersonlabs.com/Marlboro/41.html]
[12/29 http://xz84.com/Marlboro/16.html]
[12/29 http://www.paragoninks.co.uk/Marlboro/93.html]

P R