Entries

最近、オセロのプログラムをなんとなく書いている

 ……いや、他にも書きたいプログラムはあるんだけどね?
 ネット上にあったICPCの夏合宿問題の中にオセロっぽいネタがあったので、感化されて書いてみることにしたのだ。
 久々に組んでみたら、簡単な物なら一時間ほどで書けてしまった。流石にこれは、自分自身も拍子抜け。なんとなくその時のソースを公開してみる。
    #runtime "hsp3cl"
randomize

dim board,10,10
dim temp,10,10
dim canmove,64,3
dim pass,2
board(4,4)=2 :board(5,5)=2
board(4,5)=1 :board(5,4)=1
ban="ロox"
you=rnd(2)+1 :com=3-you
stone=4 :turn=1

mes "オセロゲーム"
*main
gosub *draw
gosub *list
if cmnum=0 :pass(turn-1)=1 :else :pass(turn-1)=0
if turn=you {
mes "アナタノターン("+(stone-3)+"):"
if cmnum!0 {
flg=0
while flg=0
input hand,3,1
mx=int(strmid(hand,0,1))
my=int(strmid(hand,2,1))
for k,0,cmnum
if (mx=canmove(k,0))&(my=canmove(k,1)) {
flg=1
_break
}
next
wend
}
else {
mes "テガナイノデパス"
}
}
else {
mes "COMノターン("+(stone-3)+"):"
if cmnum!0 {
comx=0 :comy=0 :comnum=0
for k,0,cmnum
if comnum<canmove(k,2) {
comx=canmove(k,0)
comy=canmove(k,1)
comnum=canmove(k,2)
}
next
mx=comx :my=comy
mes ""+mx+","+my
}
else {
mes "テガナイノデパス"
}
}
if cmnum!0 {
board(mx,my)=turn
gosub *move
stone+
}
turn=3-turn
if (stone=64)|(pass(0)*pass(1)=1) :goto *exit
goto *main
*exit
youstone=0 :comstone=0
for y,1,9
for x,1,9
if board(x,y)=you :youstone+
if board(x,y)=com :comstone+
next
next
mes "アナタ:"+youstone+" COM:"+comstone
judge=youstone-comstone
if judge>0 :mes "アナタノカチデス"
if judge=0 :mes "ヒキワケデス"
if judge<0 :mes "COMノカチデス"
stop

*draw
mes " 12345678"
for y,1,9
text=str(y)
for x,1,9
text+=strmid(ban,board(x,y),1)
next
mes text
next
return

*list
cmnum=0
for my,1,9
for mx,1,9
if board(mx,my)=0 {
gosub *check
if num!0 {
canmove(cmnum,0)=mx
canmove(cmnum,1)=my
canmove(cmnum,2)=num
cmnum+
}
}
next
next
return

*check
for y,1,9
for x,1,9
temp(x,y)=board(x,y)
next
next
gosub *move
for y,1,9
for x,1,9
board(x,y)=temp(x,y)
next
next
return

*move
num=0 :nrut=3-turn
for i,-1,2
for j,-1,2
if i*i+j*j=0 :_continue
px=mx+i :py=my+j :c=0
while board(px,py)=nrut
px+=i :py+=j
c+
wend
if board(px,py)=turn {
num+=c :px-=i :py-=j
for k,0,c
board(px,py)=turn
px-=i :py-=j
next
}
next
next
return


 コメント無しなのは適当に推測してほしいから。番兵を利用して判定ルーチンを短くした。COMの思考ルーチンは「一番沢山石を返せる所に打つ」といった素人同然のものだけど、ま、いいか。
 今は判定とかをモジュール化して、思考ルーチンに工夫を凝らす(頓死を防ぐ(次に相手に全滅されそうな手を打たないようにする)コードを取り入れるとか)のでちょっとマシになった感。でもまだまだ弱い。WZebraとかMasterReversiとかedaxとかがあるから思考ルーチンのテストには事欠かないが、それ以前にそれらがあるせいでイチイチ作る意味が薄いという現実。変則オセロのアプリでも作るか。文化祭用に。

 以下、昔の話。当時中学生だった私は、入学して真っ先にパソコン部へ見学に向かった。もちろん入部する気満々だったのだが、そこで私の興味を引いたのは、ある一冊のプログラミング本であった↓。
12歳からはじめるHSPわくわくゲームプログラミング教室 Windows 95/98/2000/Me/XP対応12歳からはじめるHSPわくわくゲームプログラミング教室 Windows 95/98/2000/Me/XP対応
(2004/05)
大槻 有一郎

商品詳細を見る


 入部後はずっと、プログラムのコードと格闘していた。経験ある方ならおわかりいただけるだろうが、「プログラミング」の概念を身につけるのにはそこそこ時間がかかる。一度飲み込めてしまえば、他のどんな言語でもレファレンス片手なら大丈夫、てなぐらいになる(多分)が、そこまでいくのに苦労するのだ。そんな中で、最初に書いたゲームのプログラムオセロなのである。

 当時のソースを読み返してみると酷いのなんの。パスが「pasu」と書かれていたり、コメントにサブルーティンと書かれていたり。一番酷いのは石を返す判定で、なんと一方向一方向について書かれているといった代物(ありがちだけど)。まあバッチリ完動するのだが、これがプログラマの黒歴史って奴か。オセロだけに
関連記事
スポンサーサイト
この記事にトラックバックする(FC2ブログユーザー)
http://ysrken.blog.fc2.com/tb.php/16-43ec738f

トラックバック

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

Appendix

プロフィール

YSR

Author:YSR
「YSR」「YSRKEN」「◆YSRKENkO6Y(~2013/08/25)」「◆YSRKEN.ceVZZ(2013/08/26~)」として活動しています。
プログラミングと艦これが趣味です。
プロフ画像はCrystalDiskInfoの水晶雫ちゃんです。
主な創作物についてはhttp://ysrken.blog.fc2.com/blog-entry-76.htmlをご覧ください。

カレンダー(月別)

10 ≪│2017/11│≫ 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -

全記事表示リンク

全ての記事を表示する

QRコード

QR

総アクセス数

アクセス数

現在の閲覧者数: