JAVA课程设计黑白棋源代码|java课程设计|数据库课程设计|计算机课程设计|精品课程网站设计
import java.awt.*;import javax.swing.*;import java.awt.event.*;//建立一个大框架用来放置棋盘面板class Game extends JFrame{
int Max;//定义的棋盘大小为Max × Max的正方形 boolean ChessCheck = false;//定义一个变量,用来设置棋子是否能下在所在位置 boolean IamFirst = true;//定义一个变量,用来判断轮到谁下棋,黑棋为true白棋为false JPanel mainPanel;//定义主面板 Object[] options ={ "确定" };//警告框按钮 String msg;//警告框信息 public Game() { super("黑白棋(二人对战)");//窗口标题 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认窗口关闭按钮 setLocation(200, 200); //设置组件位置X,Y坐标 Image frame_icon = Toolkit.getDefaultToolkit().createImage(getClass().getResource("image\\bw.jpg"));//定义图标文件 setIconImage(frame_icon);//设置窗口图标 setVisible(true); mainPanel = new JPanel(); getContentPane().add(mainPanel); }}
//起始设置窗口//该窗口包含2个Label显示,其中一个为作者信息显示//另一个为输入提示,文本框用来输入棋盘大小//开始游戏按钮用来检查输入内容是否合法,若合法则进入游戏class Start extends JFrame{ Object[] options ={ "确定" }; String msg; JPanel S_panel; JLabel Msg; JLabel PMax; JTextField TMax; JButton GameStart; GameEvent bEGame; BorderLayout SLayout;
public Start() { super("黑白棋(二人对战)选择难度!"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocation(200, 200); //设置组件位置X,Y坐标 setSize(400, 100); S_panel=new JPanel() ; Msg = new JLabel("程序制作:杜世忠 Email:dushizhong@gmail.com"); PMax = new JLabel("选择方格。建议选择16以内,即16×16以下。必须为偶数。"); TMax = new JTextField("10"); GameStart=new JButton("开始游戏") ; bEGame = new GameEvent(); GameStart.addActionListener(bEGame); SLayout=new BorderLayout(2,2) ; getContentPane().add(S_panel); S_panel.setLayout(SLayout); S_panel.add("North",Msg); S_panel.add("West",PMax ); S_panel.add("Center", TMax); S_panel.add("South", GameStart); setVisible(true); setResizable(false); System.out.println("面板加载完成"); } //事件监听类,处理按钮事件 class GameEvent implements ActionListener { public void actionPerformed(ActionEvent Ge) { System.out.println("进入监听"); Object Gobj = Ge.getSource(); if (Gobj == GameStart) { System.out.println("开始处理"); try{ //将输入的文本转换为int型,若输入不是数字则抛出异常 int num= Integer.parseInt(TMax.getText()); if ((num % 2) == 0)//判断是否是偶数 { if (num < 8)//判断输入是否大于等于8 { PMax.setText("你输入了非法字符!必须输入大于等于8的偶数!"); //警告窗口 msg = new String("你输入了非法字符!必须输入大于等于8的偶数!"); JOptionPane.showOptionDialog(null, msg, "输入错误!", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); } else { //输入符合要求进入游戏 System.out.println("正在进入游戏!"); GameStart.setText(" 正 在 游 戏 中 "); GameStart.setEnabled(false); new Chess_panel(num); } }
else //如果输入了奇数,提示并返回要求重新输入 { System.out.println("你输入了非法字符!必须输入偶数!"); PMax.setText("你输入了非法字符!必须输入偶数!"); msg = new String("你输入了非法字符!必须输入偶数!"); JOptionPane.showOptionDialog(null, msg, "输入错误!", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
} }catch(Exception e) { //如果输入的不是数字,抛出异常,并提示 System.out.println("你输入了非法字符!必须为数字"+e); PMax.setText("你输入了非法字符!必须为数字!"); msg = new String("你输入了非法字符!必须输入数字!"); JOptionPane.showOptionDialog(null, msg, "输入错误!", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
} } } }}//棋盘面板//棋盘面板包括黑白双方的下棋提示,双方棋子数量即时显示,功能按钮,总比分显示//功能按钮包括(结束,重新开始,让步,裁判)//功能描述:// 双方开始游戏之后,黑棋先下,当下棋过程中一方无子可下的时候点击让步按钮,让另一方继续下// 直到最后格子下完,或者双方都无子可下的时候,点击裁判按钮,算出胜负,记下比分,并重新开始游戏// 在下棋过程中,点击新一局按钮将重新开始新一局游戏,但是并不会保存当前游戏的比分。// 任意时刻按结束按钮,程序退出class Chess_panel extends Game{ int Mark1 = 0, Mark2 = 0;//定义双方的分数变量 UserEvent bEObj; JButton Chess[][]; public Chess_panel(int input) { Max = input+2;//获取输入的棋盘大小参数 setResizable(true); setSize(600, 600); GridLayout grid = new GridLayout(Max, Max); mainPanel.setLayout(grid); Chess = new JButton[Max][Max]; bEObj = new UserEvent(); //整个面板由按钮组成,按行列绘制 for (int i = 0; i < Max; i++) {
for (int j = 0; j < Max; j++) { Chess[i][j] = new JButton(); Chess[i][j].setFont(new java.awt.Font("宋体", Font.PLAIN, 15)); if (i != 0 && i != Max - 1 && j != 0 && j != Max - 1) { Chess[i][j].setBackground(Color.green); } else { Chess[i][j].setEnabled(false); } mainPanel.add(Chess[i][j]); Chess[i][j].addActionListener(bEObj); this.setVisible(true); } } //设置外围棋盘按钮 Chess[0][0].setText("黑"); Chess[0][1].setText("0"); //Chess[0][1].setEnabled(true); Chess[0][Max - 2].setText("白"); Chess[0][Max - 1].setText("0"); //Chess[0][Max - 1].setEnabled(true); Chess[0][Max / 2 - 2].setText("黑"); Chess[0][Max / 2 - 1].setText("方"); Chess[0][Max / 2].setText("先"); Chess[0][Max / 2 + 1].setText("下"); //设置棋盘默认初始状态 Chess[(Max - 2) / 2][(Max - 2) / 2].setText("●"); Chess[(Max - 2) / 2 + 1][(Max - 2) / 2 + 1].setText("●"); Chess[(Max - 2) / 2][(Max - 2) / 2 + 1].setText("○"); Chess[(Max - 2) / 2 + 1][(Max - 2) / 2].setText("○"); //外围颜色,去掉按钮边框,设置按钮字体颜色 for (int m = 0; m < Max; m++) { Chess[0][m].setBorder(null); Chess[Max - 1][m].setBorder(null); Chess[Max - 1][m].setForeground(Color.blue); Chess[0][m].setBackground(Color.yellow); Chess[Max - 1][m].setBackground(Color.yellow); } for (int m = 1; m < Max - 1; m++) { Chess[m][0].setBorder(null); Chess[m][Max - 1].setBorder(null);/* Chess[m][0].setText("◎"); Chess[m][Max - 1].setText("◎"); */Chess[m][0].setBackground(Color.yellow); Chess[m][Max - 1].setBackground(Color.yellow); } //功能按钮 Chess[Max - 1][1].setEnabled(true); Chess[Max - 1][2].setEnabled(true); Chess[Max - 1][3].setEnabled(true); Chess[Max - 1][4].setEnabled(true); Chess[Max - 1][1].setText("结束"); Chess[Max - 1][2].setText("新一局"); Chess[Max - 1][3].setText("让步");
Chess[Max - 1][4].setText("裁判"); //比分显示 Chess[Max - 1][6].setText("总比分"); Chess[Max - 1][7].setText("黑"+Mark1); Chess[Max - 1][8].setText("白"+Mark2); Chess[0][1].setBackground(Color.white); Chess[0][Max - 1].setBackground(Color.white); } //设置功能按钮的事件侦听事件 class UserEvent implements ActionListener { public void actionPerformed(ActionEvent e) { Object obj = e.getSource(); //System.out.println("you have pressed a area"); if (obj == Chess[Max - 1][1]) { System.exit(1); }//退出按钮 if (obj == Chess[Max - 1][2]) { new Reset(); }//退出按钮 if (obj == Chess[Max - 1][3])//让步按钮 { if (IamFirst == false)//如果白棋让步 { IamFirst = true; Chess[0][0].setBackground(Color.red); Chess[0][Max-2].setBackground(Color.white); } else //如果黑棋让步 { IamFirst = false; Chess[0][0].setBackground(Color.white); Chess[0][Max-2].setBackground(Color.red); } } if(obj == Chess[Max - 1][4])//如果按裁判按钮,计算成绩 { int M1 = 0, M2 = 0; M1 = Integer.parseInt(Chess[0][1].getText()); M2 = Integer.parseInt(Chess[0][Max - 1].getText()); if (M1>M2){ System.out.println("黑棋胜"); msg = new String("裁判郑重宣布:\n胜利方为黑棋!\n恭喜恭喜!黑棋取得胜利!继续努力吧!\n白棋不要气馁,再接再厉!"); JOptionPane.showOptionDialog(null, msg, "成绩统计结果!", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); Mark1 = Mark1 + 1;//修改比分 Chess[Max - 1][7].setText("黑" + Mark1); } if (M1
else { System.out.println("I am white"); rules(i, j, "○"); if (ChessCheck == true) { Chess[i][j].setText("○"); IamFirst = true; Chess[0][0].setBackground(Color.red); Chess[0][Max-2].setBackground(Color.white); WhoWin(); } } } } }
} } } /*下棋规则,以当前下棋的位置为中心,向其周围的8个方向散射搜寻。 1.如果其搜寻方向上的第一个棋子不是对方棋子,则停止该方向上的搜寻, 设置该方向为不能 ChessCheck=false 2.如果搜寻方向上的第一个棋子为对方棋子,则继续搜寻直到找到己方棋 子则将中间部分的对方棋子变成己方棋子并设置该方向能 ChessCheck=true, 否则,设置标志为该方向不能ChessCheck=false 3.如果所有方向返回的都是不能ChessCheck=false */ public void rules(int i, int j, String chess) { boolean ChessCheck1 = false; boolean ChessCheck2 = false; boolean ChessCheck3 = false; boolean ChessCheck4 = false; boolean ChessCheck5 = false; boolean ChessCheck6 = false; boolean ChessCheck7 = false; boolean ChessCheck8 = false; //判断是谁下的棋 String mychess; String yourchess; if (chess == "○") { mychess = "○"; yourchess = "●"; } else { mychess = "●"; yourchess = "○"; } System.out.println("你是" + mychess + "棋,对方是" + yourchess + "棋"); //检查右边 System.out.println("检查右边"); if (Chess[i][j + 1].getText() != yourchess) { //System.out.println("右边第一个是我的棋子"); ChessCheck1 = false; } else { //向右移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向右移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); for (int m = 1; m < Max - j - 1; m++) { if (Chess[i][j + 1 + m].getText() == mychess)//如果是己方棋子 { //System.out.println("如果是己方棋子"); int n = 1; while (n <= m) { //System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i][j + n].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck1 = true; break; } else { ChessCheck1 = false; }//如果不是己方棋子,继续寻找 } } //检查左边 System.out.println("检查左边"); if (Chess[i][j - 1].getText() != yourchess) { ChessCheck2 = false; } else { //向左移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向左移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); //System.out.println("左移的时候列数从大到小"); for (int m = j - 2; m > 0; m--)//左移的时候列数从大到小 { //System.out.println("如果是己方棋子"); if (Chess[i][m].getText() == mychess)//如果是己方棋子 { int n = 0; while (n <= j - m - 1) { //System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i][j - n - 1].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck2 = true; break; } else { ChessCheck2 = false; }//如果不是己方棋子,继续寻找 } } //检查上方 System.out.println("检查上方"); if (Chess[i - 1][j].getText() != yourchess) { ChessCheck3 = false; } else { //向上移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向上移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); //System.out.println("上移的时候行数从大到小"); for (int m = i - 2; m > 0; m--)//上移的时候行数从大到小 { //System.out.println("如果是己方棋子" + m + Chess[m - 1][j].getText()); if (Chess[m][j].getText() == mychess)//如果是己方棋子 { int n = 0; while (n <= i - m - 1) {
//System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i - n - 1][j].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck3 = true; break; } else { ChessCheck3 = false; }//如果不是己方棋子,继续寻找 } } //检查下方 System.out.println("检查下方"); if (Chess[i + 1][j].getText() != yourchess) { //System.out.println("下方边第一个是我的棋子"); ChessCheck4 = false; } else {//向右移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向下移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); for (int m = 1; m < Max - i - 1; m++) { if (Chess[i + 1 + m][j].getText() == mychess)//如果是己方棋子 { //System.out.println("如果是己方棋子"); int n = 1; while (n <= m) { //System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i + n][j].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck4 = true; break; } else { ChessCheck4 = false; }//如果不是己方棋子,继续寻找 } } //上面已经完成对水平和垂直方向的检查过程,下面开始是些对角方向的检查 //检查右上角 System.out.println("检查右上角"); if (Chess[i - 1][j + 1].getText() != yourchess) { //System.out.println("右上角第一个是我的棋子"); ChessCheck5 = false; } else {//向右上移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向右上移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); int x = Max - j; int y = i; int m = 1; int tj; if (x > y) { tj = y - 2; } else { tj = x - 2; } while (m <= tj) { //System.out.println("寻找棋子" + m + tj); if (Chess[i - m - 1][j + 1 + m].getText() == mychess)//如果是己方棋子 { //System.out.println("如果是己方棋子" + Chess[i - m - 1][j + 1 + m].getText()); int n = 1; while (n <= m) { //System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i - n][j + n].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck5 = true; break; } else { ChessCheck5 = false; }//如果不是己方棋子,继续寻找 m++; } } //右下角 System.out.println("检查右下角"); if (Chess[i + 1][j + 1].getText() != yourchess) { //System.out.println("右下角第一个是我的棋子"); ChessCheck6 = false; } else {//向右下移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向右下移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); int m = 1; int tj; if (i > j) { tj = Max - i - 2; } else { tj = Max - j - 2; } while (m <= tj) { //System.out.println("寻找棋子" + m + tj); if (Chess[i + m + 1][j + 1 + m].getText() == mychess)//如果是己方棋子 { //System.out.println("如果是己方棋子" + Chess[i + m + 1][j + 1 + m].getText()); int n = 1; while (n <= m) { //System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i + n][j + n].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck6 = true; break; } else { ChessCheck6 = false; }//如果不是己方棋子,继续寻找 m++; }
} //左上角 System.out.println("检查左上角"); if (Chess[i - 1][j - 1].getText() != yourchess) { //System.out.println("左上角第一个是我的棋子"); ChessCheck7 = false; } else {//向左上移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向左上移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); int m = 1; int tj; if (i > j) { tj = j - 1; } else { tj = i - 1; } while (m <= tj) { //System.out.println("寻找棋子" + m + tj); if (Chess[i - m - 1][j - 1 - m].getText() == mychess)//如果是己方棋子 { //System.out.println("如果是己方棋子" + Chess[i - m - 1][j - 1 - m].getText()); int n = 1; while (n <= m) { //System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i - n][j - n].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck7 = true; break; } else { ChessCheck7 = false; }//如果不是己方棋子,继续寻找 m++; } } //左下角 System.out.println("检查左下角"); if (Chess[i + 1][j - 1].getText() != yourchess) { //System.out.println("左下角第一个是我的棋子"); ChessCheck8 = false; } else {//向左下移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false //System.out.println("向左下移动找出是否有自己的棋子,如果有则吃掉对方的子,否则返回false"); int x = j; int y = Max - i; int m = 1; int tj; if (x > y) { tj = y - 2; } else { tj = x - 2; } while (m <= tj) { //System.out.println("寻找棋子" + m + tj); if (Chess[i + m + 1][j - 1 - m].getText() == mychess)//如果是己方棋子 { //System.out.println("如果是己方棋子" + Chess[i + m + 1][j - 1 - m].getText()); int n = 1; while (n <= m) { //System.out.println("吃掉己方2颗棋子中间的对方棋子"); Chess[i + n][j - n].setText(mychess);//吃掉己方2颗棋子中间的对方棋子 n++; } ChessCheck8 = true; break; } else { ChessCheck8 = false; }//如果不是己方棋子,继续寻找 m++; } } //当前方是否落子 /* System.out.println("当前方是否落子1" + ChessCheck1 + "2" + ChessCheck2 + "3" + ChessCheck3 + "4" + ChessCheck4 + "5" + ChessCheck5 + "6" + ChessCheck6 + "7" + ChessCheck7 + "8" + ChessCheck8); */ //如果8个方向返回的都是false,即都不能落子,则返回false if (ChessCheck1 == true || ChessCheck2 == true || ChessCheck3 == true || ChessCheck4 == true || ChessCheck5 == true || ChessCheck6 == true || ChessCheck7 == true || ChessCheck8 == true) { ChessCheck = true; } else { ChessCheck = false; } return; // } //裁判模块 //通过计算棋盘上的双方棋子的数量判断胜负 public void WhoWin() { int p = 0, q = 0; for (int m = 1; m < Max - 1; m++) { for (int n = 1; n < Max - 1; n++) { if (Chess[m][n].getText() == "●") { p = p + 1; } if (Chess[m][n].getText() == "○") { q = q + 1; } } } //将int型转换成字符型并设置显示 Chess[0][1].setText(String.valueOf(p) ); Chess[0][Max - 1].setText(String.valueOf(q)); } } //面板重置 //将棋盘面板清空 class Reset { public Reset() { for (int X = 1; X < Max - 1; X++) { for(int Y=1;Y