双人五子棋的Java源代码

合集下载

java五子棋源代码

java五子棋源代码

package chess;import java.awt.Button;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;public class Chess extends JFrame implements MouseListener, Runnable { private static final long serialVersionUID = 1L;int width= Toolkit.getDefaultToolkit().getScreenSize().width;int hight =Toolkit.getDefaultToolkit().getScreenSize().height;// 背景图片BufferedImage bjImage = null;// 保存棋子坐标int x = 0;int y = 0;// 保存之前下过的棋子坐标// 其中数据:0:表示这个点没有棋子 1:表示黑子 2:表示白子int[][] allChess = new int[19][19];// 标识当前是黑棋还是白旗下下一步boolean isBlack = true;// 标识当前游戏是否可以继续boolean canPlay = true;// 保存显示的提示信息String message = "黑方先行";// 保存最多拥有多少时间(秒)int maxTime = 0;// 做倒计时的线程类Thread t = new Thread(this);// 保存黑方与白方的剩余时间int blackTime = 0;int whiteTime = 0;// 保存双方剩余时间的显示信息String blackMessage = "无限制";String whiteMessage = "无限制";@SuppressWarnings("deprecation")public Chess() {this.setTitle("五子棋");this.setSize(500, 500);this.setLocation((width - 500) / 2, (hight - 500) / 2);this.addMouseListener(this);// this.setResizable(false);this.setVisible(true);this.setLayout(null);t.start();t.suspend();// 线程挂起// 刚打开的时候刷新屏幕,防止开始游戏时无法显示的问题this.repaint();this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);try {bjImage = ImageIO.read(newFile("C:\\Users\\cwb\\Desktop\\timg.jpg"));} catch (IOException e) {e.printStackTrace();}}@Overridepublic void paint(Graphics g) {// 双缓存技术防止屏幕闪烁但不知道为什么,使用双缓存技术以后,效果特不好,所以没用,如果使用的话,下面的 g 改为 g2 就可以了//BufferedImage bi=new//BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);//Graphics g=bi.createGraphics();g.drawImage(bjImage, 0, 20, this);g.setFont(new Font("黑体", Font.BOLD, 20));g.drawString("游戏信息:" + message, 120, 60);g.setFont(new Font("宋体", 0, 14));g.drawString("黑方时间:" + blackMessage, 30, 470);g.drawString("白方时间:" + whiteMessage, 260, 470);g.drawString("开始游戏", 400,100);g.drawString("游戏设置", 400,150);g.drawString("游戏说明", 400,200);g.drawString("认输", 400,300);g.drawString("关于", 400,350);g.drawString("退出", 400,400);// 绘制棋盘for (int i = 0; i < 19; i++) {g.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);g.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430); }// 标注小圆点位g.fillOval(68, 128, 4, 4);g.fillOval(308, 128, 4, 4);g.fillOval(308, 368, 4, 4);g.fillOval(68, 368, 4, 4);g.fillOval(188, 128, 4, 4);g.fillOval(68, 248, 4, 4);g.fillOval(188, 368, 4, 4);g.fillOval(188, 248, 4, 4);g.fillOval(308, 248, 4, 4);// //绘制棋子// x=(x-10)/20*20+10; //是为了取得交叉点的坐标// y=(y-70)/20*20+70;// //黑子// g.fillOval(x-7, y-7, 14, 14);// //白子// g.setColor(Color.BLACK);// g.fillOval(x-7, y-7, 14, 14);// g.setColor(Color.BLACK);// g.drawOval(x-7, y-7, 14, 14);// 输出数组中所有数值// 绘制全部棋子for (int i = 0; i < 19; i++) {for (int j = 0; j < 19; j++) {if (allChess[i][j] == 1) {// 黑子int tempX = i * 20 + 10;int tempY = j * 20 + 70;g.fillOval(tempX-7, tempY-7 ,14, 14);}if (allChess[i][j] == 2) {// 白子int tempX = i * 20 + 10;int tempY = j * 20 + 70;g.setColor(Color.WHITE);g.fillOval(tempX- 7, tempY- 7, 14, 14);g.setColor(Color.BLACK);g.drawOval(tempX- 7, tempY- 7, 14, 14);}}}}@Overridepublic void mouseClicked(MouseEvent e) {}private boolean checkWin() {boolean flag = false;// 保存共有多少相同颜色棋子相连int count = 1;// 判断横向特点:allChess[x][y]中y值相同int color = allChess[x][y];// 判断横向count = this.checkCount(1, 0, color);if (count >= 5) {flag = true;} else {// 判断纵向count = this.checkCount(0, 1, color);if (count >= 5) {flag = true;} else {// 判断右上左下count = this.checkCount(1, -1, color);if (count >= 5) {flag = true;} else {// 判断左下右上count = this.checkCount(1, 1, color);if (count >= 5) {flag = true;}}}}return flag;}// 判断棋子连接数量private int checkCount(int xChange, int yChange, int color) { int count = 1;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 18 && y + yChange >= 0&& y + yChange <= 18&& color == allChess[x + xChange][y + yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}xChange = tempX;yChange = tempY;while (x - xChange >= 0 && x - xChange <= 18 && y - yChange >= 0&& y - yChange <= 18&& color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}return count;}@Overridepublic void mouseEntered(MouseEvent arg0) {}@Overridepublic void mouseExited(MouseEvent arg0) {}@SuppressWarnings("deprecation")@Overridepublic void mousePressed(MouseEvent e) {if (canPlay == true) {x = e.getX();y = e.getY();if (x >= 10 && x <= 370 && y >= 70 && y <= 430) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x - 10) / 20; // 是为了取得交叉点的坐标y = (y - 70) / 20;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋子if (isBlack == true) {allChess[x][y] = 1;isBlack = false;message = "轮到白方"; } else {allChess[x][y] = 2;isBlack = true;message = "轮到黑方"; }// 判断这个棋子是否和其他棋子连成5个boolean winFlag =this.checkWin();if (winFlag == true) { JOptionPane.showMessageDialog(this, "游戏结束,"+ (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");canPlay = false;}} else {JOptionPane.showMessageDialog(this, "当前位子已经有棋子,请重新落子!!!");}this.repaint();}}// 点击开始游戏按钮if(e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 70 && e.getY() <= 100) {int result =JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");if (result == 0) {// 现在重新开始游戏// 重新开始所要做的操作:1)把棋盘清空,allChess数组中全部数据归0;// 2)游戏相关信息显示初始化// 3)将下一步下棋改为黑方for (int i = 0; i < 19; i++) {for (int j = 0; j < 19; j++) {allChess[i][j] = 0; }}// 另一种方式 allChess=newint[19][19]message = "黑方先行";isBlack = true;blackTime = maxTime;whiteTime = maxTime;if (maxTime > 0) {blackMessage= maxTime/ 3600 +":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);whiteMessage= maxTime/ 3600 + ":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);t.resume();} else {blackMessage = "无限制";whiteMessage = "无限制";}this.repaint();// 如果不重新调用,则界面不会刷新}}// 点击游戏设置按钮if(e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 120 && e.getY() <= 150) {String input = JOptionPane.showInputDialog("请输入游戏的最多时间(单位:分钟),如果输入0 ,表示没有时间限制");try {maxTime= Integer.parseInt(input) * 60;if (maxTime < 0) {JOptionPane.showMessageDialog(this, "请正确提示信息,不允许输入负数"); }if (maxTime == 0) {int result =JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if (result == 0) {// 现在重新开始游戏// 重新开始所要做的操作:1)把棋盘清空,allChess数组中全部数据归0;// 2)游戏相关信息显示初始化// 3)将下一步下棋改为黑方for(int i= 0; i< 19; i++) {for(int j= 0; j < 19; j++) {allChess[i][j] = 0;}}// 另一种方式allChess=new int[19][19]message = "黑方先行";isBlack = true;blackTime = maxTime;whiteTime = maxTime;blackMessage= "无限制";whiteMessage= "无限制";this.repaint();// 如果不重新调用,则界面不会刷新}}if (maxTime > 0) {int result =JOptionPane.showConfirmDialog(this,"设置完成,是否重新开始游戏?");if (result == 0) {// 现在重新开始游戏// 重新开始所要做的操作:1)把棋盘清空,allChess数组中全部数据归0;// 2)游戏相关信息显示初始化// 3)将下一步下棋改为黑方for(int i= 0; i< 19; i++) {for(int j= 0; j < 19; j++) {allChess[i][j] = 0;}}// 另一种方式allChess=new int[19][19]message = "黑方先行";isBlack = true;blackTime = maxTime;whiteTime = maxTime;blackMessage= maxTime / 3600 + ":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);whiteMessage= maxTime / 3600 + ":"+ (maxTime / 60 - maxTime / 3600 * 60) + ":"+ (maxTime - maxTime / 60 * 60);t.resume();this.repaint();// 如果不重新调用,则界面不会刷新}}} catch (NumberFormatException e1) {JOptionPane.showMessageDialog(this, "请正确提示信息");}}// 点击游戏说明按钮if(e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 170 && e.getY() <= 200) {JOptionPane.showMessageDialog(this,"这是一个五子棋游戏程序,黑白双方轮流下棋,当某一方连到五子时,游戏结束。

双人五子棋的Java源代码

双人五子棋的Java源代码

第一个文件:import javax.swing.*;import java.awt.event.*;import java.awt.*;/*五子棋-主框架类, 程序启动类*/public class StartChessJFrame extends JFrame {private ChessBoard chessBoard;//对战面板private JPanel toolbar;//工具条面板private JButton startButton, backButton, exitButton;//重新开始按钮,悔棋按钮,和退出按钮private JMenuBar menuBar;//菜单栏private JMenu sysMenu;//系统菜单private JMenuItem startMenuItem, exitMenuItem, backMenuItem;//重新开始,退出,和悔棋菜单项public StartChessJFrame() {setTitle("单机版五子棋");//设置标题chessBoard = new ChessBoard();//初始化面板对象// 创建和添加菜单menuBar = new JMenuBar();//初始化菜单栏sysMenu = new JMenu("系统");//初始化菜单startMenuItem = new JMenuItem("重新开始");exitMenuItem = new JMenuItem("退出");backMenuItem = new JMenuItem("悔棋");//初始化菜单项sysMenu.add(startMenuItem);//将三个菜单项添加到菜单上sysMenu.add(backMenuItem);sysMenu.add(exitMenuItem);MyItemListener lis = new MyItemListener();//初始化按钮事件监听器内部类this.startMenuItem.addActionListener(lis);//将三个菜单项注册到事件监听器上backMenuItem.addActionListener(lis);exitMenuItem.addActionListener(lis);menuBar.add(sysMenu);//将系统菜单添加到菜单栏上setJMenuBar(menuBar);// 将menuBar设置为菜单栏toolbar = new JPanel();//工具面板栏实例化startButton = new JButton("重新开始");//三个按钮初始化backButton = new JButton("悔棋");exitButton = new JButton("退出");toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//将工具面板按钮用FlowLayout布局toolbar.add(startButton);//将三个按钮添加到工具面板上toolbar.add(backButton);toolbar.add(exitButton);startButton.addActionListener(lis);//将三个按钮注册监听事件backButton.addActionListener(lis);exitButton.addActionListener(lis);add(toolbar, BorderLayout.SOUTH);//将工具面板布局到界面"南"方也就是下面add(chessBoard);//将面板对象添加到窗体上setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置界面关闭事件//setSize(800,800);pack(); // 自适应大小}private class MyItemListener implements ActionListener {//事件监听器内部类public void actionPerformed(ActionEvent e) {Object obj = e.getSource(); // 取得事件源if (obj == StartChessJFrame.this.startMenuItem || obj == startButton) {// 重新开始// JFiveFrame.this内部类引用外部类System.out.println("重新开始...");chessBoard.restartGame();} else if (obj == exitMenuItem || obj == exitButton) {System.exit(0); // 结束应用程序} else if (obj == backMenuItem || obj == backButton) { // 悔棋System.out.println("悔棋...");chessBoard.goback();}}}public static void main(String[] args) {StartChessJFrame f = new StartChessJFrame(); // 创建主框架f.setVisible(true); // 显示主框架}}第二个文件:import java.awt.Color;/*五子棋的棋子设计。

五子棋源代码-Java_Applet小程序

五子棋源代码-Java_Applet小程序

五子棋源代码-Java_Applet小程序importjava.applet.Applet; importjava.awt.*;importjava.util.Random;public class wzq extends Applet implements Runnable{public void stop(){LoopThread = null;}privateintCalcZi(inti, int j, byte byte0){CXY cxy = new CXY(); int k = 0;int l = 0;do{int i1 = 0;int j1 = 0;do{cxy.x = i;cxy.y = j;if(MoveAGrid(cxy, l + 4 * j1) &&QiPan[cxy.x][cxy.y] == byte0) do{ if(QiPan[cxy.x][cxy.y] == 0 || QiPan[cxy.x][cxy.y] != byte0) break;i1++;} while(MoveAGrid(cxy, l + 4 * j1));}while(++j1 < 2);if(i1 > k)k = i1;}while(++l < 4);return ++k;}privatebooleanCanDo(){return steps < ((GRIDSUM * GRIDSUM) / 100) * 80;}//电脑下棋privateintCPUDo(CXY cxy, byte byte0){intai[] = new int[2];int ai1[] = new int[2];int ai2[] = new int[2];boolean flag = false;EnterTimes++;ai2[0] = 0;for(inti = recLU.x; i<= recRD.x; i++){for(int k = recLU.y; k <= recRD.y; k++){int l = 0;if(QiPan[i][k] == 0){DoAStep(i, k, byte0);l = CalcCPU(i, k, byte0);}if(l > 0){int i1 = 0;byte byte1;if(byte0 == 1)byte1 = 2; elsebyte1 = 1; if(EnterTimes<= level && steps < ((GRIDSUM * GRIDSUM) / 100) * 80)i1 = CPUDo(cxy, byte1);l += i1;if(l + Math.abs(rd.nextInt()) % 5 > ai2[0] || !flag){ai[0] = i;ai1[0] = k;ai2[0] = l;flag = true;}QiPan[i][k] = 0;}}}if(EnterTimes<= 1){cxy.x = ai[0];cxy.y = ai1[0];int j = 0;do{try{Thread.sleep(300L);}catch(InterruptedException _ex) { } QiPan[cxy.x][cxy.y] = byte0;repaint();try{Thread.sleep(300L);}catch(InterruptedException _ex) { } QiPan[cxy.x][cxy.y] = 0; repaint(); }while(++j < 2);}EnterTimes--;return ai2[0];}public void ClearPan(){for(inti = 0; i< GRIDSUM; i++){for(int j = 0; j < GRIDSUM; j++) QiPan[i][j] = 0;}scHong = 0;scHei = 0;steps = 0;recLU.x = 8;recRD.x = 9;recLU.y = 8;recRD.y = 9;}privatebooleanMoveAGrid(CXY cxy, inti){boolean flag = false;i %= 8;int j = cxy.x + oAdd[i][0]; int k = cxy.y + oAdd[i][1]; if(j >= 0 && j < GRIDSUM && k >= 0 && k < GRIDSUM){cxy.x = j;cxy.y = k;flag = true;}return flag;}public void paint(Graphics g){super.paint(g);for(inti = 0; i< GRIDSUM + 1; i++){g.drawLine(0, i * GRIDWIDTH, GRIDSUM * GRIDWIDTH, i * GRIDWIDTH);g.drawLine(i * GRIDWIDTH, 0, i * GRIDWIDTH, GRIDSUM * GRIDWIDTH);}for(int j = 0; j < GRIDSUM; j++){for(int k = 0; k < GRIDSUM; k++) drawQi(g, j, k, QiPan[j][k]);}}private void CPUInit(){PosAdd[0][0] = 8;PosAdd[0][1] = -2;PosAdd[1][0] = -2;PosAdd[0][2] = 3;PosAdd[2][0] = 3;PosAdd[0][3] = 2;PosAdd[3][0] = 2; PosAdd[1][1] = -7; PosAdd[1][2] = -1; PosAdd[2][1] = -1; PosAdd[1][3] = -1; PosAdd[3][1] = -1;PosAdd[2][2] = 4; PosAdd[3][3] = 4; PosAdd[2][3] = 4; PosAdd[3][2] = 4;}public void mouseDOWNThis(Event event){if(playerdo)xiazi.put(event.x, event.y);}privateintDoAStep(inti, int j, byte byte0){if(QiPan[i][j] != 0 || byte0 == 0 || byte0 > 2){return 0;}else{QiPan[i][j] = byte0; return 1;}}private void FreshRec(inti, int j){if(i - recLU.x< 2){recLU.x = i - 2;if(recLU.x< 0)recLU.x = 0;}if(recRD.x - i< 2){recRD.x = i + 2;if(recRD.x>= GRIDSUM) recRD.x = GRIDSUM - 1; }if(j - recLU.y< 2){recLU.y = j - 2;if(recLU.y< 0)recLU.y = 0;}if(recRD.y - j < 2){recRD.y = j + 2;if(recRD.y>= GRIDSUM) recRD.y = GRIDSUM - 1;}}publicwzq(){GRIDWIDTH = 18;GRIDSUM = 18; QiPan = new byte[GRIDSUM][GRIDSUM];oAdd = new int[8][2]; playing = false;playerdo = true;xy = new CXY();xiazi = new CXiaZi(); rd = new Random(); recLU = new CXY(); recRD = new CXY(); PosAdd = new int[4][4];}public void update(Graphics g){paint(g);}//画棋public void drawQi(Graphics g, inti, int j, int k){switch(k){case 0: // '\0'g.clearRect(i * GRIDWIDTH + 1, j * GRIDWIDTH + 1, GRIDWIDTH -2,GRIDWIDTH - 2);return;case 1: // '\001'g.setColor(Color.red);g.fillArc(i * GRIDWIDTH + 2, j * GRIDWIDTH + 2, GRIDWIDTH -4,GRIDWIDTH - 4, 0, 360);return;case 2: // '\002'g.setColor(Color.black);break;}g.fillArc(i * GRIDWIDTH + 2, j * GRIDWIDTH + 2, GRIDWIDTH -4,GRIDWIDTH - 4, 0, 360);}public void start(){if(LoopThread == null)LoopThread = new Thread(this, "wbqloop"); LoopThread.setPriority(1);LoopThread.start();}public void run(){for(; Thread.currentThread() == LoopThread; xiazi.get(xy)) {ClearPan();repaint();playing = true;//谁先下随机who = (byte)(Math.abs(rd.nextInt()) % 2 + 1); for(passes = 0; playing && passes < 2;){if(who == 1){lblStatus.setText("\u7EA2\u65B9\u4E0B");lblStatus.setForeground(Color.red);}else{lblStatus.setText("\u9ED1\u65B9\u4E0B");lblStatus.setForeground(Color.black);}if(steps < ((GRIDSUM * GRIDSUM) / 100) * 80){passes = 0;if(who == 1) //人下棋{xiazi.get(xy);for(; DoAStep(xy.x, xy.y, who) == 0; xiazi.get(xy)); scHong = CalcZi(xy.x, xy.y, who); FreshRec(xy.x, xy.y); steps++;}else //机器下棋{if(scHong == 0 &&scHei == 0){ xy.x = 9;xy.y = 9;} else{ CPUDo(xy, who);} for(; DoAStep(xy.x, xy.y, who) == 0; CPUDo(xy, who)); scHei = CalcZi(xy.x, xy.y, who); FreshRec(xy.x, xy.y); steps++;}}else{passes = 2;}if(scHong>= 5 || scHei>= 5) playing = false; repaint();//交换下棋方who = (byte)((1 - (who - 1)) + 1); Thread.yield(); }if(scHong>= 5) //红方胜{Status = "\u7EA2\u65B9\u80DC!";lblStatus.setForeground(Color.red); LoseTimes++; }else if(scHei>= 5)//黑方胜{Status = "\u9ED1\u65B9\u80DC!";lblStatus.setForeground(Color.black);if(LoseTimes> 0)LoseTimes--;}else //平局{Status = "\u4E0D\u5206\u80DC\u8D1F!";}lblStatus.setText(Status); repaint();}}//入口,开始下棋,初始化public void init() {super.init(); LoopThread = null; oAdd[0][0] = 0; oAdd[0][1] = -1; oAdd[1][0] = 1; oAdd[1][1] = -1; oAdd[2][0] = 1; oAdd[2][1] = 0; oAdd[3][0] = 1; oAdd[3][1] = 1; oAdd[4][0] = 0; oAdd[4][1] = 1; oAdd[5][0] = -1; oAdd[5][1] = 1; oAdd[6][0] = -1; oAdd[6][1] = 0; oAdd[7][0] = -1; oAdd[7][1] = -1; CPUInit();setLayout(null);resize(325, 352);lblStatus = new Label("Welcome"); lblStatus.setFont(new Font("Dialog", 1, 14));add(lblStatus);lblStatus.reshape(14, 332, 175, 15);lblLevel = new Label("JAVA\u4E94\u5B50\u68CB");lblLevel.setFont(new Font("Dialog", 1, 14));add(lblLevel);lblLevel.reshape(196, 332, 119, 15);}publicbooleanhandleEvent(Event event){if(event.id != 501 || event.target != this){returnsuper.handleEvent(event);}else{mouseDOWNThis(event);return true;}}privateintCalcCPU(inti, int j, byte byte0){CXY cxy = new CXY();String s = "";String s2 = "";String s4 = ""; byte byte1 = 0;CalcTimes++;if(byte0 == 1)byte1 = 2; elseif(byte0 == 2)byte1 = 1; int k = 0;int l = 0;do{int i1 = 0;String s1 = "";String s3 = "";String s5 = ""; int j1 = 0;do{int k1 = 0;cxy.x = i;for(cxy.y = j; MoveAGrid(cxy, l + 4 * j1) && k1 < 6 &&QiPan[cxy.x][cxy.y] != byte1; k1++) if(QiPan[cxy.x][cxy.y] == byte0) {if(j1 == 0)s3 += "1"; elses5 = "1" + s5; i1++;}elseif(j1 == 0)s3 += "0"; elses5 = "0" + s5;if(j1 == 0)s3 += "2";elses5 = "2" + s5;}while(++j1 < 2);i1++;s1 = s5 + "1" + s3;if(s1.indexOf("11111") != -1)i1 += 1000;elseif(s1.indexOf("011110") != -1)i1 += 500;elseif(s1.indexOf("211110") != -1 || s1.indexOf("011112") != -1 || s1.indexOf("01110") != -1 || s1.indexOf("01110") != -1 ||s1.indexOf("011010")!= -1 || s1.indexOf("010110") != -1 || s1.indexOf("11101") != -1 || s1.indexOf("10111") != -1 ||s1.indexOf("11011") != -1)i1 += 100;elseif(s1.indexOf("21110") != -1 || s1.indexOf("01112") != -1 ||s1.indexOf("0110") != -1 || s1.indexOf("211010") != -1 ||s1.indexOf("210110")!= -1)i1 += 20;if(l == 1 || l == 3)i1 += (i1 * 20) / 100;k += i1;}while(++l < 4); if(CalcTimes<= 1)k += CalcCPU(i, j, byte1);elseif(k > 10)k -= 10; CalcTimes--;return k;}int GRIDWIDTH; //网格宽度int GRIDSUM; //网格总数byte QiPan[][]; //棋盘intoAdd[][];Thread LoopThread;intscHong; //红方intscHei; //黑方byte who; //byte winner; //赢方boolean playing; booleanplayerdo; CXY xy;CXiaZixiazi; //下子String Status; //状态Random rd; //随机数 int passes;int steps;intLoseTimes;CXY recLU;CXY recRD; intPosAdd[][]; int level; intEnterTimes; intCalcTimes;Label lblStatus;Label lblLevel; }classCXiaZi{public synchronized void get(CXY cxy) {ready = false;notify();while(!ready)try{wait();}catch(InterruptedException _ex) { }ready = false;notify();cxy.x = xy.x;cxy.y = xy.y;}public synchronized void put(inti, int j){if(i< GRIDWIDTH * GRIDSUM && j < GRIDWIDTH * GRIDSUM) {xy.x = i / GRIDWIDTH; xy.y = j / GRIDWIDTH; ready = true; notify();}}publicCXiaZi(){GRIDWIDTH = 18;GRIDSUM = 18; xy = new CXY();ready = false;}private CXY xy;privateboolean ready; privateint GRIDWIDTH; privateint GRIDSUM; } class CXY{public CXY(){x = 0;y = 0;}publicint x; publicint y; }内部资料,请勿外传~。

联机版五子棋Java算法(附测试)

联机版五子棋Java算法(附测试)
frame.addMouseListener(this);
frame.setVisible(true);
}
//棋盘界面实现方法
publicvoidpaintComponent(Graphics g) {
//画棋盘网格
for(intx = boardX; x <= boardSize + boardX; x += distance) {
if(border[pointX][pointY] == 1) {
JOptionPane.showMessageDialog(frame, "黑棋获胜!");
}else{
JOptionPane.showMessageDialog(frame, "白棋获胜!");
}
for(intx = 0; x < amount; x++) {
*
*@authorJulian
*/
publicclassFiveClientextendsJPanelimplementsMouseListener, Runnable {
privateJFrame frame;//主界面
privateintamount = 16;//设置棋盘划分网格数
privateintdistance = 30;//设置棋盘网格大小
locationY = (Toolkit.getDefaultToolkit().getScreenSize().height - frame
.getHeight()) / 2;
frame.setLocation(locationX, locationY);
frame.add(this);

java开发实现五子棋游戏

java开发实现五子棋游戏

java开发实现五⼦棋游戏本⽂实例为⼤家分享了java实现五⼦棋游戏的具体代码,供⼤家参考,具体内容如下此游戏具有双⼈对战功能和⼈机对战功能⼀、游戏界⾯的实现⼀个游戏⾸先从设计界⾯开始1、⾸先创建⼀个类,作⽤是通过对窗体组件的⼀些设置来实现简单游戏界⾯public void gameUI(){//窗体组件MyFrame jf = new MyFrame();jf.setSize(900, 800);jf.setTitle("冷丁-五⼦棋");//居中显⽰jf.setLocationRelativeTo(null);//设置退出进程jf.setDefaultCloseOperation(3);//流式布局管理器FlowLayout flow=new FlowLayout();jf.setLayout(flow);//边框布局BorderLayout border=new BorderLayout();jf.setLayout(border);//⾯板: JPanel 默认流式布局JPanel eastPanel=new JPanel();Dimension dm=new Dimension(100,0);//除了JFrame,其他组件设置⼤⼩都是该⽅法eastPanel.setPreferredSize(dm);jf.add(eastPanel,BorderLayout.EAST);}2、加⼊功能按钮JButton jbu=new JButton("开始");eastPanel.add(jbu,BorderLayout.EAST);JButton jbu2=new JButton("悔棋");eastPanel.add(jbu2,BorderLayout.EAST);JButton jbu3=new JButton("认输");eastPanel.add(jbu3,BorderLayout.EAST);JButton jbu4=new JButton("⼈机对战");eastPanel.add(jbu4,BorderLayout.EAST);//设置窗体可见jf.setVisible(true);每个按钮添加ActionListner监听jbu.addActionListener(mouse);jbu2.addActionListener(mouse);jbu3.addActionListener(mouse);jbu4.addActionListener(mouse);在GameMouse类中对过对actionPerformed⽅法的重新来判断当前是哪个按钮按下,并实现对应的功能public void actionPerformed(ActionEvent e) {//获取按钮上的内容String name=e.getActionCommand();System.out.println("点击按钮:"+name);if(name.equals("开始")){jf.removeMouseListener(this);jf.addMouseListener(this);startflag=false;flag=false;gameOver=false;for(int i=0;i<15;i++){for(int j=0;j<15;j++){}jf.paint(gr);}else if(name.equals("悔棋")){arrChess[nowx][nowy]=0;jf.paint(gr);this.flag=!this.flag;}else if(name.equals("认输")){if(this.flag){gr.setColor(Color.red);gr.setFont(new Font("TimesRoman", Font.BOLD, 50));gr.drawString("⿊⽅获胜!",300,300);}else{gr.setColor(Color.red);gr.setFont(new Font("TimesRoman", Font.BOLD, 50));gr.drawString("⽩⽅获胜!",300,300);}}else if(name.equals("⼈机对战")){jf.removeMouseListener(this);jf.addMouseListener(this);startflag=false;flag=false;gameOver=false;for(int i=0;i<15;i++){for(int j=0;j<15;j++){arrChess[i][j]=0;}}this.aiflag=true;jf.paint(gr);}}3、游戏效果是通过画笔画在组件上实现的,获取画笔:图形显⽰在哪个组件上,画笔就从该组件上获取。

五子棋人机对弈JAVA源代码(PlayerVsPC)

五子棋人机对弈JAVA源代码(PlayerVsPC)

package resource;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.Toolkit;import java.awt.Dimension;import javax.swing.JColorChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;public class PlayerVsPC {private JFrame frame; //整个窗口private JMenuBar bar; //菜单栏private JMenuItem[][] jit;//菜单项数组private JMenuItem[] mode;//模式项数组private JMenu[] jm; //菜单public boolean isBlack; //是否为黑方下子状态private int[][] qipan; //棋盘数组private int row; //当前行private int col; //当前列private int prow;private int pcol;private Color c=new Color(145,125,62); //棋盘背景颜色private DrawPanel panel; //棋盘面板private JLabel label; //棋盘上方的标签private JPanel panel0; //棋盘上方条形面板private boolean isEnd;private int[][] qixingPC;private int[][] qixingPlayer;private boolean isPC = true; //记录当前下棋模式private boolean cMode = true; //记录选择的对弈模式public PlayerVsPC(){frame=new JFrame("五子棋游戏");bar=new JMenuBar();jm=new JMenu[2];jit=new JMenuItem[2][];qipan=new int[19][19];qixingPC = new int[17][17];qixingPlayer = new int[17][17];for(int i=0;i<19;i++){for(int j=0;j<19;j++){qipan[i][j]=0;}}for(int i=0;i<17;i++){for(int j=0;j<17;j++){qixingPC[i][j]=0;qixingPlayer[i][j]=0;}}label = new JLabel("人"+(isPC?"机":"人")+"对弈模式,请按开局开始游戏!");panel0=new JPanel();addItems();addEventAction();printqipan(0,0);}public void addItems(){jm[0]=new JMenu("游戏");jm[1]=new JMenu("选项");jit[0]=new JMenuItem[3];jit[0][0]=new JMenuItem("开局");jit[0][1]=new JMenuItem("重新开始");jit[0][2]=new JMenuItem("结束游戏");jit[1]=new JMenuItem[3];jit[1][0]=new JMenu("对弈模式");mode=new JMenuItem[2];mode[0] = new JMenuItem("人人对弈");mode[1] = new JMenuItem("人机对弈");jit[1][0].add(mode[0]);jit[1][0].add(mode[1]);jit[1][1]=new JMenuItem("悔棋");jit[1][2]=new JMenuItem("背景颜色");for(int i=0;i<jm.length;i++){for(int j=0;j<jit[i].length;j++){jm[i].add(jit[i][j]);}}panel0.add(label);bar.add(jm[0]);bar.add(jm[1]);frame.setJMenuBar(bar);frame.add(panel0,"North");}//给菜单项设定事件public void addEventAction(){jit[0][0].addActionListener(new ActionListener(){ //开局public void actionPerformed(ActionEvent e) {row=prow=0;col=pcol=0;isPC=cMode;isBlack = true;isEnd = false;for(int i=0;i<19;i++){for(int j=0;j<19;j++){if(i==0||j==0||i==(qipan.length-1)||j==(qipan.length-1)){qipan[i][j] = -1;}else{qipan[i][j]=0;}}}if(isPC){ //人机对弈模式label.setText("游戏开始,请玩家先下棋!");}else{ //人人对弈模式label.setText("游戏开始,请"+(isBlack?"黑":"白")+"方先下棋!");}printqipan(row,col);addEventHandler();}});jit[0][1].addActionListener(new ActionListener(){ //重新开始public void actionPerformed(ActionEvent e) {row=prow=0;col=pcol=0;isBlack = true;isEnd = false;for(int i=0;i<19;i++){for(int j=0;j<19;j++){if(i==0||j==0||i==(qipan.length-1)||j==(qipan.length-1)){qipan[i][j] = -1;}else{qipan[i][j]=0;}}}if(isPC){ //人机对弈模式label.setText("游戏开始,请玩家先下棋!");}else{ //人人对弈模式label.setText("游戏开始,请"+(isBlack?"黑":"白")+"方先下棋!");}printqipan(row,col);addEventHandler();}});//给模式选项添加事件监听mode[0].addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {cMode = false;label.setText("已选择人"+(cMode?"机":"人")+"对弈模式,重新开局将生效!");}});mode[1].addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {cMode = true;label.setText("已选择人"+(cMode?"机":"人")+"对弈模式,重新开局将生效!");}});jit[0][2].addActionListener(new ActionListener(){ //结束游戏public void actionPerformed(ActionEvent e) {label.setText("游戏结束,请按开局开始游戏!");isEnd=true;}});jit[1][1].addActionListener(new ActionListener(){ //悔棋public void actionPerformed(ActionEvent e) {if(!isPC){huiqi();}else{pchuiqi();}}});jit[1][2].addActionListener(new ActionListener() { //背景颜色public void actionPerformed(ActionEvent e) {Color cc=JColorChooser.showDialog(frame,"棋盘背景颜色",new Color(226,189,0));if(cc!=null){c=cc;panel.setBackground(c);}}});}// 监听鼠标事件,下棋以及判断本盘是否结束,电脑是白方,玩家是黑方public void addEventHandler(){panel.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e) {if(!isEnd){int x=(e.getX()-5)/30;int y=(e.getY()-5)/30;if(qipan[y+1][x+1]==0){load(x+1,y+1);}else{label.setText("此处已经有棋子,请重新下子!");}}}});}//电脑下棋public void pcLoad(){qixing();int count = 0;int hang = 0;int lie = 0;for(int i=0;i<17;i++){for(int j=0;j<17;j++){if(qixingPC[i][j]>count){count = qixingPC[i][j];hang = i+1;lie = j+1;}if(qixingPlayer[i][j]>count){count = qixingPlayer[i][j];hang = i+1;lie = j+1;}}}if(qipan[hang][lie]==0){load(lie,hang);return;}}//下棋子public void load(int x,int y){col=x;row=y;if(isBlack){prow=row;pcol=col;qipan[row][col]=1;isBlack = false;}else{qipan[row][col]=2;isBlack = true;}printqipan(row,col);if(panduan(row-1,col-1)){if(isPC){label.setText("本局结束,恭喜"+(isBlack?"电脑":"玩家")+"获胜!");isEnd = true;}else{label.setText("本局结束,恭喜"+(isBlack?"黑":"白")+"方获胜!");isEnd = true;}}else{if(isPC){label.setText((isBlack?"电脑":"玩家")+"在("+row+":"+col+")处下子,"+"现在"+(isBlack?"玩家":"电脑")+"下子!");}else{label.setText((isBlack?"白":"黑")+"方在("+row+":"+col+")处下子,"+"现在"+(isBlack?"黑":"白")+"下子!");}if(!isBlack){if(isPC){pcLoad();}}}}//刷新棋盘public void printqipan(int n,int m){panel=new DrawPanel(qipan,n,m);panel.setBackground(c);frame.add(panel,"Center");}//人人对弈悔棋public void huiqi(){if(isEnd){label.setText("游戏已经结束不能悔棋,请重新开局!");return;}isBlack=!isBlack;qipan[row][col]=0;printqipan(row,col);label.setText((isBlack?"黑":"白")+"方悔棋,请重新下棋!");}//人机对弈悔棋public void pchuiqi(){if(isEnd){label.setText("游戏已经结束不能悔棋,请重新开局!");return;}qipan[row][col]=0;qipan[prow][pcol]=0;printqipan(row,col);label.setText((isBlack?"玩家":"电脑")+"悔棋,请重新下棋!");}//算出双方的棋形数组public void qixing(){for(int i=0;i<17;i++){for(int j=0;j<17;j++){if(qipan[i+1][j+1]==0){//说明此处没有棋子qixingPC[i][j] = heiheng(i,j,2)+heishu(i,j,2)+heizuoxie(i,j,2)+heiyouxie(i,j,2);qixingPlayer[i][j] = heiheng(i,j,1)+heishu(i,j,1)+heizuoxie(i,j,1)+heiyouxie(i,j,1);}else{qixingPC[i][j] = 0;qixingPlayer[i][j] = 0;}}}}// 算出黑子横方向的棋型数值public int heiheng(int hang,int lie,int num){int k = 0;//记录空白处的个数int count = 1;//记录可以形成几连int n = hang+1;//对应棋盘的行int m = lie+1;//对应棋盘的列boolean left = false;//判断左边是否有黑子boolean liveLeft = false;//判断左边是活还是死boolean liveRight = false;//判断右边是活还是死while((qipan[n][m-1]!=-1)&&(qipan[n][m-1]==num||qipan[n][m-1]==0)){if(qipan[n][m-1]==0&&k<1){//第一个空白if(qipan[n][m-2]!=num){liveLeft = true;break;}k++;m--;}else if(qipan[n][m-1]==num){//黑子left = true;m--;}else{//第二个空白liveLeft = true;break;}}if(!left){m = lie+1;}while((qipan[n][m+1]!=-1)&&(qipan[n][m+1]==num||qipan[n][m+1]==0)){ int t = qipan[n][m+1];if(m==lie){count++;m++;continue;}if(t==0&&k<1){//第一个空白if(qipan[n][m+2]!=num){liveRight = true;break;}k++;m++;}else if(t==0&&k>0){//第二个空白liveRight = true;break;}else{//黑子m++;count++;}}return jieguo(liveLeft,liveRight,count,k,num);}// 算出黑子竖方向的棋型数值public int heishu(int hang,int lie,int num){int k = 0;//记录空白处的个数int count = 1;//记录可以形成几连int n = hang+1;//对应棋盘的行int m = lie+1;//对应棋盘的列boolean top = false;//判断上边是否有黑子boolean liveLeft = false;boolean liveRight = false;while((qipan[n-1][m]!=-1)&&(qipan[n-1][m]==num||qipan[n-1][m]==0)){ if(qipan[n-1][m]==0&&k<1){//第一个空白if(qipan[n-2][m]!=num){liveLeft = true;break;}k++;}else if(qipan[n-1][m]==num){//黑子top = true;n--;}else{//第二个空白liveLeft = true;break;}}if(!top){k = 0;n = hang+1;}while((qipan[n+1][m]!=-1)&&(qipan[n+1][m]==num||qipan[n+1][m]==0)){ int t = qipan[n+1][m];if(n==hang){count++;n++;continue;}if(t==0&&k<1){//第一个空白if(qipan[n+2][m]!=num){liveRight = true;break;}k++;n++;}else if(t==0&&k>0){//第二个空白liveRight = true;break;}else{//黑子n++;count++;}}//return jieguo(k==0,count);return jieguo(liveLeft,liveRight,count,k,num);}// 算出黑子左斜方向的棋型数值public int heizuoxie(int hang,int lie,int num){int k = 0;//记录空白处的个数int count = 1;//记录可以形成几连int n = hang+1;//对应棋盘的行int m = lie+1;//对应棋盘的列boolean top = false;//判断上边是否有黑子boolean liveLeft = false;boolean liveRight = false;while((qipan[n+1][m-1]!=-1)&&(qipan[n+1][m-1]==num||qipan[n+1][m-1]==0)){ if(qipan[n+1][m-1]==0&&k<1){//第一个空白if(qipan[n+2][m-2]!=num){liveLeft = true;break;}k++;n++;m--;}else if(qipan[n+1][m-1]==num){//黑子top = true;n++;m--;}else{//第二个空白liveLeft = true;break;}}if(!top){k = 0;n = hang+1;m = lie+1;}while((qipan[n-1][m+1]!=-1)&&(qipan[n-1][m+1]==num||qipan[n-1][m+1]==0)){ int t = qipan[n-1][m+1];if(n==(hang+2)&&m==lie){count++;n--;m++;continue;}if(t==0&&k<1){//第一个空白if(qipan[n-2][m+2]!=num){liveRight = true;break;}k++;n--;m++;}else if(t==0&&k>0){//第二个空白liveRight = true;break;}else{//黑子n--;m++;count++;}}return jieguo(liveLeft,liveRight,count,k,num);}// 算出黑子右斜方向的棋型数值public int heiyouxie(int hang,int lie,int num){int k = 0;//记录空白处的个数int count = 1;//记录可以形成几连int n = hang+1;//对应棋盘的行int m = lie+1;//对应棋盘的列boolean top = false;//判断上边是否有黑子boolean liveLeft = false;boolean liveRight = false;while((qipan[n-1][m-1]!=-1)&&(qipan[n-1][m-1]==num||qipan[n-1][m-1]==0)){ if(qipan[n-1][m-1]==0&&k<1){//第一个空白if(qipan[n-2][m-2]!=num){liveLeft = true;break;}k++;n--;m--;}else if(qipan[n-1][m-1]==num){//黑子top = true;n--;m--;}else{//第二个空白liveLeft = true;break;}}if(!top){k = 0;n = hang+1;m = lie+1;}while((qipan[n+1][m+1]!=-1)&&(qipan[n+1][m+1]==num||qipan[n+1][m+1]==0)){int t = qipan[n+1][m+1];if(n==hang&&m==lie){count++;n++;m++;continue;}if(t==0&&k<1){//第一个空白if(qipan[n+2][m+2]!=num){liveRight = true;break;}k++;n++;m++;}else if(t==0&&k>0){//第二个空白liveRight = true;break;}else{//黑子n++;m++;count++;}}return jieguo(liveLeft,liveRight,count,k,num);}public int jieguo(boolean left,boolean right,int count,int k,int num){ if(count==1){return 0;}else if(count==2){if(left&&right){if(k==0){if(num==2){return 60;}else{return 50;}}else{if(num==2){return 40;}else{return 35;}}}else if(!left&&!right){return 0;}else{return 10;}}else if(count==3){if(left&&right){if(k==0){if(num==2){return 950;}else{return 700;}}else{if(num==2){return 900;}else{return 650;}}}else if(!left&&!right){return 0;}else{return 100;}}else if(count==4){if(left&&right){if(k==0){if(num==2){return 6000;}else{return 3500;}}else{if(num==2){return 5000;}else{return 3000;}}}else if(!left&&!right){return 0;}else{if(k==0){if(num==2){return 4000;}else{return 800;}}else{if(num==2){return 3600;}else{return 750;}}}}else{if(k==0){if(num==2){return 20000;}else{return 15000;}}else{if(num==2){return 10000;}else{return 3300;}}}}public void showMe(){frame.setSize(530,600);Toolkit kit = Toolkit.getDefaultToolkit();Dimension screenSize = kit.getScreenSize();int width = screenSize.width;int height = screenSize.height;int x = (int)(width-600)/2;int y = (int)(height-530)/2-50;frame.setLocation(x,y);frame.setVisible(true);frame.setResizable(false);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); }public static void main(String[] args) {new PlayerVsPC().showMe();}public boolean panduan(int n,int m){if(heng(n,m)||shu(n,m)||zuoxie(n,m)||youxie(n,m)){ return true;}return false;}public boolean heng(int n,int m){int i=n+1,j=m+1;int count=1;while(qipan[i][j-1]==qipan[n+1][m+1]){j--;}while(qipan[i][j+1]==qipan[n+1][m+1]){count++;j++;}if(count>4){return true;}return false;}public boolean shu(int n,int m){int i=n+1,j=m+1;int count=1;while(qipan[i-1][j]==qipan[n+1][m+1]){i--;}while(qipan[i+1][j]==qipan[n+1][m+1]){count++;i++;}if(count>4){return true;}return false;}public boolean youxie(int n,int m){int i=n+1,j=m+1;int count=1;while(qipan[i-1][j-1]==qipan[n+1][m+1]){i--;j--;}while(qipan[i+1][j+1]==qipan[n+1][m+1]){count++;i++;j++;}if(count>4){return true;}return false;}public boolean zuoxie(int n,int m){int i=n+1,j=m+1;int count=1;while(qipan[i+1][j-1]==qipan[n+1][m+1]){i++;j--;}while(qipan[i-1][j+1]==qipan[n+1][m+1]){count++;i--;j++;}if(count>4){return true;}return false;}}。

五子棋游戏java源代码[宝典]

五子棋游戏java源代码[宝典]

五子棋游戏JAVA源代码本源代码实现的是一单机双人对战五子棋游戏本源代码由五个java源程序文件组成,Game.java、GameFrame.java、GamePanel.java、 ChessMan.java、Player.java源代码下载源代码:Game.javaimport javax.swing.*;public class Game {public static void main(String[] args) {GameFrame GFrame=new GameFrame();GFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);GFrame.setVisible(true);}}GameFrame.javaimport java.awt.*;import javax.swing.*;class GameFrame extends JFrame {private static final int Width=570;private static final int Height=470;GameFrame(){setTitle("五子棋游戏");CenteredFrame();setSize(Width,Height);GamePanel Gpanel=new GamePanel();add(Gpanel);}void CenteredFrame(){Toolkit kit=Toolkit.getDefaultToolkit(); Dimension screenSize=kit.getScreenSize();int screenHeight=screenSize.height;int screenWidth=screenSize.width;int Xposition=(screenWidth-Width)/2;int Yposition=(screenHeight-Height)/2;setLocation(Xposition,Yposition);}}GamePanel.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;class GamePanel extends JPanel {private Point cursor=new Point(40,60); //棋盘坐标private int[][] ChessState=new int[18][18];//棋盘状态private int i=0;//横坐标private int j=0;//纵坐标private final static int testnum=5;//五子棋的规定棋子数private Player Black=new Player(1,Color.BLACK,"黑方");//黑方棋子private Player White=new Player(2,Color.WHITE,"白方");//白方棋子private Player Cplayer=null;//当前用户的引用private JTextField textBlack=new JTextField("",5);//黑方文本提示框对象和文本长度设置private JTextField textWhite=new JTextField("",5);//白方文本提示框对象和文本长度设置private String Nothing="";private String textblack="请黑方下子";//黑方提示文本private String textwhite="请白方下子";//白方提示文本GamePanel(){setLayout(null);Initialization();setFocusable(true);JButton Rutton=new JButton("重新开局");Rutton.setBounds(20,14,100,26);RestartListener restart=new RestartListener();Rutton.addActionListener(restart);add(Rutton);textBlack.setHorizontalAlignment(JTextField.CENTER);textBlack.setBounds(150,14,110,26);textBlack.setEditable(false);add(textBlack);textWhite.setHorizontalAlignment(JTextField.CENTER);textWhite.setBounds(290,14,110,26);textWhite.setEditable(false);add(textWhite);JTextArea gInstruction=new JTextArea();gInstruction.setSelectedTextColor(newColor(238,238,238));String gSInstruction="Play1(黑方) Key \nup--------W \ndown----S\nleft--------A \nright------F \n\n"+"Play2(白方) Key \nup--------up \ndown----down \nleft--------left \nright------right \n\n"+"Exit game: \nPress Esc";gInstruction.setText(gSInstruction);gInstruction.setEditable(false);gInstruction.setBounds(440,60,100,340);add(gInstruction);ChessManPerformListener Perform=new ChessManPerformListener();addKeyListener(Perform);}// 设置第一个JTextField输出"请黑方下棋",坐标为(40,60)void Initialization(){for(int i=0,j;i<18;i++)for(j=0;j<18;j++){ChessState[i][j]=0;}cursor.setLocation(40,60);Cplayer=Black;textBlack.setText(textblack);textWhite.setText(Nothing);}//画棋盘和初始化棋局状态protected void paintComponent(Graphics g){super.paintComponent(g);Graphics2D g2=(Graphics2D) g;for(int i=60;i<=400;i+=20){g2.drawLine(40,i,380,i);}for(int j=40;j<=380;j+=20){g2.drawLine(j,60,j,400);}g2.drawString("_",cursor.x-6,cursor.y);g2.drawString("_",cursor.x,cursor.y);for(i=0;i<18;i++)for(j=0;j<18;j++){if(ChessState[i][j]!=0){if(ChessState[i][j]==1){g2.setPaint(Black.getplayerChessManColor());}if(ChessState[i][j]==2){g2.setPaint(White.getplayerChessManColor());}g2.fillOval(j*20+40-10, i*20+60-10,ChessMan.getChessManSize(), ChessMan.getChessManSize());}}}//判断棋盘的当前位置是否已有棋子boolean isChessState(){this.j=(cursor.x-40)/20;this.i=(cursor.y-60)/20;if(ChessState[this.i][this.j]!=0)return true;elsereturn false;}//记录落子后棋盘的当前位置的状态void RecordChessState(){this.j=(cursor.x-40)/20;this.i=(cursor.y-60)/20;ChessState[this.i][this.j]=Cplayer.getCurrentIdentify(); }//判断当前玩家落子后是否赢了void JudgeWin(){for(int i=0;i<4;i++)if(JudgeWinLine(i)){//提示当前玩家已经获得胜利try{String Ginformation="GameInformation";String Message="恭喜玩家"+Cplayer.getsIdentify()+"获胜!"+"\n"+"继续游戏还是退出游戏?";String[] options = {"继续","退出"};intselection=JOptionPane.showOptionDialog(null,Message,Ginform ation,JOptionPane.YES_NO_OPTION,RMATION_MESSAGE , null,options,options[0]);//throws HeadlessExceptionif(selection==JOptionPane.OK_OPTION){Initialization();repaint();return;}if(selection==JOptionPane.NO_OPTION){ System.exit(0);//退出程序}}catch(HeadlessException e){e.printStackTrace();}}//如果当前方没有赢棋则双方轮换ChangeCurrentPlayer();}//在当前方向上是否有连续的五只棋子boolean JudgeWinLine(int direction){int i,j,di,dj,count;i=j=di=dj=count=0;switch(direction){case 0:j=this.j-(testnum-1);i=this.i;dj=1;di=0;break;case 1:j=this.j;i=this.i-(testnum-1);dj=0;di=1;break;case 2:j=this.j-(testnum-1);i=this.i+(testnum-1);dj=1;di=-1;break;case 3:j=this.j-(testnum-1);i=this.i-(testnum-1);dj=1;di=1;break;}for(int k=0;k<testnum*2+1;k++){if(j>=0&&j<18&&i>=0&&i<18){if(ChessState[i][j]==Cplayer.getCurrentIdentify()){count++;if(count>=testnum)return true;}elsecount=0;}j+=dj;i+=di;}return false;}//更换当前玩家void ChangeCurrentPlayer(){if(Cplayer==Black){Cplayer=White;textBlack.setText(Nothing);textWhite.setText(textwhite);}else{Cplayer=Black;textBlack.setText(textblack);textWhite.setText(Nothing);}}//重新开局监听器private class RestartListener implements ActionListener{public void actionPerformed(ActionEvent arg0) {Initialization();repaint();requestFocus();}}//棋盘、棋局状态监听器private class ChessManPerformListener implements KeyListener{//玩家2的按键public void keyPressed(KeyEvent event) {int keyCode=event.getKeyCode();if(keyCode==KeyEvent.VK_ESCAPE)System.exit(0);if(Cplayer.getCurrentIdentify()==2){//判别当前玩家if(keyCode==KeyEvent.VK_LEFT){if(cursor.x>40)cursor.x-=20;}else if(keyCode==KeyEvent.VK_RIGHT){if(cursor.x<380)cursor.x+=20;}else if(keyCode==KeyEvent.VK_UP){if(cursor.y>60)cursor.y-=20;}else if(keyCode==KeyEvent.VK_DOWN){if(cursor.y<400)cursor.y+=20;}else if(keyCode==KeyEvent.VK_ENTER){if(!isChessState()){Cplayer.PerformChessMan();RecordChessState();repaint();JudgeWin();//判定当前落子后是否赢棋}}repaint();}}public void keyReleased(KeyEvent event) {}//玩家1的按键public void keyTyped(KeyEvent event) {char keyChar=event.getKeyChar();if(Cplayer.getCurrentIdentify()==1){//判别当前玩家if(keyChar=='a'){if(cursor.x>40)//对移动光标超界现象做判别cursor.x-=20;}else if(keyChar=='d'){if(cursor.x<380)cursor.x+=20;}else if(keyChar=='w'){if(cursor.y>60)cursor.y-=20;}else if(keyChar=='s'){if(cursor.y<400)cursor.y+=20;}else if(keyChar==' '){if(!isChessState()){ //落子前先判断当前位置上是否已有棋子Cplayer.PerformChessMan();//落子RecordChessState();//记录当前落子后棋盘状态repaint();JudgeWin();//判定当前落子后是否赢棋}}}repaint();}}}ChessMan.javaimport java.awt.Color;class ChessMan {private static final int ChessManSize=20; private Color ChessManColor;ChessMan(Color c){ChessManColor=c;}static int getChessManSize(){return ChessManSize;}Color getChessManColor(){return ChessManColor;}}Player.javaimport java.awt.Color;class Player {private int identify;private ChessMan pChessMan;private String PlayerStringIdentify;Player(int identify,Color c,String sIdentify){this.identify=identify;pChessMan=new ChessMan(c);this.PlayerStringIdentify=sIdentify;}int getCurrentIdentify(){return identify;}String getsIdentify(){return PlayerStringIdentify;}void PerformChessMan(){}Color getplayerChessManColor(){return pChessMan.getChessManColor(); }}。

java五子棋网络版源代码加分析

java五子棋网络版源代码加分析

本人学会的一个五子棋网络版和单机版游戏,有老师指导完成,详细的解释和代码都在下面,希望可以帮助到大家!1.客户端连接新建个gobangClient类package gobang;public class gobangClient {public static void main(String[] args) throws Exception { new ChessBoard("localhost",8866);}}2.服务端连接新建个gobangServer类package gobang;public class gobangServer {public static void main(String[] args) throws Exception { new ChessBoard(8866);}}3.源代码,有详细解释package gobang;import java.awt.BorderLayout;import java.awt.Container;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .Socket;import java.util.ArrayList;import java.awt.Graphics;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;public class ChessBoard extends JFrame{private boolean myPlay=false;//(默认是false)是否轮到我落子private JButton button1 =new JButton("开始");private JButton button2 =new JButton("悔棋");private JPanel p1 = new JPanel();private PicPane pp = null;private int side=1;//1表示黑private int n=0;//记录点击开始的次数public static final int SIZE=15;public static int[][]board=new int[SIZE][SIZE];//用来保存棋盘上棋子状态//1为黑,2为白,0为无public static final int BLACK=1;public static final int WHITE=-1;private NetService service;private static ArrayList<String> list =new ArrayList<String>(); //保存了下棋的步骤private boolean end=true;//true表示游戏已经结束private int currentColor=1;//服务端的构造器public ChessBoard(int port) throws Exception{//调用本类的无参构造树this();//构造器调用规则:1,只能调用本类或父类的构造器2. 调用构造器的代码写在新构造器的第一行3.构造器的调用只能使用this(本类)或者(父类) //将按钮设置能无效的button1.setEnabled(false);button2.setEnabled(false);//3.创建ServerSocket对象ServerSocket ss=new ServerSocket(port);//4.等待连接Socket s=ss.accept();//5.连接成功后创建一个线程来处理请求service=new NetService(s);service.start();//6.将按钮设置成有效的button1.setEnabled(true);button2.setEnabled(true);}//客户端的构造器public ChessBoard(String ip,int port) throws Exception{ //调用本类无参构造器this();//连接服务器Socket s=new Socket(ip,port);//初始化服务类service=new NetService(s);service.start();}public ChessBoard() throws IOException{Container c = this.getContentPane();c.setLayout(new BorderLayout());pp = new PicPane();BorderLayout bl = new BorderLayout();c.setLayout(bl);FlowLayout fl = new FlowLayout();p1.setLayout(fl);p1.add(button1);p1.add(button2);c.add(p1,BorderLayout.NORTH);c.add(pp,BorderLayout.CENTER);setSize(pp.getWidth()+6,pp.getHeight()+65);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);setVisible(true);button1.addActionListener(new SomeListener());button2.addActionListener(new button2Listener());}class SomeListener implements ActionListener{public void actionPerformed(ActionEvent e){// button2.setVisible(true);// if(n==0)// {// JOptionPane.showMessageDialog(// ChessBoard.this, "开始游戏啦!",// "提示",RMATION_MESSAGE);// }// else// {// JOptionPane.showMessageDialog(// ChessBoard.this, "确定要重新开始?",// "提示",RMATION_MESSAGE); // }// board=new int[15][15];// //调用重绘// pp.repaint();// end=false;// n++;start();}}private void start(){netStart();localStart();myPlay=true;//谁先点了开始按钮,谁先开始}private void localStart(){//重新初始化棋盘board=new int[SIZE][SIZE];//重新设置当前颜色currentColor=BLACK;//清空下棋步骤list=new ArrayList<String>();//重绘棋盘pp.repaint();//重新设置使下期没有结束end=false;}private void netStart(){service.send("start");}class button2Listener implements ActionListener{public void actionPerformed(ActionEvent e){back();// if(end==true)// {// JOptionPane.showMessageDialog(// ChessBoard.this, "人家都赢了你不能悔棋啦!", // "提示",RMATION_MESSAGE); // return;// }// int length = list.size();// if(list.size()<0)// {return;}// String str1 = list.remove(list.size() - 1);// String[] str3s = str1.split(",");// String str31 = str3s[0];// String str32 = str3s[1];// int row = Integer.parseInt(str31);// int col = Integer.parseInt(str32);// board[row][col]=0;// pp.repaint();// side = (side==1?2:1);//同下// if(side==1)// side=2;// else// side=1;}}public void back(){netBack();localBack();myPlay=!myPlay;//经典啊boolean的好处啊,悔棋了还是我下棋}private void localBack(){//如果结束不能悔棋if(end){return;}//if(list.isEmpty()){return;}//String str1 = list.remove(list.size() - 1);String[] str3s = str1.split(",");String str31 = str3s[0];String str32 = str3s[1];int row = Integer.parseInt(str31);int col = Integer.parseInt(str32);board[row][col]=0;currentColor=-currentColor;//pp.repaint();//}private void netBack(){if(end){//节省时间return;}service.send("back");}public static void toCenter(JFrame frame){int width = frame.getWidth();int height = frame.getHeight();Toolkit tookie = Toolkit.getDefaultToolkit();Dimension dim = tookie.getScreenSize();int screenWidth = dim.width;int screenHeight = dim.height;frame.setLocation((screenWidth - width)/2,(screenHeight-height)/2);}class PicPane extends JPanel{private int width;private int height;private BufferedImage bImg;//棋盘private BufferedImage chessImg;//黑子private BufferedImage wImg;//白子public PicPane() throws IOException{InputStreamips =PicPane.class.getResourceAsStream("images/chessboard.jpg");bImg = javax.imageio.ImageIO.read(ips);ips =PicPane.class.getResourceAsStream("images/b.gif");chessImg = javax.imageio.ImageIO.read(ips);ips =PicPane.class.getResourceAsStream("images/w.gif");wImg = javax.imageio.ImageIO.read(ips);width = bImg.getWidth();height = bImg.getHeight();addMouseListener(new boardListener());}@Overridepublic void paint(Graphics g){super.paint(g);g.drawImage(bImg,0,0,null);//加上画棋子的代码//依据board数组中的数据for(int i=0;i<board.length;i++){for(int j=0;j<board[i].length;j++){if(board[i][j]==1){g.drawImage(chessImg,j*35+3,i*35+3,null);}else if(board[i][j]==-1){g.drawImage(wImg,j*35+3,i*35+3,null);}}}}public int getHeight(){return height;}public int getWidth(){return width;}class boardListener extends MouseAdapter//只对感兴趣的方法实现,不用借口全部实现{@Overridepublic void mouseClicked(MouseEvent ae){int x=ae.getX();int y=ae.getY();int row=(y-4)/35;int col=(x-4)/35;play(row,col);// //判断游戏的状态,游戏是否结束的逻辑// if(end)// {// return;// }// //获得点击的坐标// int x=e.getX();// int y=e.getY();// int row=y/35;// int col=x/35;// if(row>=15||col>=15)// {// return;// }// if(board[row][col]==0)// switch(side)// {// case 1:// {//e.getComponent().getGraphics().drawImage(chessImg,col*35+3,row *35+3,null);// board[row][col]=1;//记录棋子// side=2;//改为白方// list.add(row+","+col);// break;// }// case 2:// {//e.getComponent().getGraphics().drawImage(wImg,col*35+3,row*35+ 3,null);// board[row][col]=2;// side=1;//改为黑方// list.add(row+","+col);// break;//改为黑方// }// }// //判断输赢// if(isWin(row,col))// {// //如果赢了:// end=true;// //提示用户,谁赢了// JOptionPane.showMessageDialog(ChessBoard.this,// (side==1?"白方胜":"黑方胜"),"提示",RMATION_MESSAGE);// }//}}}private void play(int row,int col){if(!myPlay){//如果不是我落子,直接返回,什么也不做return;}netPlay(row,col);//使另一方的棋盘上落子localPlay(row,col);//在本地的棋盘上落子myPlay=false;}private void netPlay(int row, int col){ if(end){//只打开服务器,会报错的问题return;}service.send(row+","+col);}private void localPlay(int row, int col){if(end){return;}if(row>=SIZE||col>=SIZE||row<0||col<0){return;}if(board[row][col]!=0){return;}//保存棋子board[row][col]=currentColor;//保存下棋步骤list.add(row+","+col);//重绘棋盘pp.repaint();if(isWin(row,col)){end=true;JOptionPane.showMessageDialog(ChessBoard.this,((currentColor==BLACK?"黑方":"白方")+"胜!"),"提示",RMATION_MESSAGE);}currentColor=-currentColor;}private boolean isWin(int currRow,int currCol){ // 需要比较四个方向的棋子(是否同色)int color=board[currRow][currCol];int[][]directions={{1,0},{1,1},{0,1},{-1,1}};//从四个方向比较for(int i=0;i<directions.length;i++){//计数器int num=1;//控制正反的for(int j=-1;j<2;j+=2){//比较次数for(int k=1;k<5;k++){//获得相邻的棋子的坐标int row=currRow+j*k*directions[i][0];int col=currCol+j*k*directions[i][1];//有可能行和列越界if(row<0||row>=15||col<0||row>=15){break;}if(board[row][col]==color){num++;if(num==5){return true;}}elsebreak;}}return false;}class NetService extends Thread{Socket s;BufferedReader in;PrintWriter out;public NetService(Socket s){try {this.s=s;in=new BufferedReader(new InputStreamReader(s.getInputStream()));out=new PrintWriter(s.getOutputStream());} catch (IOException e) {e.printStackTrace();}}public void send(String message){out.println(message);out.flush(); //刷新缓冲区}public void run(){try {while(true){String command=in.readLine();if(command.equals("start")){localStart();myPlay=false;}else if(command.equals("back")){localBack();myPlay=!myPlay;}else{String[]arr=command.split(",");int row=Integer.parseInt(arr[0]);int col=Integer.parseInt(arr[1]);localPlay(row,col);myPlay=true;}}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) throws IOException {ChessBoard chessboard = new ChessBoard();toCenter(chessboard);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一个文件:
import javax.swing.*;
import ;
import java.awt.*;
/*
五子棋-主框架类,程序启动类
*/
public class StartChessJFrame extends JFrame {
private ChessBoard chessBoard;//对战面板
//setSize(800,800);
pack(); //自适应大小
}
private class MyItemListener implements ActionListener {//事件监听器内部类
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource(); //取得事件源
toolbar.add(startButton);//将三个按钮添加到工具面板上
toolbar.add(backButton);
toolbar.add(exitButton);
startButton.addActionListener(lis);//将三个按钮注册监听事件
backButton.addActionListener(lis);
private JPanel toolbar;//工具条面板
private JButton startButton, backButton, exitButton;
//重新开始按钮,悔棋按钮,和退出按钮
private JMenuBar menuBar;//菜单栏
private JMenu sysMenu;//系统菜单
if (obj == || obj == startButton) {
//重新开始
// JFiveFrame.this内部类引用外部类
"重新开始...");
chessBoard.restartGame();
} else if (obj == exitMenuItem || obj == exitButton) {
StartChessJFrame f = new StartChessJFrame(); //创建主框架
f.setVisible(true); //显示主框架
}
}
第二个文件:
import ;
/*五子棋的棋子设计。
*/
public class Point {
private int x; //棋盘中的x索引
sysMenu.add(startMenuItem);//将三个菜单项添加到菜单上
sysMenu.add(backMenuItem);
sysMenu.add(exitMenuItem);
MyItemListener lis = new MyItemListener();//初始化按钮事件监听器内部类
System.exit(0); //结束应用程序
} else if (obj == backMenuItem || obj == backButton) { //悔棋
"悔棋...");
chessBoard.goback();
}
}
}
public static void main(String[] args) {
private JMenuItem startMenuItem, exitMenuItem, backMenuItem;
//重新开始,退出,和悔棋菜单项
public StartChessJFrame() {
setTitle("单机版五子棋");//设置标题
chessBoard = new ChessBoard();//初始化面板对象
import javax.swing.*;
;//将三个菜单项注册到事件监听器上
backMenuItem.addActionListener(lis);
exitMenuItem.addActionListenFra bibliotekr(lis);
menuBar.add(sysMenu);//将系统菜单添加到菜单栏上
setJMenuBar(menuBar);//将menuBar设置为菜单栏
exitButton.addActionListener(lis);
add(toolbar, BorderLayout.SOUTH);//将工具面板布局到界面"南"方也就是下面
add(chessBoard);//将面板对象添加到窗体上
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置界面关闭事件
//创建和添加菜单
menuBar = new JMenuBar();//初始化菜单栏
sysMenu = new JMenu("系统");//初始化菜单
startMenuItem = new JMenuItem("重新开始");
exitMenuItem = new JMenuItem("退出");
backMenuItem = new JMenuItem("悔棋");//初始化菜单项
private int y; //棋盘中的y索引
private Color color;//颜色
public static final int DIAMETER = 30;//直径
public Point(int x, int y, Color color) {
this.x = x;
this.y = y;
this.color = color;
}
public int getX() {//拿到棋盘中的x索引
return x;
}
public int getY() {//拿到棋盘中的Y索引
return y;
}
public Color getColor() {//得到颜色
return color;
}
}
第三个文件:
toolbar = new JPanel();//工具面板栏实例化
startButton = new JButton("重新开始");//三个按钮初始化
backButton = new JButton("悔棋");
exitButton = new JButton("退出");
toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//将工具面板按钮用FlowLayout布局
相关文档
最新文档