F



i



v



e



-



gr



ea



t
Java版五子棋小游戏(java控制台)

Java版五子棋小游戏(java控制台)

前言: 该项目 为 Java 版五子棋小游戏,为控制台小游戏,主要功能有 人机大战,左右互战,可以悔棋可以提示,

人机大战采用 五元贡献法,代码简单 实况效果好 ,相比 一般 博弈论 判断局面的方式,比正真的AI 还是有一定的差距。还有更多可扩展 可以自行摸索

源码

核心代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
//游戏运行入口
public class FiveChess{public static void main(String[] args){new FiveChessMenu();}}
//界面类,这是游戏主体框架
class FiveChessWindows extends JFrame {//五子棋窗口
    private Chessboard chessboard = new Chessboard();//五子棋盘【关键】
    private Chess chess = new Chess();    //五子棋业务逻辑【关键】    
    private Panel toolbar1,toolbar2,toolbar3;    
    private boolean flag;//
    private JButton startButton;
    private JTextField text1, text2,text3,text4;
    private JButton prompt1,prompt2;
    private JButton backButton1,backButton2;
    private JButton exitButton;
    private int owner_flag=1;//用于左右互搏
    private boolean prompt_flag=false;
    private String utf_hz = null,utf_bz=null; //
    //完成五子棋游戏界面
    public void init(Boolean flag,int res_flag){
        this.flag=flag;Chess.FIRST=res_flag;
        setTitle("java版五子棋-five");//创建游戏界面窗口
        toolbar1 = new Panel();
        toolbar2 = new Panel();
        toolbar3 = new Panel();
        toolbar1.setLayout(new GridLayout(3,1,20,20));
        toolbar3.setLayout(new GridLayout(3,1,20,20));
        text1 = new JTextField();
        text1.setPreferredSize(new Dimension(60, 60)); // 设置大小
        text1.setFont(new Font(null, Font.BOLD,50));
        text1.setEditable(false);//设置不可编辑
        text2 = new JTextField();
        text2.setPreferredSize(new Dimension(60, 60)); // 设置大小
        text2.setFont(new Font(null, Font.BOLD,50));
        text2.setEditable(false);//设置不可编辑
        text3 = new JTextField();
        text3.setPreferredSize(new Dimension(60, 60)); // 设置大小
        text3.setFont(new Font(null, Font.BOLD,50));
        text3.setEditable(false);//设置不可编辑
        text4 = new JTextField();
        text4.setPreferredSize(new Dimension(60, 60)); // 设置大小
        text4.setFont(new Font(null, Font.BOLD,50));
        text4.setEditable(false);//设置不可编辑
        //把“选项”菜单加入到菜单栏
        //MyButton startButton= new MyButton("       重   新    开     始           ");
        startButton = new MyButton("       重     新    开     始           ");
        backButton1 = new MyButton("       悔      棋         ");
        backButton2 = new MyButton("       悔      棋         ");
        prompt1 = new MyButton("   提        ?      示       ");
        prompt2 = new MyButton("   提        ?      示       ");
        exitButton = new MyButton("        返     回    菜    单             ");
        toolbar1.setBackground(Color.cyan);
        toolbar2.setBackground(Color.green);
        toolbar3.setBackground(Color.cyan);
        if(!flag)toolbar1.add(new JLabel(new ImageIcon("./src/玩家.png")));
        else toolbar1.add(new JLabel(new ImageIcon("./src/电脑1.png")));
        toolbar3.add(new JLabel(new ImageIcon("./src/玩家.png")));
        JPanel j3 =new JPanel(new GridLayout(2,1,5,5));
        j3.add(text1);j3.add(text3);
        toolbar1.add(j3);
        if(!flag)text1.setText("—玩 家—");
        else text1.setText("—电 脑—");
        JPanel j4 =new JPanel(new GridLayout(2,1,5,5));
        j4.add(text2);j4.add(text4);
        toolbar3.add(j4);
        text2.setText("—玩 家—");
        JPanel j1=new JPanel();
         j1.setLayout(new GridLayout(3,1,20,20));
         j1.setBackground(Color.cyan);
         j1.add(prompt1);
         j1.add(backButton1);
         toolbar1.add(j1);
         JPanel j2=new JPanel();
         j2.setLayout(new GridLayout(3,1,20,20));//网格布局
         j2.setBackground(Color.cyan);
         j2.add(prompt2);
         j2.add(backButton2);
         toolbar3.add(j2);
         exitButton.setSize(180, 60);
        toolbar2.add(startButton);
        toolbar2.add(exitButton);
        Gbk_Utf1();
        textInit();
        ButtonInit();//按钮事件绑定初始化
            add(toolbar1, BorderLayout.WEST);
            add(toolbar2, BorderLayout.SOUTH);
            add(toolbar3, BorderLayout.EAST);
            add(chessboard,BorderLayout.CENTER);//把五子棋盘加入到frame
            //绑定鼠标事件,要下棋了,为了避免写无用的抽象方法的实现,
            chessboard.addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){
                    play(e);//鼠标点击引发下棋事件,处理下棋事件比较繁琐,为此开一个方法
                }
            });    
        //设置frame窗口左上角图标
         setIconImage(this.getToolkit().getImage("./src/favicon.png"));
         setLocation(225, 100);
         setSize(1198, 800);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setResizable(false);
         setVisible(true);
         AIFirstOptionInit();//
    }
    public void ButtonInit() {
        backButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int xy=chessboard.goback();
                if(xy>0)chess.goback(xy);
            }
        });
        backButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // goback();
                int xy=chessboard.goback();
                if(xy>0)chess.goback(xy);
            }
        });
        prompt1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                prompt_flag=!prompt_flag;
                chessboard.setPrompt(prompt_flag);
                if(prompt_flag) chessboard.setScores(chess.getScores());
                chessboard.repaint();

        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    
    prompt2<span class="token punctuation">.</span><span class="token function">addActionListener</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ActionListener</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token annotation punctuation">@Override</span>
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">actionPerformed</span><span class="token punctuation">(</span>ActionEvent e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            prompt_flag<span class="token operator">=</span><span class="token operator">!</span>prompt_flag<span class="token punctuation">;</span>
            chessboard<span class="token punctuation">.</span><span class="token function">setPrompt</span><span class="token punctuation">(</span>prompt_flag<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">if</span><span class="token punctuation">(</span>prompt_flag<span class="token punctuation">)</span> <span class="token punctuation">{</span>chessboard<span class="token punctuation">.</span><span class="token function">setScores</span><span class="token punctuation">(</span>chess<span class="token punctuation">.</span><span class="token function">getScores</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>
            chessboard<span class="token punctuation">.</span><span class="token function">repaint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    
    exitButton<span class="token punctuation">.</span><span class="token function">addActionListener</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ActionListener</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token annotation punctuation">@Override</span>
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">actionPerformed</span><span class="token punctuation">(</span>ActionEvent e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">new</span> <span class="token class-name">FiveChessMenu</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token function">dispose</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    

    startButton<span class="token punctuation">.</span><span class="token function">addActionListener</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ActionListener</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token annotation punctuation">@Override</span>
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">actionPerformed</span><span class="token punctuation">(</span>ActionEvent e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            FiveChessWindows five <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FiveChessWindows</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              five<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span>flag<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
              <span class="token keyword">new</span> <span class="token class-name">RockPaperScissors</span><span class="token punctuation">(</span>flag<span class="token punctuation">,</span>five<span class="token punctuation">)</span><span class="token punctuation">;</span>
              <span class="token function">dispose</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">//&#x201C;&#x5148;&#x540E;&#x624B;&#x5904;&#x7406;&#x4E8B;&#x4EF6;</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">AIFirstOptionInit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
            <span class="token comment" spellcheck="true">//&#x68CB;&#x76D8;&#x8FD8;&#x6CA1;&#x6709;&#x843D;&#x5B50;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x201C;&#x673A;&#x5668;&#x5148;&#x624B;&#x201D;&#xFF0C;&#x4E00;&#x65E6;&#x6709;&#x843D;&#x5B50;&#xFF0C;&#x9009;&#x62E9;&#x201C;&#x673A;&#x5668;&#x5148;&#x624B;&#x201D;&#x5931;&#x6548;</span>
            <span class="token keyword">if</span><span class="token punctuation">(</span>chessboard<span class="token punctuation">.</span><span class="token function">isEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
                <span class="token keyword">if</span><span class="token punctuation">(</span>Chess<span class="token punctuation">.</span>FIRST <span class="token operator">==</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                <span class="token comment" spellcheck="true">//&#x673A;&#x5668;&#x5148;&#x624B;&#xFF0C;&#x5219;&#x5148;&#x5728;&#x4E2D;&#x95F4;&#x4F4D;&#x7F6E;&#x4E0B;&#x4E00;&#x4E2A;&#x68CB;&#x5B50;</span>
                chessboard<span class="token punctuation">.</span><span class="token function">addChessman</span><span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                chess<span class="token punctuation">.</span><span class="token function">addChessman</span><span class="token punctuation">(</span><span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

}
public void Gbk_Utf1() {
try {
utf_hz= new String("⚫".getBytes("UTF-8"), "UTF-8");
utf_bz = new String("⚪".getBytes("UTF-8"), "UTF-8");
} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}
}
public void textInit() {
if(Chess.FIRST==-1) {text3.setText(" 先手"+utf_hz);text4.setText(" 后手 "+utf_bz);}
else {text3.setText(" 后手 "+utf_bz);text4.setText(" 先手 "+utf_hz);}
}
//核心业务逻辑 处理鼠标落子事件
public void play(MouseEvent e){
int cellSize = chessboard.getCellSize();//每个格子的边长
int x = (e.getX() - 5) / cellSize;//像素值转换成棋盘坐标
int y = (e.getY() - 5) / cellSize;//像素值转换成棋盘坐标
//判断落子是否合法
boolean isLegal = chess.isLegal(x, y);
//如果落子合法
if(isLegal){
chessboard.addChessman(x, y, owner_flag);//界面方面加一个棋子
chess.addChessman(x, y, owner_flag);//逻辑业务方面加一个棋子
//判断人类是否胜利
if(chess.isWin(x, y, owner_flag)){
chessboard.setIsWin(chess.getisWinChess());
JOptionPane.showMessageDialog(this, " 己方获胜", "您赢了!", JOptionPane.PLAIN_MESSAGE);
chessboard.init();//初始化
chess.init();
textInit();
return;
}
Location loc = chess.searchLocation();//根据五元贡献的方法确定
if(flag) {
//机器落子
//Location loc = chess.searchLocation();//根据五元贡献的方法确定
chessboard.addChessman(loc);
chess.addChessman(loc.getX(), loc.getY(), loc.getOwner());
//判断机器是否胜利
if(chess.isWin(loc.getX(), loc.getY(), -1)){
chessboard.setIsWin(chess.getisWinChess());
JOptionPane.showMessageDialog(this, " 对方获胜", "您输了!", JOptionPane.PLAIN_MESSAGE);
chessboard.init();
chess.init();
textInit();
return;
}
}else owner_flag=-owner_flag;
chessboard.setPrompt(prompt_flag);//更行提示分数和棋子
chess.searchLocation();chessboard.setScores(chess.getScores());
}
}
}
class Chessboard extends JPanel{//棋盘类 继承了 JPanel
private static final long serialVersionUID = 1L;
public static final int CHESSBOARD_SIZE = 15;//棋盘大小15X15
private ArrayList locationList = new ArrayList();//棋盘上所有可以落子的位置坐标等信息
private Color backgroundColor = new Color(255, 245, 186);//棋盘背景色
private Color lineColor = new Color(66, 66, 66);//棋盘线条颜色
private int margin = 30;//棋盘边缘长度
private int[][] scores;//获取胜利棋子;
private int[] iswinxy;
private boolean prompt_flag=false;
public void init(){locationList.clear();repaint();} //初始化棋盘
public void setPrompt(boolean prompt_flag2) {this.prompt_flag=prompt_flag2;}//获取是否提示状态
public void setScores(int[][] scores) {this.scores=scores;}//获取分数数据
public void setIsWin(int[] iswinxy) {this.iswinxy=iswinxy;}
public void paint(Graphics g){//覆盖paint方法
super.paint(g);
drawChessboard(g);//画棋盘
drawScores(g);//画分数
drawiswin(g);//画胜利棋子
drawChessman(g);//画棋子
}
public void drawChessboard(Graphics g){//画棋盘

    g<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span>backgroundColor<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//&#x5148;&#x753B;&#x80CC;&#x666F;</span>
    g<span class="token punctuation">.</span><span class="token function">fillRect</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getHeight</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    g<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span>lineColor<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//&#x753B;&#x7EBF;</span>
    <span class="token keyword">int</span> cellSize <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">2</span><span class="token operator">*</span>margin<span class="token punctuation">)</span><span class="token operator">/</span><span class="token punctuation">(</span>CHESSBOARD_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//&#x6BCF;&#x4E2A;&#x683C;&#x5B50;&#x7684;&#x8FB9;&#x957F;</span>
    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> CHESSBOARD_SIZE<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        g<span class="token punctuation">.</span><span class="token function">drawLine</span><span class="token punctuation">(</span>margin<span class="token punctuation">,</span> margin <span class="token operator">+</span> i<span class="token operator">*</span>cellSize<span class="token punctuation">,</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> margin<span class="token punctuation">,</span> margin <span class="token operator">+</span> i<span class="token operator">*</span>cellSize<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//&#x753B;&#x6A2A;&#x7EBF;</span>
        g<span class="token punctuation">.</span><span class="token function">drawLine</span><span class="token punctuation">(</span>margin <span class="token operator">+</span> i<span class="token operator">*</span>cellSize<span class="token punctuation">,</span> margin<span class="token punctuation">,</span> margin <span class="token operator">+</span> i<span class="token operator">*</span>cellSize<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getHeight</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span>margin<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//&#x753B;&#x7EB5;&#x7EBF;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">drawChessman</span><span class="token punctuation">(</span>Graphics g<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment" spellcheck="true">//&#x753B;&#x68CB;&#x5B50;</span>
    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> locationList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        Location loc <span class="token operator">=</span> locationList<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">int</span> cellSize <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">2</span><span class="token operator">*</span>margin<span class="token punctuation">)</span><span class="token operator">/</span><span class="token punctuation">(</span>CHESSBOARD_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//&#x6BCF;&#x4E2A;&#x683C;&#x5B50;&#x7684;&#x8FB9;&#x957F;</span>
      <span class="token keyword">if</span><span class="token punctuation">(</span>i<span class="token operator">==</span>locationList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            g<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Color</span><span class="token punctuation">(</span><span class="token number">207</span><span class="token punctuation">,</span><span class="token number">13</span><span class="token punctuation">,</span><span class="token number">62</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">// &#x6807;&#x8BB0;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x68CB;&#x5B50;&#x56DB;&#x5468;&#x4E3A;&#x7EA2;&#x8272;</span>
            g<span class="token punctuation">.</span><span class="token function">fillRoundRect</span><span class="token punctuation">(</span>margin <span class="token operator">+</span> cellSize<span class="token operator">*</span>loc<span class="token punctuation">.</span><span class="token function">getX</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> cellSize<span class="token operator">/</span><span class="token number">2</span><span class="token operator">-</span><span class="token number">5</span><span class="token punctuation">,</span> margin <span class="token operator">+</span> cellSize<span class="token operator">*</span>loc<span class="token punctuation">.</span><span class="token function">getY</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> cellSize<span class="token operator">/</span><span class="token number">2</span><span class="token operator">-</span><span class="token number">5</span><span class="token punctuation">,</span> cellSize<span class="token operator">+</span><span class="token number">8</span><span class="token punctuation">,</span> cellSize<span class="token operator">+</span><span class="token number">8</span><span class="token punctuation">,</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            g<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span>backgroundColor<span class="token punctuation">)</span><span class="token punctuation">;</span>
            g<span class="token punctuation">.</span><span class="token function">fillRoundRect</span><span class="token punctuation">(</span>margin <span class="token operator">+</span> cellSize<span class="token operator">*</span>loc<span class="token punctuation">.</span><span class="token function">getX</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> cellSize<span class="token operator">/</span><span class="token number">2</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">,</span> margin <span class="token operator">+</span> cellSize<span class="token operator">*</span>loc<span class="token punctuation">.</span><span class="token function">getY</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> cellSize<span class="token operator">/</span><span class="token number">2</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">,</span> cellSize<span class="token operator">+</span><span class="token number">2</span><span class="token punctuation">,</span> cellSize<span class="token operator">+</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">100</span><span class="token punctuation">,</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>     
        <span class="token comment" spellcheck="true">//&#x6839;&#x636E;&#x5148;&#x540E;&#x624B;&#x8BBE;&#x7F6E;&#x68CB;&#x5B50;&#x4E3A;&#x9ED1;&#x8272;&#x548C;&#x767D;&#x8272;</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span>loc<span class="token punctuation">.</span><span class="token function">getOwner</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> Chess<span class="token punctuation">.</span>FIRST<span class="token punctuation">)</span>g<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span>Color<span class="token punctuation">.</span>BLACK<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">else</span> g<span class="token punctuation">.</span><span class="token function">setColor</span><span class="token punctuation">(</span>Color<span class="token punctuation">.</span>WHITE<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment" spellcheck="true">//&#x753B;&#x68CB;&#x5B50;</span>
        g<span class="token punctuation">.</span><span class="token function">fillOval</span><span class="token punctuation">(</span>margin <span class="token operator">+</span> cellSize<span class="token operator">*</span>loc<span class="token punctuation">.</span><span class="token function">getX</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> cellSize<span class="token operator">/</span><span class="token number">2</span><span class="token operator">+</span><span class="token number">3</span><span class="token punctuation">,</span> margin <span class="token operator">+</span> cellSize<span class="token operator">*</span>loc<span class="token punctuation">.</span><span class="token function">getY</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> cellSize<span class="token operator">/</span><span class="token number">2</span><span class="token operator">+</span><span class="token number">3</span><span class="token punctuation">,</span> cellSize<span class="token operator">-</span><span class="token number">6</span><span class="token punctuation">,</span> cellSize<span class="token operator">-</span><span class="token number">6</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

//划分数
public void drawScores(Graphics g) {
if(prompt_flag) {
int Maxscore=0,Maxx=-1,Maxy=-1;
g.setColor(Color.darkGray);
int cellSize = (this.getWidth() - 2*margin)/(CHESSBOARD_SIZE - 1);//每个格子的边长
for(int i = 0; i < CHESSBOARD_SIZE; i++)
for(int j = 0; j < CHESSBOARD_SIZE; j++) {
if(Maxscore<=scores[i][j]){Maxscore=scores[i][j];Maxx=i;Maxy=j;}
g.drawString(""+scores[i][j],margin + i*cellSize, margin + j*cellSize);
}
g.setColor(Color.green);//画提示棋子。
g.fillOval(margin + cellSize*Maxx - cellSize/2+5, margin + cellSize*Maxy - cellSize/2+5, cellSize-8, cellSize-8);
}
}
public void drawiswin(Graphics g) { //画胜利棋子
if(iswinxy!=null && iswinxy.length>3) {
g.setColor(Color.darkGray);System.out.println(iswinxy.length);
int cellSize = (this.getWidth() - 2*margin)/(CHESSBOARD_SIZE - 1);//每个格子的边长
int x1,y1;
for(int i=0;i<5;i++) {
x1=iswinxy[i]/100;y1=iswinxy[i]%100;
g.setColor(new Color(207,13,62));//
g.fillRoundRect(margin + cellSize*x1 - cellSize/2-5, margin + cellSize*y1 - cellSize/2-5, cellSize+8, cellSize+8,100,100);
g.setColor(backgroundColor);
g.fillRoundRect(margin + cellSize*x1 - cellSize/2-2, margin + cellSize*y1 - cellSize/2-2, cellSize+2, cellSize+2,100,100);
}
iswinxy=null;
}
}
public int goback() {
if (locationList.size() == 0)return -1;
int x=locationList.get(locationList.size()-1).getX();
int y=locationList.get(locationList.size()-1).getY();
locationList.remove(locationList.size()-1);repaint();
return x*100+y;
}
public void addChessman(int x, int y, int owner){locationList.add(new Location(x, y, owner));repaint();}//落子
public void addChessman(Location loc){locationList.add(loc);repaint();}
public int getCellSize(){return (this.getWidth() - 2*margin)/(CHESSBOARD_SIZE - 1);}//计算棋盘每个小格子的大小
public boolean isEmpty() {return locationList.size() == 0 ? true : false;}//判断棋盘是否还没有棋子
}
class Location{
private int x;//某个棋盘位置横坐标,0-14
private int y;//某个棋盘位置纵坐标,0-14
private int owner;//占据该位置的棋手方,1是人类,-1是机器,0是空
private int score;//对该位置的打的分数
public Location(){}//构造方法
public Location(int x, int y, int owner){this.x = x;this.y = y;this.owner = owner;}
public Location(int x, int y, int owner, int score){this(x, y, owner);this.score = score;}
public int getX(){return this.x;}//x 坐标
public void setX(int x){this.x = x;}
public int getY(){return this.y;} //y坐标
public void setY(int y){this.y = y;}
public int getOwner(){return this.owner;}// 棋盘点 状态坐标
public void setOwner(int owner){this.owner = owner;}
public int getScore(){return this.score;}// 该点分数
public void setScore(int score){this.score = score;}
}
//下棋业务核心类,与界面棋盘对应,业务放在这里,可以和界面代码分离
class Chess{
public static final int CHESSBOARD_SIZE = 15;
public static int FIRST = 1;//先手,-1表示机器,1表示人类,与Location类中的对应
private int[][] chessboard = new int[CHESSBOARD_SIZE][CHESSBOARD_SIZE];//与界面棋盘对应,0代表空,-1代表机器,1代表人类
private int[][] score = new int[CHESSBOARD_SIZE][CHESSBOARD_SIZE];//每个位置得分
private int[] iswinxy=new int[6];//胜利棋子坐标。
public Chess(){}
public void goback(int xy) {chessboard[xy/100][xy%100]=0;}
public void init(){
FIRST = 1;//默认人类先手
for(int i = 0; i < CHESSBOARD_SIZE; i++)
for(int j = 0; j < CHESSBOARD_SIZE; j++){chessboard[i][j] = 0; score[i][j] = 0;}//初始化棋盘 和分数表
}
public void addChessman(int x, int y, int owner){chessboard[x][y] = owner;} //落子
public boolean isLegal(int x, int y){//棋盘边界判断 以及是否落子 //判断落子位置是否合法
if(x >=0 && x = 0 && y < CHESSBOARD_SIZE && chessboard[x][y] == 0)return true;
return false;
}
public boolean isWin(int x, int y, int owner){//判断哪方赢了(必定有刚落的子引发,因此只需判断刚落子的周围),owner为-1代表机器,owner为1代表人类
int sum = 0,k=1; for(int i=0;i<6;i++)iswinxy[i]=0;
iswinxy[0]=x*100+y;
//判断纵向上下方向
for(int i = x - 1; i >= 0; i)if(chessboard[i][y] == owner){ sum++;iswinxy[k++]=i*100+y;}else break;
for(int i = x + 1; i < CHESSBOARD_SIZE; i++)if(chessboard[i][y] == owner){sum++;iswinxy[k++]=i*100+y;}else break;
if(sum >= 4) {return true;}
//判断横向向左右边
sum = 0;k=1;
for(int i = y - 1; i >= 0; i)if(chessboard[x][i] == owner){sum++;iswinxy[k++]=x*100+i;}else break;
for(int i = y + 1; i < CHESSBOARD_SIZE; i++)if(chessboard[x][i] == owner){sum++;iswinxy[k++]=x*100+i;}else break;
if(sum >= 4) {return true;}
//判断左上角到右下角方向上侧和左上角到右下角方向下侧(正斜线)
sum = 0;k=1;
for(int i = x - 1, j = y - 1; i >= 0 && j >= 0; i, j )if(chessboard[i][j] == owner){sum++;iswinxy[k++]=i*100+j;}else break;
for(int i = x + 1, j = y + 1; i < CHESSBOARD_SIZE && j < CHESSBOARD_SIZE; i++, j++ )if(chessboard[i][j] == owner){sum++;iswinxy[k++]=i*100+j;}else break;
if(sum >= 4) {return true;}
//判断右上角到左下角方向上侧和右上角到左下角方向下侧(反斜线)
sum = 0;k=1;
for(int i = x + 1, j = y - 1; i = 0; i++, j)if(chessboard[i][j] == owner){sum++;iswinxy[k++]=i*100+j;}else break;
for(int i = x - 1, j = y + 1; i >= 0 && j < CHESSBOARD_SIZE; i, j++ )if(chessboard[i][j] == owner){sum++;iswinxy[k++]=i*100+j;}else break;
if(sum >= 4) {return true;}
return false;
}
public int[] getisWinChess() { return iswinxy;}//获取胜利棋子
public int[][] getchessborad() { return chessboard;}//获取胜利棋子
//确定机器落子位置
//使用五元贡献评分算法
//算法思路:对15X15的572个五元组分别评分,一个五元组的得分就是该五元组为其中每个位置贡献的分数, 一个位置的分数就是其所在所有五元组分数之和。所有空位置中分数最高的那个位置就是落子位置。
public Location searchLocation(){
int humanChessmanNum = 0;//五元组中的黑棋数量
int machineChessmanNum = 0;//五元组中的白棋数量
int tupleScoreTmp = 0;//五元组得分临时变量
int goalX = -1;//目标位置x坐标
int goalY = -1;//目标位置y坐标
int maxScore = -1;//最大分数
for(int i = 0; i < CHESSBOARD_SIZE; i++)//每次都初始化下score评分数组(全部置零)////每次机器找寻落子位置,评分都重新算一遍
for(int j = 0; j < CHESSBOARD_SIZE; j++) score[i][j] = 0;
//1.扫描横向和横向的15个行
for(int i = 0; i < CHESSBOARD_SIZE; i++){
for(int j = 0; j < CHESSBOARD_SIZE-4; j++){
for(int k = j; k < j + 5; k++)//每次加五个状态
if(chessboard[i][k] == -1) machineChessmanNum++;else if(chessboard[i][k] == 1)humanChessmanNum++;
tupleScoreTmp = tupleScore(humanChessmanNum, machineChessmanNum);//为该五元组的每个位置添加分数
for(int k = j; k < j + 5; k++)score[i][k] += tupleScoreTmp;
humanChessmanNum =tupleScoreTmp=machineChessmanNum=0;//清零
for(int k = j; k < j + 5; k++){//每次加五个状态
if(chessboard[k][i] == -1) machineChessmanNum++;
else if(chessboard[k][i] == 1)humanChessmanNum++;
}
tupleScoreTmp = tupleScore(humanChessmanNum, machineChessmanNum);
for(int k = j; k < j + 5; k++)score[k][i] += tupleScoreTmp;
humanChessmanNum =tupleScoreTmp=machineChessmanNum=0;//清零
}
}
//3.扫描右上角到左下角上侧部分
for(int i = CHESSBOARD_SIZE-1; i >= 4; i){
for(int k = i, j = 0; j = 0; j++, k){
int m = k, n = j;
while(m > k - 5 && k - 5 >= -1){
if(chessboard[m][n] == -1) machineChessmanNum++;
else if(chessboard[m][n] == 1)humanChessmanNum++;
m;n++;
}
if(m == k-5){//注意斜向判断的时候,可能构不成五元组(靠近四个角落),遇到这种情况要忽略掉
tupleScoreTmp = tupleScore(humanChessmanNum, machineChessmanNum);
for(m = k, n = j; m > k - 5 ; m, n++)score[m][n] += tupleScoreTmp;//为该五元组的每个位置添加分数
}
humanChessmanNum =tupleScoreTmp=machineChessmanNum=0;//清零
}
}
//4.扫描右上角到左下角下侧部分
for(int i = 1; i < CHESSBOARD_SIZE; i++){
for(int k = i, j = CHESSBOARD_SIZE-1; j >= 0 && k < CHESSBOARD_SIZE; j, k++){
int m = k,n=j;
while(m < k + 5 && k + 5 <= CHESSBOARD_SIZE){
if(chessboard[n][m] == -1) machineChessmanNum++;
else if(chessboard[n][m] == 1)humanChessmanNum++;
m++;n;
}
if(m == k+5){//注意斜向判断的时候,可能构不成五元组(靠近四个角落),遇到这种情况要忽略掉
tupleScoreTmp = tupleScore(humanChessmanNum, machineChessmanNum);
for(m = k, n = j; m < k + 5; m++, n)score[n][m] += tupleScoreTmp;//为该五元组的每个位置添加分数
}
humanChessmanNum =tupleScoreTmp=machineChessmanNum=0;//清零
}
}
//5.扫描左上角到右下角部分
for(int i = 0; i < CHESSBOARD_SIZE-4; i++){
for(int k = i, j = 0; j < CHESSBOARD_SIZE && k < CHESSBOARD_SIZE; j++, k++){
int m,n;
for(m=k,n=j;m < k + 5 && k + 5 <= CHESSBOARD_SIZE;m++,n++){
if(chessboard[m][n] == -1) machineChessmanNum++;
else if(chessboard[m][n] == 1)humanChessmanNum++;
}
if(m == k + 5){//注意斜向判断的时候,可能构不成五元组(靠近四个角落),遇到这种情况要忽略掉
tupleScoreTmp = tupleScore(humanChessmanNum, machineChessmanNum);
for(m = k, n = j; m < k + 5; m++, n++)score[m][n] += tupleScoreTmp; //为该五元组的每个位置添加分数
}
humanChessmanNum =tupleScoreTmp=machineChessmanNum=0;//清零
for(m=k,n=j;m < k + 5 && k + 5 <= CHESSBOARD_SIZE;m++,n++){
if(chessboard[n][m] == -1) machineChessmanNum++;
else if(chessboard[n][m] == 1)humanChessmanNum++;
}
if(m == k + 5){//注意斜向判断的时候,可能构不成五元组(靠近四个角落),遇到这种情况要忽略掉
tupleScoreTmp = tupleScore(humanChessmanNum, machineChessmanNum);
//为该五元组的每个位置添加分数
for(m = k, n = j; m < k + 5; m++, n++)score[n][m] += tupleScoreTmp;
}
humanChessmanNum =tupleScoreTmp=machineChessmanNum=0;//清零
}
}
for(int i = 0; i < CHESSBOARD_SIZE; i++)//从空位置中找到得分最大的位置(确定落子位置)
for(int j = 0; j < CHESSBOARD_SIZE; j++)
if(chessboard[i][j] == 0 && score[i][j] > maxScore){goalX = i; goalY = j; maxScore = score[i][j];}
else if(chessboard[i][j] != 0)score[i][j]=0;
if(goalX != -1 && goalY != -1)return new Location(goalX, goalY, -1);
return new Location(-1, -1, -1);//没找到坐标说明平局了
}
public int[][] getScores() {return score;}
//各种五元组情况评分表
public int tupleScore(int humanChessmanNum, int machineChessmanNum){
int[] hb= {0,15,400,1800,100000};//人类落子 1,2,3,4 分别对应 15 400 1800,100000
int[] mb= {0,35,800,15000,800000};//机器落子 1,2,3,4分别对应 35 800 15000 800000
//1.既有人类落子,又有机器落子,判分为0
if(humanChessmanNum > 0 && machineChessmanNum > 0)return 0;
if(humanChessmanNum == 0 && machineChessmanNum == 0)return 7;
if(machineChessmanNum >0)return mb[machineChessmanNum];
if(humanChessmanNum>0)return hb[humanChessmanNum];
return -1;//若是其他结果肯定出错了。这行代码根本不可能执行
}
}
//自定义按钮
class MyButton extends JButton {
private Color quit = new Color(205, 255, 205);// 离开时颜色
public static final Color BUTTON_COLOR1 = new Color(205, 255, 205);
public static final Color BUTTON_COLOR2 = new Color(51, 154, 47);
public MyButton(String s) {
super(s);
setFont(new java.awt.Font(null, 1, 22)); //
setBorder(BorderFactory.createRaisedBevelBorder());//凸出
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
setContentAreaFilled(false);// 是否显示外围矩形区域 选否
}
public void paintComponent(Graphics g) {
g.setColor(quit);
g.fillRoundRect(0, 0, getSize().width - 1, getSize().height - 1,20, 20);
super.paintComponent(g);
}
public void paintBorder(Graphics g) { g.drawRoundRect(0, 0, getSize().width - 1, getSize().height - 1,20, 20);}
}

页面展示

1 主菜单页面展示

2 猜拳决定落子展示

3.下棋展示(当前落子圈红)

4.获胜突出现实展示

5.开启提示展示(绿色提示落子)

完整资源链接: 下载链接