もう少し迷宮をさまよってみることにします。こんな設計で開始
駒の反転まで下記のプログラムで実施、ブログの都合でソースの
タブが変更されてますが、ck.exsで保存して実行できました。
再帰で作成すると開かれたループを閉じるループに変更する
なんというか逆算のようなプログラムの作り方みたいな感じで
今ひとつ探検感がない。
簡単に説明すると、sが文字列pが位置cがキャラクタ、ptがパ
ターン用の文字列 dが検索方向bdがオセロ盤中央の位置に
oかxを置いた時の反転状況を表示しています。
テストはザルなのでバグの想定数は2
文字列の追加は<> これさえ覚えておけば大丈夫です。
defmodule Ot do
def put(s,p,c) do
(String.slice s,0,p) <> c <> (String.slice s,p+1,(String.length(s)))
end
def get(s,p) do
String.slice s,p,1
end
def board_write(s,[n|tl]) do
IO.puts String.slice s,n*10+11,8
board_write(s,tl)
end
def board_write(_,[]) do
IO.puts " "
end
# game 先手後手 終わっていなければ再帰
def think(s,c) do # 指し手全部さして スコア化してタプルに
#noop
s<>c
end
def turn_check(s,p,pt) do # 裏返せる 向きを返す
for d <- [-11,-10,-9,-1,1,9,10,11], line_check(s,p,pt,d), do: d
end
def line_check(s,p,pt,d) do # 裏返せる 向きを返す pt 相手の駒+自分の駒
line=line_get(s,p,d,"")
line=replace_n(line,"oo","o")
line=replace_n(line,"xx","x")
if (String.slice line,0,2)==pt, do: true, else: false
#l=l <> if l == "x", do: "X", else: ""
end
def replace_n(s,b,a) do
ns=String.replace(s,b,a)
if ns==s, do: s, else: replace_n(ns,b,a)
end
def line_get(s,p,d,l) do
c=get(s,p+d)
if c=="#", do: l, else: line_get(s,p+d,d,l<>c)
end
def turn(s,p,c,oc) do # 裏返せる 向きから裏返す
ds=turn_check(s,p,oc<>c)
s=turn_lines(s,p,c,ds)
put(s,p,c)
end
def turn_lines(s,p,c,[d|dl]) do
turn_lines(turn_line(s,p,d,c),p,c,dl)
end
def turn_lines(s,_,_,[]) do
s
end
def turn_line(s,p,d,c) do
bc=get(s,p+d)
if bc==c, do: s, else: turn_line(put(s,p+d,c),p+d,d,c)
end
def score(s,c) do # 指し手の位置、コマ数、確定位置計算
String.length(String.replace(s,c,"aa"))-String.length(s)
end
# パターンマッチに特徴がある言語らしい 使ってみたい
end
bd="##########"<>
"#.o.o.x..#"<>
"#..xxo...#"<>
"#.ox.ooox#"<>
"#..oxx...#"<>
"#.o.x.x..#"<>
"#...x..o.#"<>
"#...x....#"<>
"#...o....#"<>
"##########"
#sb="###########91444419##11333311##43555534##43555534##43555534##43555534##11333311##91444419###########"
Ot.board_write(bd,[0,1,2,3,4,5,6,7])
#tbd="###########........##........##........##.ooox...##...xo...##o.......##........##........###########"
#IO.puts Ot.score(bd,"o")
#IO.puts Ot.score(bd,"x")
#IO.puts Ot.line_get(bd,11,1,"")
#IO.puts Ot.line_get(bd,11,11,"")
#IO.puts Ot.line_get(bd,48,-1,"")
nbd=Ot.turn(bd,34,"o","x")
Ot.board_write(nbd,[0,1,2,3,4,5,6,7])
nbd=Ot.turn(bd,34,"x","o")
Ot.board_write(nbd,[0,1,2,3,4,5,6,7])
# 課題 タプルの入ったリストのソート