• 當前位置:首頁 > IT技術 > 移動平臺 > 正文

    java實現中國象棋2:移動棋子
    2021-12-01 23:05:54



    java實現中國象棋2:移動棋子


    我在“java實現中國象棋1”的博客中說了一下如何把棋子畫在棋盤上,使用一個 f l a g flag flag二維數組即可實現。因此如果我們想讓棋子移動,只需要改變改變 f l a g flag flag二維數組中的值即可。我先通過 m o u s e c l i c k ( ) mouseclick() mouseclick()函數獲取當前點擊的位置,再通過一個 g e t c r ( ) getcr() getcr()函數獲得當前點擊位置的行數和列數,代碼如下:

    // Listener.java
    int x1,x2,y1,y2;
    int c = -1;// 如果為0,則會在一開始選中flag[0][0]處的車,故設置為-1
    int r = -1;

    public void mouseClicked(MouseEvent e) {
    System.out.println("點擊");
    x1 = e.getX();
    y1 = e.getY();
    if (x1 > init.x0 - init.size / 2 && y1 > init.y0 - init.size / 2
    && x1 < init.x0 + init.size / 2 + init.column * init.size
    && y1 < init.y0 + init.row * init.size + init.size / 2) {
    x2 = ((x1 - init.x0 + init.size / 2) / init.size) * init.size + init.x0;
    y2 = ((y1 - init.y0 + init.size / 2) / init.size) * init.size + init.y0;
    getcr();// 獲得此時點擊處的位置
    }

    // 得到現在點擊的位置
    public void getcr() {
    x2 = ((x1 - init.x0 + init.size / 2) / init.size) * init.size + init.x0;
    y2 = ((y1 - init.y0 + init.size / 2) / init.size) * init.size + init.y0;
    // 當前點擊的位置
    c = (x2 - init.x0) / init.size;
    r = (y2 - init.y0) / init.size;
    }

    獲得了當前點擊的位置,就可以選中這個位置的棋子,然后獲得下次點擊的位置,把上次點擊的棋子放置到這次點擊的位置上,即可實現棋子的移動。所以我創建兩個變量 c u r c h e s s 和 b e f o r e c h e s s curchess和beforechess curchess和beforechess,都為一行三列的一維數組,第一位第二位第三位分別為 r , c , f l a g [ r ] [ c ] r,c,flag[r][ c ] r,c,flag[r][c],這樣就可以保存前一顆棋子和現在點擊的棋子或者空位。(我把空位也看做一個棋子,后面會添加紅棋走還是黑棋走,所以不擔心會出現空位把棋子吃了的現象)

    //Listener.java


    int[] curchess = new int[3];
    int[] beforechess = new int[3];

    // 更新現在點中的棋子
    public void recurchess() {
    if (r != -1) {
    curchess[0] = r;
    curchess[1] = c;
    curchess[2] = flag[r][c];
    }
    }

    // 更新上一次點中的棋子
    public void rebec() {
    //System.arraycopy(src, srcPos, dest, destPos, length);復制數組
    //%Arrays.copyOf(original, newLength);復制數組
    beforechess[0] = curchess[0];
    beforechess[1] = curchess[1];
    beforechess[2] = curchess[2];
    }

    public void mouseClicked(MouseEvent e) {
    System.out.println("點擊");
    x1 = e.getX();
    y1 = e.getY();
    if (x1 > init.x0 - init.size / 2 && y1 > init.y0 - init.size / 2
    && x1 < init.x0 + init.size / 2 + init.column * init.size
    && y1 < init.y0 + init.row * init.size + init.size / 2) {
    x2 = ((x1 - init.x0 + init.size / 2) / init.size) * init.size + init.x0;
    y2 = ((y1 - init.y0 + init.size / 2) / init.size) * init.size + init.y0;
    getcr();// 獲得此時點擊處的位置
    rebec();// 更新前一顆棋子
    ui.repaint();
    recurchess();
    }

    我想實現當我點擊棋子的時候,棋子能變大一些,以便于我知道我選中了哪個棋子的功能。所以我在DrawUI類中的Paint方法中添加以下代碼。

    // 重繪
    public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(new ImageIcon(getClass().getResource("image\"+"棋盤.jpg")).getImage(), 90, 60, 625, 700, this);
    // 根據flag畫棋子
    for (int i = 0; i < init.row; i++) {
    for (int j = 0; j < init.column; j++) {
    if (ls.flag[i][j] > 0) {
    g.drawImage(new ImageIcon(getClass().getResource("image\"+(Integer.toString(ls.flag[i][j])) + ".png")).getImage(), init.y0 + j * init.size - init.chesssize / 2,init.x00 + i * init.size - init.chesssize / 2,init.chesssize, init.chesssize, this);
    }
    }
    }

    // 將選中的棋子放大
    if(ls.r != -1) {
    if(ls.flag[ls.r][ls.c] > 0) {
    if(ls.chessflag == 1&ls.flag[ls.r][ls.c] > 10 | ls.chessflag == 2&ls.flag[ls.r][ls.c] < 10) {
    int newexsize = 8;
    g.drawImage(new ImageIcon(getClass().getResource("image\"+(Integer.toString(ls.flag[ls.r][ls.c])) + ".png")).getImage(), init.y0 + ls.c * init.size - (init.chesssize+newexsize) / 2,init.x00 + ls.r * init.size - (init.chesssize+newexsize) / 2,init.chesssize+newexsize, init.chesssize+newexsize, this);
    }
    }
    }
    }

    現在該實現棋子的移動功能了,現在要設置 c h e s s f l a g chessflag chessflag,如果為1,那就是紅方走;如果為2,那就是黑方走。在中國象棋中紅方先走,因此我初始化 c h e s s f l a g chessflag chessflag為1。棋子移動分三種情況:1、紅方或者黑方走空位;2、紅方吃黑方;3、黑方吃紅方。

    // Listener.java


    int chessflag = 1;

    // 更新黑方紅方
    public void rechessflag() {
    if (chessflag == 1) {
    chessflag = 2;
    } else if (chessflag == 2) {
    chessflag = 1;
    }
    }

    public void walk(){
    flag[r][c] = beforechess[2];
    flag[beforechess[0]][beforechess[1]] = 0;
    curchess = new int[3]; // 走完一步后curchess變為0
    beforechess = new int[3];
    c = -1;
    r = -1;
    rechessflag();
    ui.repaint();
    }
    public void mouseClicked(MouseEvent e) {
    System.out.println("點擊");
    x1 = e.getX();
    y1 = e.getY();
    if (x1 > init.x0 - init.size / 2 && y1 > init.y0 - init.size / 2
    && x1 < init.x0 + init.size / 2 + init.column * init.size
    && y1 < init.y0 + init.row * init.size + init.size / 2) {
    x2 = ((x1 - init.x0 + init.size / 2) / init.size) * init.size + init.x0;
    y2 = ((y1 - init.y0 + init.size / 2) / init.size) * init.size + init.y0;
    // 當前點擊的位置
    getcr();// 獲得此時點擊處的位置
    rebec();// 更新前一顆棋子
    ui.repaint();
    recurchess();
    if (r != -1) {
    if (curchess[2] == 0 & chessflag == 1 & beforechess[2] > 10
    | curchess[2] == 0 & chessflag == 2 & beforechess[2] < 10) {// 如果此時點的地方沒有棋子,直接替換
    System.out.println("走空位");
    walk();
    } else if (beforechess[2] > 10 & curchess[2] < 10 & chessflag == 1 & flag[r][c] < 10){
    if (curchess[2] != 0) {// 如果手中有棋子
    System.out.println("紅棋吃黑棋");
    walk();
    }
    } else if (beforechess[2] < 10 & curchess[2] > 10 & beforechess[2] > 0 & chessflag == 2 & flag[r][c] > 10) {
    if (curchess[2] != 0) {// 如果手中有棋子
    System.out.println("黑棋吃紅棋");
    walk();
    }
    }
    }
    }
    }

    此時便可實現棋子走動的功能了。

    關注微信公眾號:圖靈完備,回復中國象棋即可獲得圖片及代碼資源。


    本文摘自 :https://blog.51cto.com/u

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码