paiza.ioでelixir その159

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
オセロを完成させよ。

# 方針

もう一度、ルールを見直す。
「盤に石が置けるなら、自分の石で、相手の石を挟んで獲る。」
agentを使う。
再帰は、使わない。
黒から、始める。
AIは、シーケンシャル、筋に従って最初に見つけた手を、打つ。
8手までは、破綻しない事を、確認。

# サンプルコード

```

defmodule Vb do
	use Agent
	def start_link() do
		Agent.start_link(fn -> 
            0
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def cls() do
		Agent.update(__MODULE__, fn v ->
	        0
		end)
	end
	def set() do
		Agent.update(__MODULE__, fn v ->
	        1
		end)
	end
end
defmodule Ban do
	use Agent
	def start_link() do
		Agent.start_link(fn -> 
			[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def get(p) do
		Agent.get(__MODULE__, fn v ->
			Enum.at(v, p)
		end)
	end
	def set(p, x) do
		Agent.update(__MODULE__, fn v ->
			List.update_at(v, p, fn _ -> 
	            x
            end)
		end)
	end
end
defmodule Isi do
	use Agent
	def start_link() do
		Agent.start_link(fn -> 
			[]
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def len() do
		Agent.get(__MODULE__, fn v ->
			Enum.reduce(v, 0, fn x, n ->
                n + 1
            end)
		end)
	end
	def cls() do
		Agent.update(__MODULE__, fn v ->
			[]
		end)
	end
	def put(x) do
		Agent.update(__MODULE__, fn v ->
			v ++ [x]
		end)
	end
end
defmodule Main do
	def ban() do
	    IO.puts "   1 2 3 4 5 6 7 8"
		Ban.get
		|> Enum.reduce(1, fn x, n ->
	    	if rem(n, 8) == 1 do
		        IO.write " #{floor(n / 8) + 1}"
		    end
		    case x do
		    0 ->
			    IO.write " o"
			2 ->
			    IO.write " x"
			_ ->
		        IO.write "  "
			end
		    if rem(n, 8) == 0 do
		        IO.puts ""
		    end
		    n + 1
		end)
	end
	def check(p, d) do
		x = rem(p, 8)
		y = floor(p / 8) + 1
	    cond do
		(x == 0 && (d == -9 || d == -1 || d ==  7)) ->
			false
		(x == 7 && (d == -7 || d ==  1 || d ==  9)) ->
			false
		(y == 0 && (d == -9 || d == -8 || d == -7)) ->
			false
		(y == 7 && (d ==  7 || d ==  8 || d ==  9)) ->
			false
		true -> 
            true
		end
	end
    def kuro(p, x) do
        Isi.cls()
        Isi.put(p)
	    p = p + x
	    if check(p, x) && Ban.get(p) == 0 do
	        Isi.put(p)
            p = p + x
            cond do
	        check(p, x) && Ban.get(p) == 0 ->
                Isi.put(p)
                p = p + x
                cond do
	            check(p, x) && Ban.get(p) == 0 ->
	                Isi.put(p)
                    p = p + x
                    cond do
	                check(p, x) && Ban.get(p) == 0 ->
	                    Isi.put(p)
                        p = p + x
                        cond do
	                    check(p, x) && Ban.get(p) == 0 ->
	                        Isi.put(p)
                            p = p + x
                            cond do
	                        check(p, x) && Ban.get(p) == 0 ->
	                            true
	                        check(p, x) && Ban.get(p) == 2 ->
                                IO.puts "ok5"
                                Vb.set()
                                Enum.map(Isi.get(), fn y ->
                                    Ban.set(y, 2)
                                end)
        		            true -> 
                                true
    		                end
    		            check(p, x) && Ban.get(p) == 2 ->
                            IO.puts "ok4"
                            Vb.set()
                            Enum.map(Isi.get(), fn y ->
                                Ban.set(y, 2)
                            end)
        		        true -> 
                            true
    		            end
	                check(p, x) && Ban.get(p) == 2 ->
                        IO.puts "ok3"
                        Vb.set()
                        Enum.map(Isi.get(), fn y ->
                            Ban.set(y, 2)
                        end)
        		    true -> 
                        true
    		        end
    		    true
	            check(p, x) && Ban.get(p) == 2 ->
	                IO.puts "ok2"
	                Vb.set()
                    Enum.map(Isi.get(), fn y ->
                        Ban.set(y, 2)
                    end)
        		true -> 
                    true
    		    end
	        check(p, x) && Ban.get(p) == 2 ->
	            IO.puts "ok1"
	            Vb.set()
                Enum.map(Isi.get(), fn y ->
                    Ban.set(y, 2)
                end)
    		true -> 
                true
		    end
        end
    end
	def oku(x, y) do
        p = y * 8 + x - 9
        [-9, 9, -7, 7, -1, 1, -8, 8]
        |> Enum.map(fn x ->
            k = kuro(p, x)
        end)
    end
    def siro(p, x) do
        Isi.cls()
        Isi.put(p)
	    p = p + x
	    if check(p, x) && Ban.get(p) == 2 do
	        Isi.put(p)
            p = p + x
            cond do
	        check(p, x) && Ban.get(p) == 2 ->
                Isi.put(p)
                p = p + x
                cond do
	            check(p, x) && Ban.get(p) == 2 ->
	                Isi.put(p)
                    p = p + x
                    cond do
	                check(p, x) && Ban.get(p) == 2 ->
	                    Isi.put(p)
                        p = p + x
                        cond do
	                    check(p, x) && Ban.get(p) == 2 ->
	                        Isi.put(p)
                            p = p + x
                            cond do
	                        check(p, x) && Ban.get(p) == 2 ->
	                            true
	                        check(p, x) && Ban.get(p) == 0 ->
                                IO.puts "ok5"
                                Vb.set()
                                Enum.map(Isi.get(), fn y ->
                                    Ban.set(y, 0)
                                end)
        		            true -> 
                                true
    		                end
    		            check(p, x) && Ban.get(p) == 0 ->
                            IO.puts "ok4"
                            Vb.set()
                            Enum.map(Isi.get(), fn y ->
                                Ban.set(y, 0)
                            end)
        		        true -> 
                            true
    		            end
	                check(p, x) && Ban.get(p) == 0 ->
                        IO.puts "ok3"
                        Vb.set()
                        Enum.map(Isi.get(), fn y ->
                            Ban.set(y, 0)
                        end)
        		    true -> 
                        true
    		        end
    		    true
	            check(p, x) && Ban.get(p) == 0 ->
	                IO.puts "ok2"
	                Vb.set()
                    Enum.map(Isi.get(), fn y ->
                        Ban.set(y, 0)
                    end)
        		true -> 
                    true
    		    end
	        check(p, x) && Ban.get(p) == 0 ->
	            IO.puts "ok1"
	            Vb.set()
                Enum.map(Isi.get(), fn y ->
                    Ban.set(y, 0)
                end)
    		true -> 
                true
		    end
        end
    end
	def sasu() do
	    Vb.cls()
        [0, 7, 56, 63, 18, 21, 42, 45, 2, 16, 5, 23, 40, 58, 47, 61, 3, 4, 11, 12, 19, 20, 24, 25, 26, 32, 33, 34, 29, 30, 31, 37, 38, 39, 43, 44, 51, 52, 59, 60, 1, 8, 9, 10, 17, 6, 13, 14, 15, 22, 41, 48, 49, 50, 57, 46, 53, 54, 55, 62]
        |> Enum.map(fn p -> 
            if Ban.get(p) == 1 do
                if Vb.get == 0 do
                    [-9, 9, -7, 7, -1, 1, -8, 8]
                    |> Enum.map(fn x ->
                        k = siro(p, x)
                    end)
                end
            end
        end)
    end
end
Isi.start_link
Ban.start_link
Vb.start_link
Main.ban
Main.oku(4, 3)
IO.puts "kuro 4 3"
Main.ban
Main.sasu
Main.ban
Main.oku(3, 4)
IO.puts "kuro 3 4"
Main.ban
Main.sasu
Main.ban
Main.oku(3, 2)
IO.puts "kuro 3 2"
Main.ban
Main.sasu
Main.ban
Main.oku(6, 3)
IO.puts "kuro 6 3"
Main.ban
Main.sasu
Main.ban
Main.oku(5, 2)
IO.puts "kuro 5 2"
Main.ban
Main.sasu
Main.ban
Main.oku(3, 1)
IO.puts "kuro 3 1"
Main.ban
Main.sasu
Main.ban
Main.oku(6, 4)
IO.puts "kuro 6 4"
Main.ban
Main.sasu
Main.ban
Main.oku(5, 1)
IO.puts "kuro 5 1"
Main.ban
Main.sasu
Main.ban


```

# 実行結果

```
   1 2 3 4 5 6 7 8
 1                
 2                
 3                
 4       o x      
 5       x o      
 6                
 7                
 8                
ok1
kuro 4 3
   1 2 3 4 5 6 7 8
 1                
 2                
 3       x        
 4       x x      
 5       x o      
 6                
 7                
 8                
ok1
   1 2 3 4 5 6 7 8
 1                
 2                
 3     o x        
 4       o x      
 5       x o      
 6                
 7                
 8                
ok1
kuro 3 4
   1 2 3 4 5 6 7 8
 1                
 2                
 3     o x        
 4     x x x      
 5       x o      
 6                
 7                
 8                
ok1
ok1
   1 2 3 4 5 6 7 8
 1                
 2                
 3     o o o      
 4     x x o      
 5       x o      
 6                
 7                
 8                
ok1
kuro 3 2
   1 2 3 4 5 6 7 8
 1                
 2     x          
 3     x o o      
 4     x x o      
 5       x o      
 6                
 7                
 8                
ok1
   1 2 3 4 5 6 7 8
 1                
 2     x          
 3     x o o      
 4     x x o      
 5       o o      
 6     o          
 7                
 8                
ok2
kuro 6 3
   1 2 3 4 5 6 7 8
 1                
 2     x          
 3     x x x x    
 4     x x o      
 5       o o      
 6     o          
 7                
 8                
ok2
   1 2 3 4 5 6 7 8
 1                
 2     x o        
 3     x o x x    
 4     x o o      
 5       o o      
 6     o          
 7                
 8                
ok1
ok1
kuro 5 2
   1 2 3 4 5 6 7 8
 1                
 2     x x x      
 3     x x x x    
 4     x o o      
 5       o o      
 6     o          
 7                
 8                
ok2
   1 2 3 4 5 6 7 8
 1       o        
 2     x o x      
 3     x o x x    
 4     x o o      
 5       o o      
 6     o          
 7                
 8                
ok1
kuro 3 1
   1 2 3 4 5 6 7 8
 1     x o        
 2     x x x      
 3     x o x x    
 4     x o o      
 5       o o      
 6     o          
 7                
 8                
ok1
   1 2 3 4 5 6 7 8
 1     x o   o    
 2     x x o      
 3     x o x x    
 4     x o o      
 5       o o      
 6     o          
 7                
 8                
ok2
kuro 6 4
   1 2 3 4 5 6 7 8
 1     x o   o    
 2     x x o      
 3     x o x x    
 4     x x x x    
 5       o o      
 6     o          
 7                
 8                
ok1
   1 2 3 4 5 6 7 8
 1     x o   o    
 2     x x o      
 3     x o x x    
 4     o x x x    
 5   o   o o      
 6     o          
 7                
 8                
ok1
ok1
kuro 5 1
   1 2 3 4 5 6 7 8
 1     x x x o    
 2     x x x      
 3     x o x x    
 4     o x x x    
 5   o   o o      
 6     o          
 7                
 8                
ok3
   1 2 3 4 5 6 7 8
 1     x x x o    
 2     x x x      
 3     x o x x    
 4     o o o o o  
 5   o   o o      
 6     o          
 7                
 8                
```

# 成果物

https://paiza.io/projects/WD0XOm64PTwx_0k0tyy4NA?language=elixir


以上。