五子棋是全国智力运动会竞技项目之一,容易上手,老少皆宜,而且趣味横生,引人入胜,不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。当然,用 JAVA 语言编写五子棋 AI 小游戏也是一件非常有意思的事:
先上效果图:
一、五子棋规则
五子棋的基本规则如下:
(1) 棋盘:采用国际上标准的 15×15 路线的正方形棋盘。
(2)下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点走子,无子的交叉点又称为空点,规定由黑方先行走棋。
(3)输赢判断:黑、白双方有一方的五个棋子在衡、竖或斜的方向上联接成无间断的一条线即为该方赢。
二、思路分析
(1)下五子棋首先需要一个棋盘,国际标准是 15×15 路线,为了增加趣味性,我们在编写程序时可以使用不同线路的棋盘。
(2)用户在开始游戏前可进行相关选择,如:模式选择(人人对战、人机对战),颜色选择(用户要黑棋、用户要白棋),下棋顺序(黑棋先行、白棋先行),并且设置有“开始游戏”、“重新开始”、“认输结束”、“悔棋”等按钮。
(3)开始游戏后,用户在棋盘上点击相应的位置就可以下棋子(人人模式黑白子交替出现,人机模式用户在下完一个子后电脑也会自动下一个子),且每下一步棋系统需要判断横竖斜这几个方向上是否有连续相同颜色的五个棋子。
(4)在游戏过程中,当用户改变界面大小和拖动界面,即调用 paint 函数时棋盘和棋子不会消失。
简简单单几个步骤,顿时感觉难度也不高,下面开工!let's go !!!
三、代码详解
首先,我们需要画一个棋盘,new 一个 ImageUI 类(当然也可以取其他名字),在这个类中,我们需要把五子棋的界面画出来,为了方便管理,在 JFrame 上设置了两个 JPanel,一个JPanel 里放 ImagePanel,用于棋盘和棋子的绘制,另一个JPanel 里放相关按钮。
为了能够实现模式选择等单选功能,这边使用了单选按钮 JRadioButton,并打包放入一个 group 中,由于按钮紧挨在一起不美观,我们在部分按钮后面增加了一个空的 JLabel。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class ImageUI extends JFrame implements Config{
ImageListener ul = new ImageListener();
ImagePanel imgPanel = new ImagePanel();
public static void main(String[] args){
new ImageUI();
}
ImageUI(){
initUI();
}
private void initUI(){
JFrame jf = frameInitUI();
JPanel[] jps = addPanel(jf);
addButton(jps,ul);
jf.setVisible(true);
Graphics gr = imgPanel.getGraphics();
ul.g = gr;
ul.imgPanel = imgPanel;
imgPanel.qz = ul.qz;
imgPanel.addMouseListener(ul);
}
private void addButton(JPanel[] jps, ActionListener al) {
JLabel j0 = new JLabel(" ");
jps[1].add(j0);
String[] btnstrs = new String[]{"开始游戏","重新开始","认输结束","悔棋一步",
" 模式 ","人人对战","人机对战"," 颜色 ","我要黑棋","我要白棋",
" 顺序 ","黑棋先行","白棋先行"};
for (int i = 0; i < 4; i++){
JButton btn = new JButton(btnstrs[i]);
Dimension dim = new Dimension(120,40);
btn.setPreferredSize(dim);
btn.setFont(new Font("黑体",1,20));
btn.setBackground(Color.WHITE);
btn.addActionListener(ul);
jps[1].add(btn);
}
JLabel j1 = new JLabel(" ");
jps[1].add(j1);
JLabel j2 = new JLabel(btnstrs[4]);
j2.setFont(new Font("楷体",1,30));
jps[1].add(j2);
ButtonGroup group1 = new ButtonGroup();
for (int i = 5; i < 7; i++){
JRadioButton jrb = new JRadioButton(btnstrs[i]);
jrb.setPreferredSize(new Dimension(120,40));
jrb.setFont(new Font("黑体",1,20));
jrb.setSelected(true);
jrb.setBackground(Color.YELLOW);
jrb.addActionListener(ul);
group1.add(jrb);
jps[1].add(jrb);
}
JLabel j3 = new JLabel(" ");
jps[1].add(j3);
JLabel j4 = new JLabel(btnstrs[7]);
j4.setFont(new Font("楷体",1,30));
jps[1].add(j4);
ButtonGroup group2 = new ButtonGroup();
for (int i = 8; i < 10; i++){
JRadioButton jrb = new JRadioButton(btnstrs[i]);
jrb.setPreferredSize(new Dimension(120,40));
jrb.setFont(new Font("黑体",1,20));
jrb.setSelected(true);
jrb.setBackground(Color.YELLOW);
jrb.addActionListener(ul);
group2.add(jrb);
jps[1].add(jrb);
}
JLabel j5 = new JLabel(" ");
jps[1].add(j5);
JLabel j6 = new JLabel(btnstrs[10]);
j6.setFont(new Font("楷体",1,30));
jps[1].add(j6);
ButtonGroup group3 = new ButtonGroup();
for (int i = 11; i < 13; i++){
JRadioButton jrb = new JRadioButton(btnstrs[i]);
jrb.setPreferredSize(new Dimension(120,40));
jrb.setFont(new Font("黑体",1,20));
jrb.setSelected(true);
jrb.setBackground(Color.YELLOW);
jrb.addActionListener(ul);
group3.add(jrb);
jps[1].add(jrb);
}
}
private JPanel[] addPanel(JFrame jf) {
JPanel[] jps = new JPanel[2];
String[] layoustrs = {BorderLayout.CENTER,BorderLayout.EAST};
imgPanel.setBackground(Color.LIGHT_GRAY);
jf.add(imgPanel,layoustrs[0]);
jps[0] = imgPanel;
Dimension dim = new Dimension(200,0);
JPanel jp_s = new JPanel();
jp_s.setBackground(Color.ORANGE);
jp_s.setPreferredSize(dim);
jf.add(jp_s,layoustrs[1]);
jps[1] = jp_s;
return jps;
}
private JFrame frameInitUI() {
setTitle(&#