日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

回想起從前初學代碼的五子棋簡直寫的不像樣子。今天閑來無事就寫了個五子棋的小程序。

一來呢回憶一下很久以前寫代碼時的感覺。

二來呢順便幫下諸位有需求的學生,順利的Ctrl+C。

五子棋的運行效果如下。

用Java實現一個五子棋小游戲

 

 

開發環境:#

這個小程序是基于JAVA實現的。因此呢需要提前安裝JDK環境。(老油條忽略此條信息)

開發環境jdk1.8 + eclipse

eclipse 目錄結構如下所示,就三個類啊。

用Java實現一個五子棋小游戲

 

棋盤數據結構核心:#

無論你做數據庫開發還是做一些小程序,第一時間考慮的必須是需求+建模。把核心設計出來。

此次我們用一個二維數組作為棋盤,每條線交叉的地方設為二維數組的值,并約定:

0=空

1=白棋

2=黑棋

然后對應的把下棋,悔棋,判斷輸贏(橫豎斜)和清盤的算法都實現出來。

具體展現如下:

悔棋時候我們需要用一個棧來保存我們之前下棋的信息:

 

/**
     * 在該位置下棋  1:white 2:black 
     * @param x 橫坐標
     * @param y 縱坐標
     * @param var 棋子種類
     * @return 1:white 贏   2:black贏
     */
    public int ChessIt(int x,int y,int var) {
        if(__CanInput(x,y)) {
            core[x][y] =var;
            Chess chess = new Chess(x,y);
            stack.push(chess);
            return checkVictory(x, y, var);
        }
        else return -1;
    }

//悔棋
    public boolean RetChess() {
        if(stack.isEmpty()) return false;
        Chess chess = stack.pop();
        core[chess.x][chess.y]= 0;
        return true;
    }

 

總體:Core.java 的代碼如下·:

 

package main;

import java.util.Stack;

/**
 * @author GodofOrange
 *    棋盤數據結構
 */
public class Core {
    //棋盤大小
    private int[][] core;
    private int x;
    private int y;
    //記錄下棋的類
    class Chess{
        int x;
        int y;
        public Chess(int x,int y) {
            this.x=x;
            this.y=y;
        }
    }
    //棧
    Stack<Chess> stack;
    //構造方法
    public Core(int x,int y) {
        stack = new Stack<>();
        core = new int[x][y];
        this.x=x;
        this.y=y;
    }
    //檢查該地是否有空位置
    private boolean __CanInput(int x,int y) {
        if(core[x][y]==0) return true;
        else return false;
    }
    //判斷輸贏
    private int checkVictory(int x,int y,int var) {
        //橫向判斷
        int trans = 0;
        for(int i=x-4;i<x+5;i++) {
            if(i<0||i>=this.x) continue;
            if(core[i][y]==var) {
                trans++;
            }
            else {
                trans=0;
            }
            if(trans==5) return var;
        }
        //縱向判斷
        int longitudinal = 0;
        for(int i=y-4;i<y+5;i++) {
            if(i<0||i>=this.y) continue;
            if(core[x][i]==var) {
                longitudinal++;
            }
            else {
                longitudinal=0;
            }
            if(longitudinal==5) return var;
        }
        //從左上到右下
        int leftUPToDown = 0;
        for(int i=x-4,j=y+4;i<x+5&&j>y-5;i++,j--) {
            if(i<0||i>=this.x||j<0||j>=this.y) continue;
            if(core[i][j]==var) {
                leftUPToDown++;
            }else {
                leftUPToDown=0;
            }
            if(leftUPToDown==5) return var;
        }
        //從左下到右上
        int leftDownToUP = 0;
        for(int i=x+4,j=y+4;i>x-5&&j>y-5;i--,j--) {
            if(i<0||i>=this.x||j<0||j>=this.y) continue;
            if(core[i][j]==var) {
                leftDownToUP++;
            }else {
                leftDownToUP=0;
            }
            if(leftDownToUP==5) return var;
        }
        return 0;
    }
    /**
     * 在該位置下棋  1:white 2:black 
     * @param x 橫坐標
     * @param y 縱坐標
     * @param var 棋子種類
     * @return 1:white 贏   2:black贏
     */
    public int ChessIt(int x,int y,int var) {
        if(__CanInput(x,y)) {
            core[x][y] =var;
            Chess chess = new Chess(x,y);
            stack.push(chess);
            return checkVictory(x, y, var);
        }
        else return -1;
    }
    //悔棋
    public boolean RetChess() {
        if(stack.isEmpty()) return false;
        Chess chess = stack.pop();
        core[chess.x][chess.y]= 0;
        return true;
    }
    //獲得棋盤狀態
    public int[][] getCore(){
        return this.core;
    }
    //重新開始
    public void Restart() {
        for(int i=0;i<this.x;i++) {
            for(int j=0;j<this.y;j++) {
                this.core[i][j]=0;
            }
        }
        this.stack.clear();
    }
}

 

windows的前端代碼#

 #

在上一步我們把一個五子棋的數據結構實現了之后,我們下一步就需要用JavaSwing的知識來畫前端。

首先我們定義一個類來繼承JFrame,從而包含JFrame的所有功能。

以下是JFrame常用的方法。

jFrame.setDefaultCloseoperation(JFrame.EXIT_ON_CLOSE);//關閉JFrame時運行System.exit(0)
jFrame.setLocationRelativeTo(null);//屏幕中央顯示
jFrame.setVisible(true);//可見

 

其次我們需要單擊屏幕進行下棋,所以我們需要符合鼠標單擊事件的接口。因此我們去接上MouseListener的接口。

再然后我們重寫JFrame里的paint方法來畫畫。

具體體現:如下

其中橫線和豎線都是調用的Graphics中的drawLine方法。

畫圈圈用的是drawOval和fillOval分別是畫空心圓和畫實心圓。

 

@Override
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);
        // 橫
        for (int i = 0; i < 19; i++)
            g.drawLine(30, 30 + i * 30, 570, 30 + i * 30);
        // 豎線
        for (int i = 0; i < 19; i++)
            g.drawLine(30 + i * 30, 60, 30 + i * 30, 570);

        int[][] board = core.getCore();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 19; j++) {
                if (board[i][j] == 1)
                    g.drawOval(20 + i * 30, 50 + j * 30, 20, 20);
                if(board[i][j]==2)
                    g.fillOval(20+i*30, 50+j*30, 20, 20);
            }
        }
        g.drawRect(690,60, 50, 30);
        g.drawString("悔棋",700,80);
        g.drawRect(690,120,50, 30);
        g.drawString("開始",700,140);
        g.drawRect(690,180,50, 30);
        g.drawString("設置",700,200);
        g.drawString("Code by 禿桔子 QQ:1243137612", 600,260);
    }

 

再然后我們需要確定每次鼠標單擊的事件和信息。

具體實現如下:

 

@Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        if (e.getX() < 570 && e.getY() < 570) {
            int a = core.ChessIt(_CgetX(e.getX()), (_CgetY(e.getY())), var);
            this.repaint();
            if (a == 1) {
                JOptionPane.showMessageDialog(null,"白的贏了", "恭喜", JOptionPane.DEFAULT_OPTION);;
            }
            if(a==2) {
                JOptionPane.showMessageDialog(null,"黑的贏了", "恭喜", JOptionPane.DEFAULT_OPTION);;
            }
            if(a!=-1) {
                if(var==1) var=2;
                else if(var==2) var=1;
            }
        }
        else if(e.getX()>690&&e.getX()<760&&e.getY()>60&&e.getY()<90) {
            core.RetChess();
            if(var==1) var=2;
            else if(var==2) var=1;
            this.repaint();
        }
        if(e.getX()>690&&e.getX()<760&&e.getY()>120&&e.getY()<150) {
            core.Restart();
            this.repaint();
        }
        if(e.getX()>690&&e.getX()<760&&e.getY()>180&&e.getY()<210) {
            Object[] options = {"白先","黑先"};
            int n = JOptionPane.showOptionDialog(null,"紅先還是黑先?","游戲設置",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE, null,options,options[0]);
            if(n==0) this.var=1;
            if(n==1) this.var=2;
            this.core.Restart();
            this.repaint();
        }
    }

 

再然后每次單擊的時候進行repaint重繪將代碼重寫出來。

 

這些東西我也不記得,看api就好了。

下面是總體源碼:

 

package main;

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
/**
 * 
 * @author GodofOrange
 * @see 圖形界面
 */
public class Windows extends JFrame implements MouseListener {
    public Core core;
    private static final long serialVersionUID = 1L;
    private int var = 1;
    public Windows(String title) {
        super(title);
        core = new Core(19, 19);
        this.setSize(800, 600);
        this.setLocation(800, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setResizable(false);
        this.addMouseListener(this);
    }

    @Override
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);
        // 橫
        for (int i = 0; i < 19; i++)
            g.drawLine(30, 30 + i * 30, 570, 30 + i * 30);
        // 豎線
        for (int i = 0; i < 19; i++)
            g.drawLine(30 + i * 30, 60, 30 + i * 30, 570);

        int[][] board = core.getCore();
        for (int i = 0; i < 19; i++) {
            for (int j = 0; j < 19; j++) {
                if (board[i][j] == 1)
                    g.drawOval(20 + i * 30, 50 + j * 30, 20, 20);
                if(board[i][j]==2)
                    g.fillOval(20+i*30, 50+j*30, 20, 20);
            }
        }
        g.drawRect(690,60, 50, 30);
        g.drawString("悔棋",700,80);
        g.drawRect(690,120,50, 30);
        g.drawString("開始",700,140);
        g.drawRect(690,180,50, 30);
        g.drawString("設置",700,200);
        g.drawString("Code by 禿桔子 QQ:1243137612", 600,260);
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        if (e.getX() < 570 && e.getY() < 570) {
            int a = core.ChessIt(_CgetX(e.getX()), (_CgetY(e.getY())), var);
            this.repaint();
            if (a == 1) {
                JOptionPane.showMessageDialog(null,"白的贏了", "恭喜", JOptionPane.DEFAULT_OPTION);;
            }
            if(a==2) {
                JOptionPane.showMessageDialog(null,"黑的贏了", "恭喜", JOptionPane.DEFAULT_OPTION);;
            }
            if(a!=-1) {
                if(var==1) var=2;
                else if(var==2) var=1;
            }
        }
        else if(e.getX()>690&&e.getX()<760&&e.getY()>60&&e.getY()<90) {
            core.RetChess();
            if(var==1) var=2;
            else if(var==2) var=1;
            this.repaint();
        }
        if(e.getX()>690&&e.getX()<760&&e.getY()>120&&e.getY()<150) {
            core.Restart();
            this.repaint();
        }
        if(e.getX()>690&&e.getX()<760&&e.getY()>180&&e.getY()<210) {
            Object[] options = {"白先","黑先"};
            int n = JOptionPane.showOptionDialog(null,"紅先還是黑先?","游戲設置",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE, null,options,options[0]);
            if(n==0) this.var=1;
            if(n==1) this.var=2;
            this.core.Restart();
            this.repaint();
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    private int _CgetX(int x) {
        x -= 30;
        if (x % 15 <= 7)
            return x / 30;
        else
            return x / 30 + 1;
    }

    private int _CgetY(int y) {
        y -= 60;
        if (y % 15 <= 7)
            return y / 30;
        else
            return y / 30 + 1;
    }
}

 

然后就是啟動函數了

這個函數放哪都行-.-。。。。。一看就懂吧?

 

package main;

public class Main {
    /** 啟動函數
     * @param args
     */
    public static void main(String[] args) {
        new Windows("五子棋");
    }
}

 

總結:#

其實五子棋的小程序對于初學者來說并不簡單。不適合做練手項目,不過當代碼量積累到一定程度,寫這個小程序簡直不要太輕松。完成起來分分鐘鐘。一定要打好數據結構的基礎并加大代碼量。

希望大家將此篇文章分享,轉載,讓更多需要的朋友看到,這樣不僅幫助了自己,也幫助了他人,謝謝??!

分享到:
標簽:游戲 Java
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定