パズル万華鏡

面白いパズルの紹介と解説をします。

チェス盤ゲーム問題(1)プログラム

 チェス盤ゲーム問題(1)のプログラムを紹介します。

Tiny Basicで記述しています。

' << GM511.bas >>
' Tiny Basicで記述。
' 図形配置ゲーム
'
Dim A(20,20): ' m×n方眼紙を表す配列:0は未被覆、
              ' 1はあなたが被覆済、-1はコンピュータが被覆済。
Dim B(20,20): ' 作業用配列。
'
' 内蔵時計を使って乱数の初期値を設定。
Randomize
'
' 方眼紙のサイズを決める。                                    
Do                                                              
  Print"方眼紙のサイズを決めてください"            
  Input"行数mの値(3-20[9]):";M0$                             
  If M0$ = "" Then M0=9 Else M0=Val(M0$)                        
  Input"列数nの値(3-20[9]):";N0$           
  If N0$ = "" Then N0=9 Else N0=Val(N0$)                        
  If (M0 >= 1) and (M0 <= 20) and (N0 >= 1) and (N0 <= 20) Then 
    Exit Do                                                     
  End If                                                        
Loop                                                            
Print                                                           
'                                                               
' 初期設定(方眼紙全体を未被覆とする)。 
For M=1 To M0                                                   
  For N=1 To N0: A(M,N)=0: Next N                               
Next M                                                          
'                                                               
' ゲームの記述。
Do                                                              
  Print"あなたの番"                                             
  ' 配置可能な位置を探索。                                      
  IND=0: ' 配置可能位置がない場合IND=0、ある場合、その個数。         '
  ' 方眼紙の周辺情報を作業配列に格納する。
  For N=1 To N0 
    B(1,N)=A(1,N): B(M0,N)=A(M0,N)
  Next N
  For M=2 To M0-1
    B(M,1)=A(M,1): B(M,N0)=A(M,N0)
  Next M 
  '
  ' 十字形が位置(M,N)に配置できるかどうか調べる。
  For M=2 To M0-1                                               
    For N=2 To N0-1                                             
      B(M,N)=A(M,N)                                             
      ' 位置(M,N)を中心に、上下左右の空き具合を調べる。
      If A(M,N) <> 0 Then Goto *Lab1                            
      If A(M-1,N) <> 0 Then Goto *Lab1                          
      If A(M,N+1) <> 0 Then Goto *Lab1                          
      If A(M+1,N) <> 0 Then Goto *Lab1                          
      If A(M,N-1) <> 0 Then Goto *Lab1                          
      ' 位置(M,N)に配置できるとき、B(M,N)=2とする。
      B(M,N)=2                                                  
      IND=IND+1                                                 
    *Lab1
    Next N                                                      
  Next M                                                        
  '                                                             
  ' 勝負の判定。
  If IND = 0 Then                                               
    ' あなたの番で、配置可能な位置がない場合、コンピュータの勝ち。
    Print"コンピュータの勝ち"                                   
    Exit Do                                                     
  Else                                                          
  ' ゲーム続行。
  ' 現在の配置と配置可能の位置を表示。  
    Print Space$(3);
    For N=1 To N0: Print Using"##";N;: Next N
    Print
    For M=1 To M0           
      Print Using"###";M;                              
      For N=1 To N0                                             
        If B(M,N)=0 Then C$="□"                                
        If B(M,N)=1 Then C$="■"                                
        If B(M,N)=-1 Then C$="★"                               
        If B(M,N)=2 Then C$="×"                                
        Print C$;                                               
      Next N                                                    
      Print                                                     
    Next M                                                      
    Print                                                       
    '                                                           
    ' 配置位置を指定。
    *Lab2                                                        
    Input"行の位置:";M1                                        
    Input"列の位置:";N1                                        
    If B(M1,N1) <> 2 Then Goto *Lab2                             
    '                                                           
    ' 方眼紙の状況を更新。
    A(M1,N1)=1                                                  
    A(M1-1,N1)=1                                      
    A(M1,N1+1)=1                                      
    A(M1+1,N1)=1                                      
    A(M1,N1-1)=1                                      
    '                                                           
    ' 方眼紙の表示。                                            
    Print Space$(3);
    For N=1 To N0: Print Using"##";N;: Next N
    Print
    For M=1 To M0           
      Print Using"## ";M;                              
      For N=1 To N0                                             
        If A(M,N)=0 Then C$="□"                                
        If A(M,N)=1 Then C$="■"                                
        If A(M,N)=-1 Then C$="★"                               
        Print C$;                                               
      Next N                                                    
      Print                                                     
    Next M                                                      
    Print                                                       
  End If                                                        
  '                                                             
  Print"コンピュータの番";                                       
  ' 配置可能な位置を探索。                                      
  IND=0: ' 配置可能位置がない場合IND=0、ある場合、その個数。         '
  ' 十字形が位置(M,N)に配置できるかどうか調べる。
  For M=2 To M0-1                                               
    For N=2 To N0-1                                             
      B(M,N)=A(M,N)                                             
      ' 位置(M,N)を中心に、上下左右の空き具合を調べる。
      If A(M,N) <> 0 Then Goto *Lab3                            
      If A(M-1,N) <> 0 Then Goto *Lab3                          
      If A(M,N+1) <> 0 Then Goto *Lab3                          
      If A(M+1,N) <> 0 Then Goto *Lab3                          
      If A(M,N-1) <> 0 Then Goto *Lab3                          
      ' 位置(M,N)に配置できるとき、B(M,N)=2とする。
      B(M,N)=2                                                  
      IND=IND+1                                                 
    *Lab3
    Next N                                                      
  Next M                                                        
  '                                                             
  ' 勝負の判定。
  If IND = 0 Then
    ' コンピュータの番で、配置可能な位置がない場合、あなたの勝ち。
    Print
    Print"あなたの勝ち"                                         
    Exit Do                                                     
  Else                                                          
    ' ゲーム続行。
    ' 配置可能な位置の個数以下の値をランダムに決め、変数Iに格納。
    ' 変数Jの値が変数Iの値と一致したとき、位置(M,N)に十字形を置く。
    I=Int(IND*Rnd)+1                                            
    J=0
    For M=1 To M0                                               
      For N=1 To N0                                             
        If B(M,N)=2 Then                                        
          J=J+1                                                 
          If J = I Then
            ' 方眼紙の状況を更新。                   
            A(M,N)=-1                                            
            A(M-1,N)=-1
            A(M,N+1)=-1                                          
            A(M+1,N)=-1                                          
            A(M,N-1)=-1                                          
            Goto *Lab4
          End If                                                
        End If                                                  
      Next N                                                    
    Next M
    *Lab4
    Print"(";M;",";N;")に配置"
    '
    ' 方眼紙の表示。                                            
    Print Space$(3);
    For N=1 To N0: Print Using"##";N;: Next N
    Print
    For M=1 To M0           
      Print Using"## ";M;                              
      For N=1 To N0                                             
        If A(M,N)=0 Then C$="□"                                
        If A(M,N)=1 Then C$="■"                                
        If A(M,N)=-1 Then C$="★"                               
        Print C$;                                               
      Next N                                                    
      Print                                                     
    Next M                                                      
    Print                                                       
  End If                                                        
Loop                                                            
End

f:id:isemba:20150615193944j:plain
f:id:isemba:20150615194000j:plain