Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

リバーシプログラム

2人で交互にプレーするリバーシプログラムを作っています。

一応の形が出来上がり実行してみたのですが、スタートボタンをクリックした後、駒を配置すると以下の例外が表示されます。

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at main.Board.placeAndReverse(Board.java:138)
at main.Board.mouseClicked(Board.java:110)
at java.awt.Component.processMouseEvent(Component.java:6293)
at java.awt.Component.processEvent(Component.java:6055)
at java.awt.Container.processEvent(Container.java:2039)
at java.awt.Window.processEvent(Window.java:1835)
at java.awt.Component.dispatchEventImpl(Component.java:4653)
at java.awt.Container.dispatchEventImpl(Container.java:2097)
at java.awt.Window.dispatchEventImpl(Window.java:2482)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:648)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:607)
at java.awt.EventQueue$1.run(EventQueue.java:605)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:621)
at java.awt.EventQueue$2.run(EventQueue.java:619)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:618)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


その後も少し進めていくと、そのうち駒が置けなくなります。

調べてみると配列の範囲外にアクセスしているのが原因のようだったので、そうならないように試行錯誤してみたのですが、やはりダメでした。
原因と対策を教えていただけるとありがたいです。

文字数制限を越えてしまうので、以下にソースと画像ファイルをアップロードしました。お手数ですがダウンロードをお願いいたします。

http://kie.nu/e-E

2

回答

11893

閲覧

2件の回答

評価

0

なんぼ出す?

評価

0

黒駒の配置可能な一覧を取得するプログラムです。
参考にしてください。




import java.util.*;

public class Reversi {

    private static final char MAT = '□';
    private static final char WHT = '○';
    private static final char BLK = '●';
    
    char[][] ban;
    
    int te;
    
    public Reversi(int n) {
        
        ban = new char[n][n];
        
        te = 0;
        
        for (int y=0;y < n;y++) {
            for (int x=0;x < n;x++) {
                ban[y][x] = MAT;
            }
        }
    }
    
    public String toString() {
        
        StringBuffer sb = new 
StringBuffer();
        sb.append("--[" + te + "]\n");
        for (int y=0;y < ban.length;y++) {
            for (int x=0;x < 
ban[y].length;x++) {
                sb.append(ban[y]
[x]);
            }
            sb.append("\n");
        }
        
        return sb.toString();
    }
    
    public Reversi init() {
        
        int x = ban[0].length/2-1;
        int y = ban.length/2-1;
        ban[y][x] = WHT;
        ban[y+1][x] = BLK;
        ban[y][x+1] = BLK;
        ban[y+1][x+1] = WHT;
        
        return this;
    }

    public static class Replace {
        int x;
        int y;
        int xa;
        int ya;
        int total;
        
        public String toString() {
            final String[] aa = 
{"上","中","下"};
            final String[] bb = 
{"左","中","右"};
            
            StringBuffer sb = new 
StringBuffer();
            
            sb.append("
[").append(x).append(":");
            sb.append(y).append("] 
").append(bb[xa+1]).append(aa[ya+1]);
            sb.append(total).append(" 
個").append("
((").append(xa).append(":").append(ya).append("))"
);
            
            return sb.toString();
        }
        
        private Replace(int x, int y, int 
xa, int ya, int total) {
            this.x = x;
            this.y = y;
            this.xa = xa;
            this.ya = ya;
            this.total = total;
            
        }
    }
    
    /**
     * 8方向のどれか1つを4方の壁どれかに接
触するまで自駒と反対の色の駒の数
     * をカウントする。
     * 中断条件:最初に置く駒位置に別の駒があ
るとき。
     *           横・縦どっちかが壁を突き抜け
るまで。
     *           自駒が現れるまで。
     *           その方向で配置しようとする枡
の直線上にある最初の駒が置いてない枡。
     * 戻り値:カウントが1以上なら、Replace() 
インスタンス。
     *         上記以外、null。
     */
    public static Replace search(char wb, int 
x, int y, int xa, int ya, char[][] ban) {

        int sx = x;
        int sy = y;

        if (x >= 0 && y >= 0 && x < 
ban[0].length && y < ban.length) {
            
            char mk = ban[y][x];
            
            // 別の駒が無いこと
            if (mk != MAT) {
                return null;
            }
            
        }
        
        int reversible = 0;
        do {
        
            x += xa;
            y += ya;
            
            if (x >= 0 && y >= 0 && x 
< ban[0].length && y < ban.length) {
                char mk = ban[y]
[x];
                
                // 次の探索位置に
相手の駒があること
                if (mk != MAT && 
mk != wb) {
                    reversible 
+= 1;
                } else {
                    // 空欄か
自駒で終了
                    break;
                }
            } else {
                // 壁に接触(つま
り裏返しできない)
                break;
            }
        
        } while (true);
        
        // 相手の駒が1個以上 かつ 探索
方向の相手駒の並びの次に自駒がある場合
        if (reversible > 0 && ban[y][x] == 
wb) {
            
System.out.println(sx+","+sy+" :: " + reversible + 
"個");
            return new Replace(sx, sy, 
xa, ya, reversible);
        }
        return null;
    }

    public void searchAll(char wb) {
        
        List<List<Replace>> resList = new 
ArrayList<List<Replace>>();
        
        for (int y=0;y < ban.length;y++) {
            System.out.println("loop=" 
+ y);
            List<Replace> list = new 
ArrayList<Replace>();
            for (int x=0;x < 
ban[0].length;x++) {
                
list.add(search(wb, x , y, -1,  0, ban));
                
list.add(search(wb, x , y,  1,  0, ban));
                
list.add(search(wb, x , y,  0, -1, ban));
                
list.add(search(wb, x , y,  0,  1, ban));

                
list.add(search(wb, x , y, -1, -1, ban));
                
list.add(search(wb, x , y,  1, -1, ban));
                
list.add(search(wb, x , y, -1,  1, ban));
                
list.add(search(wb, x , y,  1,  1, ban));
                
            }
            resList.add(list);
            
            for (Replace rw : list) {
                
System.out.print(rw != null ? "*" : "-");
            }
            System.out.println("");
        }
        
        System.out.println("--- result ---
");
        
        for (List<Replace> rs : resList) {
            
            
System.out.print(rs.size()+"::");
            for (Replace r : rs) {
                if (r == null)
                    
System.out.print("x");
                else
                    
System.out.print("o");
                    
            }
            
            System.out.println("");

            
        }
    }

    public static void main(String[] args) {
        Reversi r = new Reversi(4);
        System.out.println(r.init());
        
        r.searchAll('●');
        
    }



}

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。