Java实现简单五子棋程序
五子棋java代码实现
package images;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JOptionPane;public class FiveChessTest extends JFrame implements MouseListener{int x = 0;int y = 0;int[][] allChess = new int[19][19];//标识当前是黑棋还是白棋下下一步boolean isBlack = true;//标识当前游戏是否可以继续boolean canPlay = true;//保存显示的提示信息String message = "黑方先行";BufferedImage bf;FiveChessTest(){super();//设置窗体相关属性this.setTitle("20121683阮颖鹏");this.setSize(500,500);this.addMouseListener(this);try {bf = ImageIO.read(new FileInputStream("C:\\Documents and Settings\\Administrator\\桌面\\FiveChess\\src\\images\\fzq.jpg"));} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}repaint();this.setLocationRelativeTo(null);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }public void paint(Graphics g){g.drawImage(bf,0,20,null);//添加背景信息g.setColor(Color.BLACK);g.setFont(new Font("黑体",Font.BOLD,20));g.drawString("游戏信息:"+message, 130, 60);//绘制棋盘for(int i=0;i<=18;i++){g.drawLine(10, 70+20*i, 370, 70+20*i);g.drawLine(10+20*i, 70, 10+20*i, 430);}//绘制全部棋子for(int i = 0 ; i<19 ; i++)for(int j= 0 ; j<19 ; j++){//定义变量记录当前棋子在数组中的位置int tempX = i*20 + 10;int tempY = j*20 + 70;if(allChess[i][j] == 1){//绘制黑子g.setColor(Color.BLACK);g.fillOval(tempX-7, tempY-7, 14, 14);}if(allChess[i][j] == 2){//绘制白子g.setColor(Color.WHITE);g.fillOval(tempX-7, tempY-7, 14, 14);}}}@Overridepublic void mouseClicked(MouseEvent arg0) {// TODO 自动生成的方法存根if (canPlay) {x=arg0.getX();y=arg0.getY();if (x >= 10 && x <= 370 && y >= 70 && y <=430) {x = x / 20;y = (y - 60) / 20;// 判断落子处是否已有棋子if (allChess[x][y] == 0) {// 判断当前要下的是什么颜色棋子if (isBlack) {allChess[x][y] = 1;isBlack = false;message = "轮到白方";} else {allChess[x][y] = 2;isBlack = true;message = "轮到黑方";}} else {JOptionPane.showMessageDialog(this, " 当前位置已有棋子,请重新落子!");}this.repaint();}}}@Overridepublic void mouseEntered(MouseEvent arg0) {// TODO 自动生成的方法存根}@Overridepublic void mouseExited(MouseEvent arg0) {// TODO 自动生成的方法存根}@Overridepublic void mousePressed(MouseEvent arg0) {// TODO 自动生成的方法存根}@Overridepublic void mouseReleased(MouseEvent arg0) { // TODO 自动生成的方法存根}}。
java语言写一个简易的五子棋
java语⾔写⼀个简易的五⼦棋经过16天的java学习,也学得了不少关于Java⽅⾯的知识,我想分享⼀下我⽤java写的⼀个简单的五⼦棋。
游戏规则:(1)对局双⽅各执⼀⾊棋⼦。
(2)空棋盘开局。
(3)⽩先、⿊后,交替下⼦,每次只能下⼀⼦。
(4)棋⼦下在棋盘的空⽩点上,棋⼦下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)⽩⽅的第⼀枚棋⼦可下在棋盘任意交叉点上。
(6)任意⼀⽅达成五连⼦即可获胜整体如下:import java.util.Scanner;public class WuZiQi2 {static String[][] a = new String[10][10];public static void main(String[] args) {init();paint();XiaZi();}public static void init() {for (int i = 0; i < a.length; i++) {for (int j = 0; j < a[i].length; j++) {System.out.println(a[i][j]);a[i][j] = "+";}}}public static void paint() {for (int i = 0; i < a.length; i++) {for (int j = 0; j < a[i].length; j++) {System.out.print(a[/**/i][j] + "" + "\t");}System.out.println();}}public static void XiaZi() {boolean flag = true;Scanner s = new Scanner(System.in);int x = 0;int y = 0;while (true) {if (flag) {System.out.println("A下");System.out.println("请输⼊x坐标");x = s.nextInt();System.out.println("请输⼊y坐标");y = s.nextInt();if (x > 10 || y > 10 || x < 1 || y < 1) {System.out.println("请输⼊正确的xy坐标");continue;}if (isRepeat(x, y)) {a[y - 1][x - 1] = "○";paint();} else {continue;}} else {System.out.println("B下");System.out.println("请输⼊x坐标");x = s.nextInt();System.out.println("请输⼊y坐标");y = s.nextInt();if (x > 10 || y > 10 || x < 1 || y < 1) {System.out.println("请输⼊正确的xy坐标");continue;}if (isRepeat(x, y)) {a[y - 1][x - 1] = "●";paint();} else {continue;}}flag = !flag;boolean l = upDown(x - 1, y - 1, a[y - 1][x - 1]);if (l) {break;}boolean p = leftRight(x - 1, y - 1, a[y - 1][x - 1]);if (p) {break;}boolean o = lurd(x - 1, y - 1, a[y - 1][x - 1]);if (o) {break;}boolean f = ruld(x - 1, y - 1, a[y - 1][x - 1]);if (f){break;}}}public static boolean isRepeat(int x, int y) {if (!a[y - 1][x - 1].equals("○") && !a[y - 1][x - 1].equals("●")) { return true;}return false;}public static boolean upDown(int x, int y, String s) {//上下int count = 1;int i = x;int k = y - 1;for (; k >= 0; k--) {if (a[k][i].equals(s)) {count++;}else{break;}}int j = y + 1;for (; j <= 9; j++) {if (a[j][i].equals(s)) {count++;}else{break;}}if (count >= 5) {System.out.println(s + "Win");return true;}return false;}public static boolean leftRight(int x, int y, String s) {//左右int count = 1;int i = x - 1;int k = y;for (; i >= 0; i--) {if (a[k][i].equals(s)) {count++;}else{break;}}int j = x + 1;for (; j <= 9; j++) {if (a[k][j].equals(s)) {count++;}else{break;}}if (count >= 5) {System.out.println(s + "Win");return true;}return false;}public static boolean lurd(int x, int y, String s) {//左上右下int count = 1;int i = x - 1;int k = y - 1;for (; i >= 0 & k >= 0; i--, k--) {if (a[k][i].equals(s)) {count++;}else{break;}}int n = x + 1;int m = y + 1;for (; n <= 9 & m <= 9; n++, m++) {if (a[m][n].equals(s)) {count++;}else{break;}}if (count >= 5) {System.out.println(s + "Win");return true;}return false;}public static boolean ruld(int x, int y,String s){//右上左下 int count = 1;int q = x + 1;int e = y - 1;for (;q<=9&e>=0;q++,e--){if (a[e][q].equals(s)){count++;}else{break;}}int r = x - 1;int t = y + 1;for (;r>=0&t<=9;r--,t++){if (a[t][r].equals(s)){count++;}else{break;}}if (count>=5) {System.out.println(s+"Win");return true;}return false;}}。
java五子棋的简单思路
Java五子棋的简单思路1. 介绍五子棋是一种古老而受欢迎的策略棋类游戏,它的规则简单而容易上手,同时也需要一定的战略和计算能力。
在这个任务中,我们将使用Java编写一个简单的五子棋游戏。
2. 游戏规则五子棋的规则非常简单,两名玩家轮流落子,先形成连续的五个棋子的一方即获胜。
棋盘是一个15×15的网格,玩家可以在空白格子中落下自己的棋子。
3. 实现思路为了实现这个简单的五子棋游戏,我们可以按照以下步骤进行:3.1 创建游戏界面首先,我们需要创建一个游戏界面,用于显示棋盘和游戏状态。
可以使用Java Swing或JavaFX来创建一个窗口,并在窗口中绘制棋盘。
3.2 绘制棋盘在游戏界面中,我们需要绘制一个15×15的棋盘。
可以使用Java的图形库来绘制网格和棋子。
3.3 处理玩家落子在游戏界面中,我们需要处理玩家的落子操作。
可以使用鼠标事件监听器来获取玩家的点击位置,并在对应的位置上放置玩家的棋子。
3.4 判断胜负在每次玩家落子后,我们需要判断是否有一方获胜。
可以编写一个判断函数,检查棋盘上是否存在连续的五个同色棋子。
3.5 实现游戏逻辑在游戏界面中,我们需要实现游戏的逻辑。
包括轮流落子、判断胜负、显示游戏状态等。
3.6 添加AI玩家(可选)如果想要增加游戏的挑战性,我们可以添加一个简单的AI玩家。
可以使用一些简单的算法来实现AI玩家的落子策略。
4. 代码实现这里是一个简单的Java五子棋游戏的代码示例:import javax.swing.*;import java.awt.*;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;public class GobangGame extends JFrame {private int[][] board;private int currentPlayer;public GobangGame() {setTitle("五子棋游戏");setSize(500, 500);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);board = new int[15][15];currentPlayer = 1;JPanel panel = new JPanel() {@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);drawBoard(g);}};panel.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {int x = e.getX() / 30;int y = e.getY() / 30;if (board[x][y] == 0) {board[x][y] = currentPlayer;currentPlayer = 3 - currentPlayer;panel.repaint();if (checkWin(x, y)) {JOptionPane.showMessageDialog(null, "玩家 " + (3 - cur rentPlayer) + " 获胜!");resetBoard();panel.repaint();}}}});add(panel);setVisible(true);}private void drawBoard(Graphics g) {for (int i = 0; i < 15; i++) {g.drawLine(15, 15 + i * 30, 435, 15 + i * 30);g.drawLine(15 + i * 30, 15, 15 + i * 30, 435);}for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {if (board[i][j] == 1) {g.setColor(Color.BLACK);g.fillOval(i * 30 + 3, j * 30 + 3, 24, 24);} else if (board[i][j] == 2) {g.setColor(Color.WHITE);g.fillOval(i * 30 + 3, j * 30 + 3, 24, 24);}}}}private boolean checkWin(int x, int y) {int color = board[x][y];int count = 1;// 横向判断for (int i = x - 1; i >= 0 && board[i][y] == color; i--) { count++;}for (int i = x + 1; i < 15 && board[i][y] == color; i++) { count++;}if (count >= 5) {return true;}// 纵向判断count = 1;for (int i = y - 1; i >= 0 && board[x][i] == color; i--) { count++;}for (int i = y + 1; i < 15 && board[x][i] == color; i++) {count++;}if (count >= 5) {return true;}// 左上-右下判断count = 1;for (int i = x - 1, j = y - 1; i >= 0 && j >= 0 && board[i][j] == colo r; i--, j--) {count++;}for (int i = x + 1, j = y + 1; i < 15 && j < 15 && board[i][j] == colo r; i++, j++) {count++;}if (count >= 5) {return true;}// 右上-左下判断count = 1;for (int i = x + 1, j = y - 1; i < 15 && j >= 0 && board[i][j] == colo r; i++, j--) {count++;}for (int i = x - 1, j = y + 1; i >= 0 && j < 15 && board[i][j] == colo r; i--, j++) {count++;}if (count >= 5) {return true;}return false;}private void resetBoard() {for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {board[i][j] = 0;}}currentPlayer = 1;}public static void main(String[] args) {new GobangGame();}}5. 总结通过以上的实现思路和代码示例,我们可以使用Java编写一个简单的五子棋游戏。
简单的五子棋java游戏代码
package day17.gobang;import java.util.Arrays;public class GoBangGame {public static final char BLANK='*';public static final char BLACK='@';public static final char WHITE='O';public static final int MAX = 16;private static final int COUNT = 5;//棋盘private char[][] board;public GoBangGame() {}//开始游戏public void start() {board = new char[MAX][MAX];//把二维数组都填充‘*’for(char[] ary: board){Arrays.fill(ary, BLANK);}}public char[][] getChessBoard(){return board;}public void addBlack(int x, int y) throws ChessExistException{ //@//char blank = '*';//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK); if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子board[y][x] = BLACK;return;}throw new ChessExistException("已经有棋子了!");}public void addWhite(int x, int y)throws ChessExistException{if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子board[y][x] = WHITE;return;}throw new ChessExistException("已经有棋子了!");}//chess 棋子:'@'/'O'public boolean winOnY(char chess, int x, int y){//先找到y方向第一个不是blank的棋子int top = y;while(true){if(y==0 || board[y-1][x]!=chess){//如果y已经是棋盘的边缘,或者的前一个不是chess//就不再继续查找了break;}y--;top = y;}//向回统计所有chess的个数,如果是COUNT个就赢了int count = 0;y = top;while(true){if(y==MAX || board[y][x]!=chess){//如果找到头或者下一个子不是chess 就不再继续统计了break;}count++;y++;}return count==COUNT;}//chess 棋子:'@'/'O'public boolean winOnX(char chess, int x, int y){//先找到x方向第一个不是blank的棋子int top = x;while(true){if(x==0 || board[y][x-1]!=chess){//如果x已经是棋盘的边缘,或者的前一个不是chess//就不再继续查找了break;}x--;top = x;}//向回统计所有chess的个数,如果是COUNT个就赢了int count = 0;x = top;while(true){if(x==MAX || board[y][x]!=chess){//如果找到头或者下一个子不是chess 就不再继续统计了break;}count++;x++;}return count==COUNT;}//chess 棋子:'@'/'O'public boolean winOnXY(char chess, int x, int y){//先找MAX向第一个不是blank的棋子int top = y;int left = x;while(true){if(x==0 || y==0 || board[y-1][x-1]!=chess){//如果x已经是棋盘的边缘,或者的前一个不是chess//就不再继续查找了break;}x--;y--;top = y;left=x;}//向回统计所有chess的个数,如果是COUNT个就赢了int count = 0;x = left;y = top;while(true){if(x==MAX || y==MAX || board[y][x]!=chess){//如果找到头或者下一个子不是chess 就不再继续统计了break;}count++;x++;y++;}return count==COUNT;}//chess 棋子:'@'/'O'public boolean winOnYX(char chess, int x, int y){//先找到x方向第一个不是blank的棋子int top = y;int left = x;while(true){if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){//如果x已经是棋盘的边缘,或者的前一个不是chess//就不再继续查找了break;}x++;y--;top = y;left=x;}//向回统计所有chess的个数,如果是COUNT个就赢了int count = 0;x = left;y = top;while(true){if(x==0 || y==MAX || board[y][x]!=chess){//如果找到头或者下一个子不是chess 就不再继续统计了break;}count++;x--;y++;}return count==COUNT;}public boolean whiteIsWin(int x, int y) {//在任何一个方向上赢了,都算赢return winOnY(WHITE, x, y) ||winOnX(WHITE, x, y) ||winOnXY(WHITE, x, y) ||winOnYX(WHITE, x, y);}public boolean blackIsWin(int x, int y) {return winOnY(BLACK, x, y) ||winOnX(BLACK, x, y) ||winOnXY(BLACK, x, y) ||winOnYX(BLACK, x, y);}}。
java实现简易的五子棋游戏
java实现简易的五⼦棋游戏本⽂实例为⼤家分享了java实现简易五⼦棋游戏的具体代码,供⼤家参考,具体内容如下先上效果图⼀、问题分析1、五⼦棋游戏分析:五⼦棋作为较为普遍且简易的娱乐游戏,受到众多⼈的热爱,且五⼦棋AI也是⼀个较为容易实现的AI。
下⾯我们先来分析游戏规则。
(哈哈,虽然⼤家都知道,但我还是想写写)双⽅分别使⽤⿊⽩两⾊棋⼦,下在棋盘横线交叉处,先连成五⼦者胜利。
(⿊棋禁⼿啥的规则在我的程序⾥没加,就不赘述了)。
2、程序分析:(1)⾸先,五⼦棋开始,我们需要⼀个棋盘,15*15的棋盘,需要⿊⽩棋⼦。
(2)其次,我们需要实现棋⼦顺序的改变,就是实现先下⿊棋,再下⽩棋,然后实现⼀个基本的修正功能,就是通过点击交叉点周围的位置,使棋⼦下到交叉处。
(3)再之后呢,有了棋⼦棋盘,(其实这个时候已经能进⾏下棋了,⾃⼰判断胜负,哈哈),但是呢,我们接下来需要加⼀个判断输赢的功能。
(4)接下来,我们就来丰富我们的五⼦棋游戏,加⼀些功能键,例如重新开始,悔棋,认输,计时啥啥啥的。
(5)最后来⼀个⾼级点的,就是实现⼈机对战,实现AI下棋。
⼆、模块分析1、棋盘棋⼦模块棋盘嘛就⽤直线画就好,横线15条,竖线15条,棋⼦也就两个,可以画得花哨⼀点,⽐如3D棋⼦,也可以简单⼀点就⽤填充圆就好。
博主画了⼀个⿊⾊3D棋⼦,⽩的没画。
(这⾥继承了我之前的⼀个画板,实现直线的重绘,可以去翻⼀翻我的之前有关画板的博客)。
创建⼀个⼆维数组,存放棋⼦,⽤1代表⿊棋,2代表⽩棋,0代表没棋。
⽤count变量来计算到谁下棋了,以及记录下了第⼏颗棋⼦了。
以下是窗体代码public void outUI(){//设置标题this.setTitle("五⼦棋");this.setSize(1680,1380);this.setLayout(null);JButton btn = new JButton();JButton btn1 = new JButton();JButton btn2 = new JButton();JButton btn3 = new JButton();JButton btn4 = new JButton();btn.setBounds(1340, 780, 210, 65);btn1.setBounds(1340,860,210, 65);btn2.setBounds(1340,940,210, 65);btn3.setBounds(320,1200,210, 65);btn4.setBounds(780,1200,210, 65);//获取⼀个图⽚ImageIcon square=new ImageIcon(this.getClass().getResource("JButton1.jpg"));ImageIcon square1=new ImageIcon(this.getClass().getResource("JButton.jpg"));ImageIcon square2=new ImageIcon(this.getClass().getResource("JButton2.jpg"));ImageIcon square3=new ImageIcon(this.getClass().getResource("JButton3.jpg"));ImageIcon square4=new ImageIcon(this.getClass().getResource("JButton4.jpg"));//设置图⽚的⼤⼩square.setImage(square.getImage().getScaledInstance(210, 65, 0));square1.setImage(square1.getImage().getScaledInstance(210, 65, 0));square2.setImage(square2.getImage().getScaledInstance(210, 65, 0));square3.setImage(square3.getImage().getScaledInstance(210, 65, 0));square4.setImage(square4.getImage().getScaledInstance(210, 65, 0));//把图⽚放到按钮上btn.setIcon(square);btn1.setIcon(square1);btn2.setIcon(square2);btn3.setIcon(square3);btn4.setIcon(square4);btn.setText("开始");btn1.setText("悔棋");btn2.setText("认输");btn3.setText("⼈机对战");btn4.setText("⼈⼈对战");this.add(btn);this.add(btn1);this.add(btn2);this.add(btn3);this.add(btn4);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);MyGameListen bn=new MyGameListen();this.addMouseListener(bn);btn.addActionListener(bn);btn1.addActionListener(bn);btn2.addActionListener(bn);btn3.addActionListener(bn);btn4.addActionListener(bn);Graphics f= this.getGraphics();AI Ai=new AI();AI2 Ai2=new AI2();AIPlus Ai3=new AIPlus();bn.ai=Ai;bn.ai2=Ai2;bn.ai3=Ai3;bn.f1=f;Ai.f1=f;Ai2.f1=f;Ai3.f1=f;bn.sn=this;Ai.arr2=bn.arr;Ai2.arr2=bn.arr;Ai3.arr=bn.arr;arragain=bn.arr;showtime a=new showtime();a.count1=bn.count;}int[][] arragain;@Overridepublic void paint(Graphics g) {// TODO Auto-generated method stub//加背景图ImageIcon square5=new ImageIcon(this.getClass().getResource("game.jpeg"));ImageIcon square6=new ImageIcon(this.getClass().getResource("title.jpg"));square5.setImage(square5.getImage().getScaledInstance( 1200,1162,0));square6.setImage(square6.getImage().getScaledInstance( 366,683,0));g.drawImage(square5.getImage(),40,60,this);g.drawImage(square6.getImage(),1280,100,366,683,this);for(int i=1;i<=15;i++){g.drawLine(80, i*80, 1200, i*80);g.drawLine(i*80,80,i*80,1200);}g.drawLine(60,60 , 1220, 60);g.drawLine(60,60 , 60, 1220);g.drawLine(60, 1220, 1220,1220);g.drawLine(1220, 1220, 1220,60);g.fillOval(630, 630, 20, 20);g.fillOval(310, 950, 20, 20);g.fillOval(310, 310, 20, 20);g.fillOval(950, 950, 20, 20);g.fillOval(950, 310, 20, 20);// 绘制棋盘MyGameListen bn1=new MyGameListen();bn1.f1=g;for(int i=0;i<arragain.length;i++) {for(int j=0;j<arragain.length;j++){if(arragain[i][j]==1){Blackchessman(i*80-40,j*80-40,g);}else if(arragain[i][j]==2){whitechessman(i*80-40,j*80-40,g);}}}}public void Blackchessman(int x,int y,Graphics g){for(int i=0;i<80;i++){Color c=new Color(i*3,i*3,i*3);g.setColor(c);g.fillOval(x+i/3, y+i/3, 80-i, 80-i);}}public void whitechessman(int x,int y,Graphics g){g.setColor(Color.white);g.fillOval(x,y,80,80);}以下是⿏标监听器的代码,这⾥有部分变量没有给出,在⽂章末尾会附上完整代码public void mousePressed(MouseEvent e){x1=e.getX();y1=e.getY();m=correct(x1);n=correct(y1);if(x1<=1240&&y1<=1240){if(arr[m/80][n/80]==0){if(count%2!=0){x1=e.getX();y1=e.getY();m=correct(x1);n=correct(y1);Blackchessman(m-40,n-40);arr[m/80][n/80]=1;arr1[m/80][n/80]=count;count++;if( gobangiswin.isWin(arr, m/80, n/80)) {JOptionPane.showMessageDialog(null, "⿊棋WIN!!");}//ai下棋ai3.playchess();arr[ai3.q][ai3.w]=2;arr1[ai3.q][ai3.w]=count;count++;if( gobangiswin.isWin(arr,ai3.q ,ai3.w )) {JOptionPane.showMessageDialog(null, "⽩棋WIN!!");}}}else{x1=e.getX();y1=e.getY();m=correct(x1);n=correct(y1);whitechessman(m-40,n-40);arr[m/80][n/80]=2;arr1[m/80][n/80]=count;count++;if( gobangiswin.isWin(arr, m/80, n/80)) {JOptionPane.showMessageDialog(null, "⽩棋WIN!!");}}}elsereturn;}else {return;}}2、位置修正这个功能其实有很多种实现的⽅法,可以根据⾃⼰的棋盘位置啥的进⾏修正。
java五子棋小游戏
五子棋小游戏1.功能模块图2.游戏说明(1)黑棋先行,白棋随后。
从第一个棋子开始相互顺序落子。
五子棋游戏 开始游戏 执棋子颜色 黑子先行 判断胜负 游戏结束 图1.功能模块图(2)通过坐标索引算出最先在棋盘的横向、竖向、斜向形成连续的相同色五棋子的一方为胜利。
(3)设定游戏界面大小。
(4)在游戏过程中或下完时可选择开局重新开始。
(5)赢家对话框提示。
(6)游戏实现了基本的单机功能但为实现人机对战和人人对战。
3.游戏界面(1)五子棋游戏的主界面,如图2所示。
图2 程序主界面(2)五子棋游戏的结束界面,如图3所示。
图3 游戏结束界面(3)游戏游戏栏中的各个选项,如图4所示。
图4 Game栏中的选项(4)视图设置栏中的各个选项,如图5所示。
图5 Configure栏中的各个选项(5)Help帮助栏中的选项,如图6所示。
图6 Help栏中的选项(6)点击Help栏中的About选项弹出的界面,如图7所示。
图7 About选项弹出时的界面4.设计任务与目的用java语言编程并检验一个学期以来学习java语言的成果,通过编写一个简单的五子棋游戏实践,检验在学习java语言的过程中的特点及不足,进行集资料、查阅文献、方案制定等实践,促进对所学知识应用能力的提高,灵活运用Java使用方法和编程语法,更好的熟练掌握java语言的特点,并及时反省和提高自己的知识和技术。
研究目标:该五子棋游戏应主要包括下述方面:1.初始化界面时棋盘的规格;2.响应鼠标点击并在相应位置画出棋子;3.有一定的智能(可以判断胜负);4.利用java语言中的panel放置棋盘显示棋子(注:其内包含鼠标响应)。
5.参考文献[1]耿祥义.JAVA大学实用教程.北京:电子工业出版社.2005.3:85-113[2]朱战立,沈伟.Java程序设计实用指南.北京:电子工业出版社,2005.1:48-135[3] 唐大仕.Java程序设计[M]. 北京:北方交通大学出版社:2007.05:56-92[4]叶核亚. JAVA2程序设计实用教程[M].北京:电子工业出版社;2008.4:64-98[5]邢素萍. JAVA办公自动化项目方案精解[M].北京:航空工业出版社, 2006.9:35-1206.方法见表方法名功能备注Draw()方法在Graphics类中,绘制一些具体的东西paint()方法重绘图形setColor()设置颜色repaint() 一个具有刷新页面效果consume() 销毁实例的方法Show() 将所建窗口显示出来show()方法将所建窗口显示出来WindowEvent()方法用来处理点击窗体右上角关闭按钮的事件setSize ()方法设定固定大小4.设计任务与目的通过这次五子棋的课程设计,进一步加深对JA V A基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。
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课程设计 五子棋(内附完整代码)
JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}用类ChessFrame创建五子棋游戏主窗体和菜单import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", null,"棋盘",null,"模式", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("改进棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("扩大棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对战")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessModel {规定棋盘的宽度、高度、棋盘的模式private int width,height,modeChess;规定棋盘方格的横向、纵向坐标private int x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子private int[][] arrMapShow;交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}设置交换棋手的标识符public void setisOdd(boolean isodd){ if(isodd)this.isOdd=true;elsethis.isOdd=false;}获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}获取棋盘宽度public int getWidth(){return this.width;}获取棋盘高度public int getHeight(){return this.height;}获取棋盘模式public int getModeChess(){return this.modeChess;}获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子if(!chessExist(i,j)){判断白子的最大值max_white=checkMax(i,j,2);判断黑子的最大值max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}记录电脑下子后的横向坐标public void setX(int x){this.x=x;}记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}获取电脑下子的横向坐标public int getX(){return this.x;}获取电脑下子的纵向坐标public int getY(){return this.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度private int width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。
简单JAVA五子棋代码1详解
简单JA V A五子棋代码只需要建两个类就可以了1.MainFrame类继承JFrame类2.MainPanel类继承JPanel类实现接口MouseListener两个类详细代码如下MainFrame类,如下:package game.gobang;import java.awt.BorderLayout;import java.awt.Color;import javax.swing.JFrame;/*** 五子棋*/public class MainFrame extends JFrame{public static void main(String[] args) {M ainPanel panel = new MainPanel();MainFrame frame = new MainFrame("五子棋");frame.setSize(680,680);panel.setBackground(Color.GRAY);frame.add(panel,BorderLayout.CENTER);panel.addMouseListener(panel);frame.setVisible(true);}public MainFrame(){s uper();}public MainFrame(String str){s uper(str);}}MainPanel类如下:package game.gobang;import java.awt.Color;import java.awt.Graphics;import java.awt.Panel;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JOptionPane;/*** 五子棋的面板设计*/public class MainPanel extends Panel implements MouseListener{ private static final int COLUMN = 16;//列数private static final int ROW = 16;//行数private static final int GAP = 40;//间距private static boolean isBlack = true;// 判断是否是黑棋private static int click_X;private static int click_Y;private char[][] allChess= new char[ROW][COLUMN];// 存下了旗子的位置public MainPanel(){super();for(int i=0;i<allChess.length;i++){for(int j=0;j<allChess[i].length;j++){allChess[i][j]='*';// 初始化数组allChess,*表示没有棋子存在}}}public void paint(Graphics g){f or(int i=0;i<ROW;i++){//划横线g.setColor(Color.BLACK);g.drawLine(20, 20+i*GAP, 640-20, 20+i*GAP);// 棋盘间隔分布}f or(int i=0;i<COLUMN;i++){//划纵线g.setColor(Color.BLACK);g.drawLine(20+i*GAP, 20, 20+i*GAP, 640-20);}f or(int i=0;i<allChess.length;i++){for(int j=0;j<allChess[i].length;j++){if(allChess[i][j]=='~'){g.setColor(Color.WHITE);g.fillOval(5+i*40, 5+j*40, 30, 30);g.drawOval(5+i*40, 5+j*40, 30, 30);}if(allChess[i][j]=='!'){g.setColor(Color.BLACK);g.fillOval(5+i*40, 5+j*40, 30, 30);g.drawOval(5+i*40, 5+j*40, 30, 30);}}}}public boolean isWin(int x,int y,boolean isColor){//判断是否为5个相同的棋子,是返回true,否返回falsec har ch=allChess[x][y];/* 横向判断 */i nt RLastX = x;w hile(RLastX>=0 && allChess[RLastX][y]==ch){//横向判断是否到达5个相同的棋子RLastX --;}int RNum = 0;//统计横向相同的棋子数RLastX ++;w hile(RLastX<allChess.length && allChess[RLastX][y]==ch){//横向判断是否到达5个相同的棋子RNum ++;RLastX ++;}/* 纵向判断 */i nt LLastY = y;w hile(LLastY>=0 && allChess[x][LLastY]==ch){//纵向判断是否到达5个相同的棋子LLastY --;}i nt LNum = 0;//统计纵向相同的棋子数L LastY ++;w hile(LLastY<allChess[x].length && allChess[x][LLastY]==ch){//纵向判断是否到达5个相同的棋子LLastY ++;LNum ++;}/* 左下右上判断 */i nt LDLastX = x;i nt RULastY = y;w hile(LDLastX>=0 && RULastY<allChess.length &&allChess[LDLastX][RULastY]==ch){// 横向判断有多少个连在一起了LDLastX --;RULastY ++;}i nt LDNum = 0;L DLastX ++;R ULastY --;w hile(LDLastX<allChess.length && RULastY>=0 &&allChess[LDLastX][RULastY]==ch){LDNum ++;LDLastX ++;RULastY --;}/* 左上右下判断 */i nt RULastX = x;i nt LDLastY = y;w hile(RULastX>=0 && LDLastY>=0 && allChess[RULastX][LDLastY]==ch){ RULastX --;LDLastY --;}i nt RUNum = 0;R ULastX ++;L DLastY ++;w hile(RULastX>=0 && LDLastY<allChess.length &&allChess[RULastX][LDLastY]==ch){RULastX ++;LDLastY ++;RUNum ++;}i f(RNum>=5||LNum>=5||RUNum>=5||LDNum>=5){return true;}r eturn false;}public void mouseClicked(MouseEvent e) {/ / 鼠标按下时候画出棋子}public void mousePressed(MouseEvent e) {//鼠标点击事件处理过程//获取点击坐标位置int click_x = e.getX();int click_y = e.getY();int chess_x = Math.round((float)(click_x-20)/GAP);int chess_y = Math.round((float)(click_y-20)/GAP);//获取点击后的坐标位置click_X = chess_x;click_Y = chess_y;if(isBlack==true&&allChess[chess_x][chess_y]=='*'){allChess[chess_x][chess_y] = '!';isBlack = false;}if(isBlack==false&&allChess[chess_x][chess_y]=='*'){allChess[chess_x][chess_y] = '~';isBlack = true;}System.out.println(e.getX());System.out.println(e.getY());repaint();for(int j=0;j<16;j++){f or(int i=0;i<16;i++){System.out.print(allChess[i][j]+" ");}S ystem.out.println();}System.out.println();if(isWin(chess_x,chess_y,isBlack)){S ystem.out.println("你赢了");}if(isWin(chess_x,chess_y,isBlack)){i f(isBlack){JOptionPane.showMessageDialog(null,"白子赢了");}else{JOptionPane.showMessageDialog(null,"黑子赢了");}System.exit(0);}}public void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}public void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}public void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}public void setAllChess(char[][] allChess) {this.allChess = allChess;}public char[][] getAllChess() {return allChess;}}。
Java实现五子棋(附详细源码)
Java实现五⼦棋(附详细源码)本⽂实例为⼤家分享了Java实现五⼦棋游戏的具体代码,供⼤家参考,具体内容如下学习⽬的:熟悉java中swing类与java基础知识的巩固.(⽂末有源代码⽂件和打包的jar⽂件)效果图:思路:**1.⾸先构建⼀个Frame框架,来设置菜单选项与按钮点击事件。
MyFrame.java⽂件代码如下package StartGame;import javax.swing.ButtonGroup;import javax.swing.Icon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JRadioButtonMenuItem;import java.awt.Color;import ponent;import java.awt.Container;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;//窗体框架类public class MyFrame extends JFrame {// static boolean canPlay1 = false;判断是否可以开始游戏final MyPanel panel = new MyPanel();public MyFrame() {// 设置窗体的⼤⼩并居中this.setSize(500, 600); // 设置窗体⼤⼩this.setTitle("五⼦棋游戏"); // 设置窗体标题int height = Toolkit.getDefaultToolkit().getScreenSize().height;// 获取屏幕的⾼度this.setLocation((width - 500) / 2, (height - 500) / 2); // 设置窗体的位置(居中)this.setResizable(false); // 设置窗体不可以放⼤// this.setLocationRelativeTo(null);//这句话也可以设置窗体居中/** 菜单栏的⽬录设置*/// 设置菜单栏JMenuBar bar = new JMenuBar();this.setJMenuBar(bar);// 添加菜单栏⽬录JMenu menu1 = new JMenu("游戏菜单"); // 实例化菜单栏⽬录JMenu menu2 = new JMenu("设置");JMenu menu3 = new JMenu("帮助");bar.add(menu1); // 将⽬录添加到菜单栏bar.add(menu2);bar.add(menu3);JMenu menu4 = new JMenu("博弈模式"); // 将“模式”菜单添加到“设置”⾥⾯menu2.add(menu4);// JMenuItem item1=new JMenuItem("⼈⼈博弈");// JMenuItem item2=new JMenuItem("⼈机博弈");// 设置“”⽬录下⾯的⼦⽬录JRadioButtonMenuItem item1 = new JRadioButtonMenuItem("⼈⼈博弈");JRadioButtonMenuItem item2 = new JRadioButtonMenuItem("⼈机博弈");// item1按钮添加时间并且为匿名类item1.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsManAgainst(true);panel.Start();item1.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Override// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置item2按钮的事件监听事件,也就是设置⼈机博弈item2.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsManAgainst(false);panel.Start();item2.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置按钮组并把⼈机博弈与⼈⼈博弈添加到⼀个按钮组⾥⾯ButtonGroup bg = new ButtonGroup();bg.add(item1);bg.add(item2);// 将按钮组添加到菜单⾥⾯menu4.add(item2);item2.setSelected(true);// 先⾏设置JMenu menu5 = new JMenu("先⾏设置"); // 将“先⾏设置”菜单添加到“设置”⾥⾯menu2.add(menu5);// 设置⿊⼦先⾏还是⽩字先⾏的按钮JRadioButtonMenuItem item3 = new JRadioButtonMenuItem("⿊⽅先⾏");JRadioButtonMenuItem item4 = new JRadioButtonMenuItem("⽩字先⾏");// 设置item3的⿏标点击事件,设置⿊⽅先⾏item3.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsBlack(true);panel.Start();item3.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置item4的⿏标点击事件item4.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setIsBlack(false);panel.Start();item4.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置按钮组并把⼈机博弈与⼈⼈博弈添加到⼀个按钮组⾥⾯ButtonGroup bg1 = new ButtonGroup();bg1.add(item3);bg1.add(item4);// 将按钮组添加到菜单⾥⾯menu5.add(item3);menu5.add(item4);item3.setSelected(true);// 设置“帮助”下⾯的⼦⽬录JMenuItem menu6 = new JMenuItem("帮助");menu3.add(menu6);/** 菜单栏的⽬录设置完毕*/// 开始游戏菜单设置JMenuItem menu7 = new JMenuItem("开始游戏");menu1.add(menu7);JMenuItem menu8 = new JMenuItem("重新开始");menu1.add(menu8);menu7.addMouseListener(new MouseListener() {@Override// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubpanel.Start();// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}});menu8.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否重新开始", "消息", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.Start();}// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}});// 退出游戏选项设置JMenuItem menu9 = new JMenuItem("退出游戏");menu1.add(menu9);menu9.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "退出游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否退出游戏", "消息", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {System.exit(0);// 退出程序}// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}// 游戏难度设置JRadioButtonMenuItem item5 = new JRadioButtonMenuItem("傻⽠");// 添加按钮JRadioButtonMenuItem item6 = new JRadioButtonMenuItem("简单");JRadioButtonMenuItem item7 = new JRadioButtonMenuItem("普通");// JRadioButtonMenuItem item8= new JRadioButtonMenuItem("困难");ButtonGroup bg3 = new ButtonGroup();// 设置按钮组bg3.add(item5);bg3.add(item6);bg3.add(item7);// bg3.add(item8);JMenu menu10 = new JMenu("游戏难度设置");// 添加菜单到主菜单menu2.add(menu10);menu10.add(item5);// 添加选项到难度设置菜单menu10.add(item6);menu10.add(item7);// menu2.add(item8);item5.setSelected(true);// 默认选项按钮// 傻⽠难度设置的⿏标点击事件item5.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setGameDifficulty(0);panel.Start();item5.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub});// 简单难度设置模式item6.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "难度设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setGameDifficulty(1);panel.Start();item6.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 普通难度设置item7.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "⼈机博弈设置", 0, 1, icon, options, "保存并重新开始游戏"); if (n == 0) {panel.setGameDifficulty(2);panel.Start();item7.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});//游戏帮助提⽰信息menu6.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;};JOptionPane.showMessageDialog(null, "制作⼈员:韩红剑");}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});/** 窗⼝⾥⾯的容器设置*/Container con = this.getContentPane(); // 实例化⼀个容器⽗类con.add(panel); // 将容器添加到⽗类/** 窗⼝⾥⾯的容器设置完毕*/}}2.第⼆步,设置显⽰棋盘的容器,⽂件源代码为MyPanel.java package StartGame;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Panel;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.image.*;import java.io.File;import .URL;import java.util.Arrays;import java.util.Random;import javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel;//设置窗体⾥⾯的容器操作public class MyPanel extends JPanel implements MouseListener, Runnable { private static final Toolkit ResourceUtil = null;public Image boardImg; // 定义背景图⽚static int[][] allChess = new int[15][15]; // 棋盘数组static int[][] temporaryChess = new int[15][15];int x;// 保存棋⼦的横坐标int y;// 保存棋⼦的纵坐标Boolean canPlay = false; // 游戏是否继续,默认为继续Boolean isBlack = true;// 是否是⿊⼦,默认为⿊⼦Boolean isManAgainst = false; // 判断是否是⼈⼈对战String message = "⽤户下棋";Thread t = new Thread(this);int maxTime = 120;int blackTime = 120;int whiteTime = 120;String blackMessage = "⽆限制";String whiteMessage = "⽆限制";static int gameDifficulty = 0;// 设置游戏难度,0为傻⽠模式,1为简单,2为普通,3为困难 // 获取isBlack的值public boolean getIsBlack() {return this.isBlack;}// 设置isBlack的值public void setIsBlack(boolean isBlack) {this.isBlack = isBlack;}// 获取isManAgainst的值public boolean getIsManAgainst() {return this.isManAgainst;}// 获取isManAgainst的值public void setIsManAgainst(boolean isManAgainst) {this.isManAgainst = isManAgainst;}// 获取isManAgainst的值public int getGameDifficulty() {return this.gameDifficulty;}// 设置setGameDifficulty的值public void setGameDifficulty(int gameDifficulty) {this.gameDifficulty = gameDifficulty;}// 构造函数public MyPanel() {boardImg = Toolkit.getDefaultToolkit().getImage("./src/StartGame/fiveCHessBourd.jpg"); this.repaint();// 添加⿏标监视器addMouseListener((MouseListener) this);// addMouseMotionListener((MouseMotionListener) this);// this.requestFocus();t.start();t.suspend();// 线程挂起// t.resume();}// 数据初始化@Overridepublic void paint(Graphics g) {super.paint(g);int imgWidth = boardImg.getWidth(this); // 获取图⽚的宽度int imgHeight = boardImg.getHeight(this); // 获取图⽚的⾼度int FWidth = getWidth();int FHeight = getHeight();String message; // 标记谁下棋int x = (FWidth - imgWidth) / 2;int y = (FHeight - imgHeight) / 2;g.drawImage(boardImg, x, y, null); // 添加背景图⽚到容器⾥⾯g.setFont(new Font("宋体", 0, 14));g.drawString("⿊⽅时间:" + blackTime, 30, 470);g.drawString("⽩⽅时间:" + whiteTime, 260, 470);// 绘制棋盘for (int i = 0; i < 15; i++) {g.drawLine(30, 30 + 30 * i, 450, 30 + 30 * i);g.drawLine(30 + 30 * i, 30, 30 + 30 * i, 450);}// 绘制五个中⼼点g.fillRect(240 - 5, 240 - 5, 10, 10); // 绘制最中⼼的正⽅形g.fillRect(360 - 5, 360 - 5, 10, 10); // 绘制右下的正⽅形g.fillRect(360 - 5, 120 - 5, 10, 10); // 绘制右上的正⽅形g.fillRect(120 - 5, 360 - 5, 10, 10);// 绘制左下的正⽅形g.fillRect(120 - 5, 120 - 5, 10, 10);// 绘制左上的正⽅形// 定义棋盘数组for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {// if (allChess[i][j] == 1) {// // ⿊⼦// int tempX = i * 30 + 30;// int tempY = j * 30 + 30;// g.fillOval(tempX - 7, tempY - 7, 14, 14);// }// if (allChess[i][j] == 2) {// // ⽩⼦// int tempX = i * 30 + 30;// int tempY = j * 30 + 30;// g.setColor(Color.WHITE);// g.fillOval(tempX - 7, tempY - 7, 14, 14);// g.setColor(Color.BLACK);// g.drawOval(tempX - 7, tempY - 7, 14, 14);// }draw(g, i, j); // 调⽤下棋⼦函数}}}// ⿏标点击时发⽣的函数@Overridepublic void mousePressed(MouseEvent e) {// x = e.getX();// 获取⿏标点击坐标的横坐标// y = e.getY();// 获取⿏标点击坐标的纵坐标// if (x >= 29 && x <= 451 && y >= 29 && y <= 451) { // ⿏标点击在棋⼦框⾥⾯才有效 //// }if (canPlay == true) {// 判断是否可以开始游戏x = e.getX(); // 获取⿏标的焦点y = e.getY();if (isManAgainst == true) {// 判断是否是⼈⼈对战manToManChess();} else { // 否则是⼈机对战,⼈机下棋manToMachine();}}}// 判断是否输赢的函数private boolean checkWin(int x, int y) {// TODO Auto-generated method stubboolean flag = false;// 保存共有多少相同颜⾊棋⼦相连int count = 1;// 判断横向特点:allChess[x][y]中y值相同int color = allChess[x][y];// 判断横向count = this.checkCount(x, y, 1, 0, color);if (count >= 5) {flag = true;} else {// 判断纵向count = this.checkCount(x, y, 0, 1, color);if (count >= 5) {flag = true;} else {// 判断右上左下count = this.checkCount(x, y, 1, -1, color);if (count >= 5) {flag = true;} else {// 判断左下右上count = this.checkCount(x, y, 1, 1, color);if (count >= 5) {flag = true;}}}}return flag;}// 判断相同棋⼦连接的个数private int checkCount(int x, int y, int xChange, int yChange, int color) {// TODO Auto-generated method stubint count = 1;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14 && 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 <= 14 && y - yChange >= 0 && y - yChange <= 14 && color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}return count;}// 机器⼈判断⿊棋相连的数量private int checkCountMachine(int x, int y, int xChange, int yChange, int color) {// TODO Auto-generated method stubint count = 0;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14 && 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 <= 14 && y - yChange >= 0 && y - yChange <= 14 && color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}return count;}public void paintConmponents(Graphics g) {super.paintComponents(g);}// 绘制⿊⽩棋⼦public void draw(Graphics g, int i, int j) {if (allChess[i][j] == 1) {g.setColor(Color.black);// ⿊⾊棋⼦g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);g.drawString(message, 230, 20);}if (allChess[i][j] == 2) {g.setColor(Color.white);// ⽩⾊棋⼦g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);g.drawString(message, 230, 20);}}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void run() {// TODO Auto-generated method stub// 判断是否有时间限制if (maxTime > 0) {while (true) {// System.out.println(canPlay + "11");if (isManAgainst) {if (isBlack) {blackTime--;if (blackTime == 0) {JOptionPane.showMessageDialog(this, "⿊⽅超时,游戏结束!"); }} else {whiteTime--;if (whiteTime == 0) {JOptionPane.showMessageDialog(this, "⽩⽅超时,游戏结束!"); }}} else {// 监控⿊⼦下棋的时间,也就是⽤户下棋的时间blackTime--;if (blackTime == 0) {JOptionPane.showMessageDialog(this, "⽤户超时,游戏结束!");}// 不监控电脑⽩字下棋}blackMessage = blackTime / 3600 + ":" + (blackTime / 60 - blackTime / 3600 * 60) + ":" + (blackTime - blackTime / 60 * 60);whiteMessage = whiteTime / 3600 + ":" + (whiteTime / 60 - whiteTime / 3600 * 60) + ":" + (whiteTime - whiteTime / 60 * 60);this.repaint();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}// 点击开始游戏设置属性,游戏开始public void Start() {this.canPlay = true;for (int i = 0; i < 14; i++) {for (int j = 0; j < 14; j++) {allChess[i][j] = 0;}}if (canPlay == true) {t.resume();}this.repaint();JOptionPane.showMessageDialog(this, "游戏开始了,请开始下棋");if (isBlack == false && isManAgainst == false) {machineChess(gameDifficulty);}// 另⼀种⽅式 allChess=new int[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();// 如果不重新调⽤,则界⾯不会刷新}// ⼈⼈对战下棋函数public void manToManChess() {if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标y = (y + 15) / 30 - 1;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋⼦if (isBlack == true) {allChess[x][y] = 1;isBlack = false;blackTime = 120;message = "轮到⽩⽅";} else {allChess[x][y] = 2;isBlack = true;whiteTime = 120;message = "轮到⿊⽅";}}// 判断这个棋⼦是否和其他棋⼦连成5个boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋⼦if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "⿊⽅" : "⽩⽅") + "获胜!"); canPlay = false;}} else {// JOptionPane.showMessageDialog(this,// "当前位⼦已经有棋⼦,请重新落⼦");}}// ⼈机对战下棋函数public void manToMachine() {if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标y = (y + 15) / 30 - 1;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋⼦if (isBlack == true) {allChess[x][y] = 1;this.repaint(); // 绘制棋⼦machineChess(gameDifficulty);isBlack = true;blackTime = 120;message = "⽤户下棋";whiteTime = 120;boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋⼦if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "⿊⽅" : "⽩⽅") + "获胜!"); canPlay = false;}} else {allChess[x][y] = 1;// allChess[x][y] = 2;this.repaint();isBlack = false;whiteTime = 120;blackTime = 120;boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋⼦if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "⿊⽅" : "⽩⽅") + "获胜!"); canPlay = false;}machineChess(gameDifficulty);}}// 判断这个棋⼦是否和其他棋⼦连成5个// boolean winFlag = this.checkWin(x, y);// this.repaint(); // 绘制棋⼦//// if (winFlag == true) {// JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] ==// 1 ? "⿊⽅" : "⽩⽅") + "获胜!");// canPlay = false;// }}}。
JAVA五子棋游戏(控制台程序)
JAVA五子棋游戏(控制台程序)//==================类1================================public class Chessboard{private String[][] init;static final int BOARD_SIZE = 22;public void initBoard(){// 初始化棋盘,开始新的游戏时,应该调用此方法init = new String[15][15];for (int i = 0; i < init.length; i++){for (int j = 0; j < init[i].length; j++){init[i][j] = "﹢";}}}public void printBoard(){// 在控制台输出棋盘,各方每一完一颗棋子后,由于棋盘上棋子的状态有改变,// 所以必须调用此方法重新输入棋盘for (String[] row : init){for (String string : row){System.out.print(string);}System.out.println();}}public void setBoard(int posX, int posY, String chessman){// posX与posY是新下棋子的x与y坐标,,chessman是新下棋子的类型(黑子与白子),// 每下完一颗棋子后,通过调用此方法把棋子设置到棋盘上。
if (chessman.equals(Chessman.WHITE.getChessman())){init[posX][posY] = chessman;}else{init[posX][posY] = Chessman.BLACK.getChessman();}}public String[][] getBoard(){// 返回棋盘,返回类型是保存棋盘的二维数组return init;}}//================类2========================public enum Chessman{BLACK("●"), WHITE("○");private String chessman;private Chessman(String chessman){this.chessman = chessman;}public String getChessman(){return this.chessman;}}//=============类3===============================import java.util.Random;import java.util.Scanner;public class GobangGame{public static final int WIN_COUNT = 5;private int posX = 0, posY = 0;private Chessboard chessboard;/** public GobangGame() {** }*/public GobangGame(Chessboard chessboard){this.chessboard = chessboard;}public boolean isVaild(String inputStr){// 此方法验证控制台的输入字符串是否合法,如果合法,返回true,// 如果不合法,则返回false,此方法抛出Exception异常int[] p = new int[2];String[] pointStrings = inputStr.split(",");try{for (int i = 0; i < pointStrings.length; i++){p[i] = Integer.parseInt(pointStrings[i]) - 1;}}catch (Exception e){// TODO Auto-generated catch blockSystem.out.println("输入格式不合法,请重新输入!");return false;}if ((p[0] >= 0 && p[0] < 15) && (p[1] >= 0 && p[1] < 15)) {if (!chessboard.getBoard()[p[1]][p[0]].equals("﹢")){System.out.println("位置不合法,请重新输入!");return false;}else{posX = p[1];posY = p[0];chessboard.setBoard(posX, posY, Chessman.BLACK.getChessman());chessboard.printBoard();return true;}}else{System.out.println("x与y的坐标只能是1~15的数字,请重新输入!");return false;}}public void start(){// 开始游戏// Chessboard chessboard=new Chessboard();chessboard.initBoard();System.out.println("初始化棋盘。
java程序设计(五子棋)一个文件
package 五子棋;import javax.imageio.ImageIO;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;public class FiveChessGame extends JFrame implements MouseListener,Runnable{ public static void main(String args[]){FiveChessGame ff = new FiveChessGame();}int height = Toolkit.getDefaultToolkit().getScreenSize().height;int width = Toolkit.getDefaultToolkit().getScreenSize().width;BufferedImage bgImage = null;int x = 0;int y = 0;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 = "无限制";public FiveChessGame(){this.setTitle("五子棋");this.setSize(500,500);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setLocation((width - 500)/2, (height - 500)/2);this.addMouseListener(this);this.setVisible(true);t.start();t.suspend();this.repaint();try{bgImage = ImageIO.read(new File("E:/image/bgImage.jpg"));} catch (IOException e){e.printStackTrace();}}public void paint(Graphics g){BufferedImage bi = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);Graphics g2 = bi.createGraphics();g2.drawImage(bgImage, 0,0, this);g2.setColor(Color.black);g2.setFont(new Font("黑体",Font.BOLD,25));g2.drawString("游戏信息: " + message, 20,60);g2.setFont(new Font("宋体",Font.BOLD,20));g2.setColor(Color.white);g2.fillRect(15, 460,185, 25);g2.fillRect(255, 460,185, 25);g2.setColor(Color.black );g2.drawString("黑方时间:"+blackMessage, 20,480);g2.drawString("白方时间:"+whiteMessage, 260,480);g2.setColor(Color.blue);g2.fill3DRect(390, 70, 90, 30,true);g2.fill3DRect(390, 120, 90, 30,true);g2.fill3DRect(390,170, 90, 30,true);g2.fill3DRect(390,220, 90, 30,true);g2.fill3DRect(390,270, 90, 30,true);g2.fill3DRect(390, 320, 90, 30,true);g2.fill3DRect(390, 370, 90, 30,true);g2.fill3DRect(390, 420, 90, 30,true);g2.setColor(Color.yellow);g2.drawString("开始游戏", 394, 93);g2.drawString("游戏设置", 394, 143);g2.drawString("游戏说明", 394, 193);g2.drawString("暂停", 412,243);g2.drawString("继续", 412, 293);g2.drawString("认输", 412, 343);g2.drawString("关于", 412, 393);g2.drawString("退出", 412, 443);g2.setColor(Color.black);for(int i=0;i<19;i++){g2.drawLine(10, 70+20*i, 370, 70+20*i);g2.drawLine(10+20*i, 70, 10+20*i, 430);}g2.fillOval(66, 126, 8, 8);g2.fillOval(306, 126, 8, 8);g2.fillOval(306, 366, 8, 8);g2.fillOval(66, 366, 8, 8);g2.fillOval(306, 246, 8, 8);g2.fillOval(186, 126, 8, 8);g2.fillOval(66, 246, 8, 8);g2.fillOval(186, 366, 8, 8);g2.fillOval(186, 246, 8, 8);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;g2.fillOval(tempX-8, tempY-8, 16, 16);}if(allChess[i][j] == 2){int tempX = i*20+10;int tempY = j*20+70;g2.setColor(Color.white);g2.fillOval(tempX-8, tempY-8, 16, 16);g2.setColor(Color.black);g2.drawOval(tempX-8, tempY-8, 16, 16);}}}g.drawImage(bi, 0, 0, this);}public void mouseClicked (MouseEvent e){}public void mouseExited (MouseEvent e){}public void mouseEntered (MouseEvent e){}public void mouseReleased (MouseEvent e){}public void mousePressed (MouseEvent e){//System.out.println("X坐标:"+e.getX()+" "+"Y坐标"+e.getY());if(canPlay == true){x = e.getX();y = e.getY();if(x >=10 && x<=370 && y>=70 && y<=430){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 = "轮到黑方";}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()>=390 && e.getY()>=70 && e.getX()<=480 && e.getY()<=100){int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");if (result == 0){for (int i =0;i<19;i++){for (int j =0;j<19;j++){allChess[i][j] = 0;canPlay = true;}}//allChess = new int[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()>=390 && e.getX()<=480 && 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){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){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()>=390 && e.getX()<=480 && e.getY()>=170 && e.getY()<=200){JOptionPane.showMessageDialog(this, "这是一个五子棋游戏程序,黑白双方轮流下棋,当某一方连到五子时游戏结束!");}if(e.getX()>=390 && e.getX()<=480 && e.getY()>=220 && e.getY()<=250){//JOptionPane.showMessageDialog(this, "游戏已暂停");canPlay = false;}if(e.getX()>=390 && e.getX()<=480 && e.getY()>=270 && e.getY()<=300){//JOptionPane.showMessageDialog(this, "游戏继续进行");canPlay = true;}if(e.getX()>=390 && e.getX()<=480 && e.getY()>=320 && e.getY()<=350){int result = JOptionPane.showConfirmDialog(this, "是否确认认输?");//System.out.println(result);if(result == 0){if(isBlack == true){JOptionPane.showMessageDialog(this, "黑方已经认输,游戏结束!");}else {JOptionPane.showMessageDialog(this, "白方已经认输,游戏结束!");}canPlay = false;}}if(e.getX()>=390 && e.getX()<=480 && e.getY()>=370 && e.getY()<=400){JOptionPane.showMessageDialog(this, "本游戏由软件09班韩新凯学习制作!");}if(e.getX()>=390 && e.getX()<=480 && e.getY()>=420 && e.getY()<=450){JOptionPane.showMessageDialog(this, "游戏结束");System.exit(0);}}private boolean checkWin(){boolean flag = false;int count = 1;int color = allChess[x][y];/*int i = 1;while (color == allChess[x+i][y]){count ++;i++;}i = 1;while (color == allChess[x-i][y]){count ++;i++;}if(count >= 5){flag = true;}int i2 = 1;int count2 = 1;while (color == allChess[x][y+i2]){count2 ++;i2++;}i2 = 1;while (color == allChess[x][y-i2]){count2 ++;i2++;}if(count2 >= 5){flag = true;}int i3 =1;int count3 = 1;while (color == allChess[x+i3][y-i3]){ count3 ++;i3++;}i3 = 1;while (color == allChess[x-i3][y+i3]){ count3 ++;i3++;}if(count3 >= 5){flag = true;}int i4 =1;int count4 = 1;while (color == allChess[x+i4][y+i4]){ count4 ++;i4++;}i4 = 1;while (color == allChess[x-i4][y-i4]){count4 ++;i4++;}if(count4 >= 5){flag = true;}*/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;}public void run(){if (maxTime > 0){while (true){if (isBlack){blackTime --;if (blackTime == 0){JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");}}else{whiteTime --;if (whiteTime == 0){JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");}}blackMessage = blackTime/3600+":"+(blackTime/60-blackTime/3600*60)+":"+(blackTime-blackTime/60*60);whiteMessage = whiteTime/3600+":"+(whiteTime/60-whiteTime/3600*60)+":"+(whiteTime-whiteTime/60*60);this.repaint();try{Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}}}}}。
五子棋代码(JAVA)
package ui;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;public class Welcome extends JLabel implements ActionListener {/*** 欢迎界面*/private static final long serialVersionUID = 1L;private FIR father = null;private JButton btnTwoGame = null;// 游戏界面按钮private JButton btnHelp = null;// 游戏帮助按钮private JButton btnExit = null;// 游戏退出按钮/*** Launch the application** @param args*//*** Create the application*/public Welcome(FIR father) {this.father = father;this.setIcon(IconResourses.bgWelcome);initialize();}/*** Initialize the contents of the frame*/private void initialize() {this.setLayout(null);// 先设置布局,再添加组件/** 实例化btnHelp,btnTwoGame,btnExit并设置相关属性,注册监听器*/btnHelp = new JButton(IconResourses.btnHelp);btnHelp.addActionListener(this);btnHelp.setBounds(450, 290, 138, 43);this.add(btnHelp);btnTwoGame = new JButton(IconResourses.btnTwoGame);btnTwoGame.addActionListener(this);btnTwoGame.setBounds(450, 230, 138, 43);this.add(btnTwoGame);btnExit = new JButton(IconResourses.btnExit);btnExit.setBounds(450, 350, 138, 43);btnExit.addActionListener(this);this.add(btnExit);}public void actionPerformed(ActionEvent e) {if (e.getSource() == btnTwoGame) {// 游戏按钮响应方法father.show("game");// 显示游戏界面} else if (e.getSource() == btnHelp) {// 游戏帮助响应方法father.show("help");// 显示帮助界面} else if (e.getSource() == btnExit) {// 游戏退出响应方法// 点击"是"确定退出游戏if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this,"确定退出游戏吗?", "五子棋", JOptionPane.YES_NO_OPTION)) { System.exit(0);}}}}package ui;import javax.swing.JLabel;public class ChessGrid extends JLabel {/*** 棋格*/private static final long serialVersionUID = 1L;private JLabel rim= null;private int row = 0; // 标志当前棋格的行private int col = 0; // 标志当前棋格的列private int flag = 0;// 标志当前棋格的状态:0无子,1黑子,2白子/*** 棋格构造函数无棋子状态** @param row 指定行位置* @param col 指定列位置*/public ChessGrid(int row, int col) {this.row = row;this.col = col;this.init();// 设用类成员初始化方法}/*** 棋格构造函数同时指定棋子状态** @param row 指定行位置* @param col 指定列位置* @param flag:指定状态*/public ChessGrid(int row, int col, int flag) {this.row = row;this.col = col;this.flag = flag;this.init();// 设用类成员初始化方法}/*** 初始化类成员*/private void init() {// 实例化类成员rim = new JLabel(IconResourses.rim);// 设置类成员相关属性rim.setBounds(0, 0, 35, 35);rim.setVisible(false);// 先设置布局,后添加组件this.setLayout(null);this.add(rim);}// 设置选框是否可见public void setRim(boolean flag) {rim.setVisible(flag);}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}// 返回当前棋格的状态public int getFlag() {return flag;}// 设置当前棋格的状态public void setFlag(int flag) {this.flag = flag;if (flag == 0) {this.setIcon(null);} else if (flag == 1) {this.setIcon(IconResourses.lblBlack);} else if (flag == 2) {this.setIcon(IconResourses.lblWhite);}}package ui;import javax.swing.Icon;import javax.swing.ImageIcon;public class IconResourses {public static Icon lblWhite=new ImageIcon(IconResourses.class.getResource("bai.gif"));//白棋子public static Icon lblBlack=new ImageIcon(IconResourses.class.getResource("hei.gif"));//黑棋子public static Icon bq_yiban=new ImageIcon(IconResourses.class.getResource("yiban.gif"));//表情一般public static Icon bq_shikao=new ImageIcon(IconResourses.class.getResource("shikao.gif"));//表情思考public static Icon yiban=new ImageIcon(IconResourses.class.getResource("yiban.gif"));public static Icon lose=new ImageIcon(IconResourses.class.getResource("lose.gif"));//表情一般public static Icon victory=new ImageIcon(IconResourses.class.getResource("victory.gif"));//胜利表情public static Icon btn_pass_un=new ImageIcon(IconResourses.class.getResource("btn_pass_un.gif"));//通过public static Icon btn_pass_on=new ImageIcon(IconResourses.class.getResource("btn_pass_on.gif"));//通过public static Icon btn_reset_un=new ImageIcon(IconResourses.class.getResource("btn_reset_un.gif"));//重置public static Icon btn_reset_on=new ImageIcon(IconResourses.class.getResource("btn_reset_on.gif"));//重置public static Icon btn_send=new ImageIcon(IconResourses.class.getResource("send.jpg"));//发送按钮public static Icon btn_return_un=new ImageIcon(IconResourses.class.getResource("btn_return_un.gif"));//返回public static Icon btn_return_on=new ImageIcon(IconResourses.class.getResource("btn_return_on.gif"));//返回public static Icon btn_goon_on=new ImageIcon(IconResourses.class.getResource("btn_goon_on.gif"));public static Icon btn_goon_un=new ImageIcon(IconResourses.class.getResource("btn_goon_un.gif"));public static Icon btn_start_on=new ImageIcon(IconResourses.class.getResource("btn_start_on.gif"));//开始public static Icon btn_start_un=new ImageIcon(IconResourses.class.getResource("btn_start_on.gif"));//开始public static Icon btn_back_on=new ImageIcon(IconResourses.class.getResource("btn_back_on.gif"));//返回public static Icon btn_back_un=new ImageIcon(IconResourses.class.getResource("btn_back_on.gif"));//返回public static Icon btnHelp=new ImageIcon(IconResourses.class.getResource("help.gif"));//帮助按钮背景public static Icon btnExit=new ImageIcon(IconResourses.class.getResource("exit.gif")); //退出游戏按钮背景public static Icon btnTwoGame=new ImageIcon(IconResourses.class.getResource("twogame.gif"));//双人游戏按钮背景public static Icon btnReturn=new ImageIcon(IconResourses.class.getResource("return.jpg"));public static Icon bgWelcome=new ImageIcon(IconResourses.class.getResource("welcome.gif"));//欢迎界面背景public static Icon bgMain=new ImageIcon(IconResourses.class.getResource("main.gif"));//游戏主界面背景public static Icon bgHelp=new ImageIcon(IconResourses.class.getResource("bg_help.gif"));//帮助界面背景public static Icon rim=new ImageIcon(IconResourses.class.getResource("kuang.gif"));//棋子外框public static Icon sound=new ImageIcon(IconResourses.class.getResource("bg.mid"));//背景音乐}package ui;import java.applet.Applet;import java.applet.AudioClip;/*** 播放声音类* 支持格式: .au、.aiff、.Wav、.Midi、.rfm*/public class Sound{//音乐路径private String url="bg.mid";//音乐对象private AudioClip audio=null;//默认构造函数,播放背景音乐public Sound(){this.init();}//根据新路径播放音乐public Sound(String url){this.url=url;this.init();}//初始化类成员private void init(){if(!"".equals(url)){try {audio = Applet.newAudioClip(Sound.class.getResource(url));} catch (Exception e) {e.printStackTrace();}}}//单曲public void play(){if(audio!=null){audio.stop();audio.play();}}//停止播放public void stop(){if(audio!=null){audio.stop();}}//循环播放public void loop(){if(audio!=null){audio.loop();}}}package ui;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JLabel;/*** 游戏帮助界面* @author*/public class Help extends JLabel implements ActionListener {/*** 版本号*/private static final long serialVersionUID = 1L;private FIR father = null;//父容器引用,构造函数中传入private JButton btnReturn = null;//返回欢迎界面按钮/*** 游戏帮助界面构造函数* @param father父容器引用*/public Help(FIR father) {//父容器引用传入,赋值this.father = father;//调用类成员初始化方法this.init();//此类继函至JLabel,以此可设置游戏欢迎界面的背景this.setIcon(IconResourses.bgHelp);}/*** 初始化方法* 此方法主要目的是:1 实例化类成员2 布局*/private void init(){//实例化类成员btnReturn = new JButton(IconResourses.btnReturn);//设置类成员位置大小btnReturn.setBounds(310, 470, 50,23);//为类成员注册监听器btnReturn.addActionListener(this);//先设设置布局,再添加组件this.setLayout(null);//添加组件this.add(btnReturn);}public void actionPerformed(ActionEvent e) {if (e.getSource() == btnReturn) {//返回按钮响应方法//显示欢迎界面father.show("welcome");}}}package ui;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;import javax.swing.*;public class Timer extends JPanel implements Runnable{/*** 时间设置以JLable作为载体*/private static final long serialVersionUID = 1L;private static Image image=Toolkit.getDefaultToolkit().createImage(Timer.class.getResource("number.gif"));private Game father;//调用父类private int secTemp;//从play开始到pause用了多少秒,每次play之后归0,secTemp记录从双方每一次落子到落子完成并暂停计时器时所消耗的时间private int seconds=1800;//比赛总时间private Thread time;//时间线程private boolean flag;//是否处于计时中/** 构造函数,默认比赛总时间为30分钟*/public Timer(Game father){this.father=father;this.init();}/** 构造函数,设置比赛总时间*/public Timer(Game father,int seconds){this.father=father;this.seconds=seconds;this.init();}/** 对私有属性seconds公开化*/public int getSeconds(){return this.seconds;}public void setSeconds(int seconds){this.seconds=seconds;this.repaint();//重置完时间后,刷新画板}/** 初始化相关成员*/private void init(){this.setBackground(Color.black);flag=false;time=new Thread(this);time.start();//启动线程,使其处于就绪状态}/** 重写JLalbe中的paint方法*/public void paint(Graphics g){super.paint(g);int temp=seconds/60;int i=0;//画分钟十位i=temp/10;g.drawImage(image, 0, 0, 9, 16, i*9, 0, (i+1)*9, 16, this);//画分钟个位i=temp%10;g.drawImage(image, 10, 0, 19, 16, i*9, 0, (i+1)*9, 16, this);//画中间线g.drawImage(image, 20, 0,29 ,16, 90, 0, 99, 16, this);//计算出秒数temp=seconds%60;//画秒钟个位i=temp/10;g.drawImage(image, 30, 0, 39, 16, i*9, 0, (i+1)*9, 16, this);//画秒钟个位i=temp%10;g.drawImage(image, 40, 0,49, 16, i*9, 0, (i+1)*9, 16, this); }/** 暂停时间*/public void pause(){this.flag=false;}/** 继续时间*/public void play(){this.flag=true;this.secTemp=0;}/** 实现线程的run接口*/public void run(){while(true){if(flag){if(seconds>0){seconds--;secTemp++;this.repaint();}else{father.timeOver();}}try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}}}public int getSecTemp(){return this.secTemp;}}package ui;import java.awt.Cursor;import java.awt.Graphics;import java.awt.Image;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.util.ArrayList;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;public class Game extends JLabel implements MouseListener, ActionListener { /*** 游戏主界面*/private static final long serialVersionUID = 1L;private FIR father;private ChessGrid[][] crosses = new ChessGrid[15][15];// 实例化棋盘数组private ChessGrid temp = null;// 上一步棋格private int start = 0;// 游戏运行状态0未开始1进行中2暂停3回放private boolean flag = true;// 哪方行棋,true为黑方,false为白方private JButton btnStart = null;// 开始按钮private JButton btnReturn = null;// 返回按钮private JButton btnPass = null;// 暂停按钮private JButton btnBack = null;// 悔棋private Timer palTimeBai = null;// 白方剩余时间private Timer palTimeHei = null;// 黑方剩余时间private JLabel lblEmotionBai = null;// 白方表情private JLabel lblEmotionHei = null;// 黑方表情private ArrayList<ChessGrid> qb = null;// 棋步private Image image;// 鼠标图片/** 构造函数,转到FIR中去*/public Game(FIR father) {this.father = father;init();// 初始化类成员getImage("hei.gif");// 当转到该界面时,鼠标变成黑色的棋子this.setVisible(true);this.reSet();// 重置游戏参数}/** 初始化*/public void init() {this.setIcon(IconResourses.bgMain);// 棋盘背景界面this.setLayout(null);// 无布局// 循环棋盘格子,实例化,设置属性,同时添加监听器,并添加到游戏界面上int i = 0;// 行int j = 0;// 列for (i = 0; i < 15; i++) {for (j = 0; j < 15; j++) {crosses[i][j] = new ChessGrid(i, j);crosses[i][j].setBounds(163 + j * 35, 13 + i * 35, 35, 35);crosses[i][j].addMouseListener(this);this.add(crosses[i][j]);}}// 实例化保存棋步的容器qb = new ArrayList<ChessGrid>();// 实例化其它成员lblEmotionBai = new JLabel(IconResourses.bq_yiban);lblEmotionHei = new JLabel(IconResourses.bq_yiban);btnStart = new JButton(IconResourses.btn_start_on);btnBack = new JButton(IconResourses.btn_back_un);btnPass = new JButton(IconResourses.btn_pass_un);btnReturn = new JButton(IconResourses.btn_return_on);/** 黑白双方时间*/palTimeBai = new Timer(this);// palTimeBai.setSeconds(600);palTimeBai.setVisible(true);palTimeHei = new Timer(this);// palTimeHei.setSeconds(600);palTimeHei.setVisible(true);// 设置其它成员属性lblEmotionBai.setBounds(45, 65, 65, 65);lblEmotionHei.setBounds(45, 345, 65, 65);palTimeBai.setBounds(73, 206, 50, 16);palTimeHei.setBounds(73, 487, 50, 16);btnStart.setBounds(13, 250, 30, 60);btnBack.setBounds(78, 250, 30, 60);btnPass.setBounds(45, 250, 30, 60);btnReturn.setBounds(110, 250, 30, 60);// btnStart.setDisabledIcon(IconResourses.btn_start_un);// btnBack.setDisabledIcon(IconResourses.btn_back_un);// btnPass.setDisabledIcon(IconResourses.btn_pass_un);// btnReturn.setDisabledIcon(IconResourses.btn_return_un);btnStart.addActionListener(this);btnBack.addActionListener(this);btnPass.addActionListener(this);btnReturn.addActionListener(this);// 添加其它成员this.add(palTimeBai);this.add(palTimeHei);this.add(lblEmotionBai);this.add(lblEmotionHei);this.add(btnStart);this.add(btnBack);this.add(btnPass);this.add(btnReturn);}public void reSet() {// 重置棋盘for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {crosses[i][j].setFlag(0);crosses[i][j].setRim(false);}}start = 0;// 游戏标志设置为0,未开始flag = true;// 重新开始游戏,黑方先行棋// 暂停时间,并重置为1800秒palTimeBai.pause();palTimeBai.setSeconds(1800);palTimeHei.pause();palTimeHei.setSeconds(1800);// 重置表情lblEmotionBai.setIcon(IconResourses.bq_yiban);lblEmotionHei.setIcon(IconResourses.bq_yiban);qb.clear();// 清空棋步数组// 重置按钮图标btnStart.setIcon(IconResourses.btn_start_on);btnPass.setIcon(IconResourses.btn_pass_on);// 锁定一些功能按钮btnBack.setEnabled(false);btnPass.setEnabled(false);}/** 实现四个按钮的动作监听*/public void actionPerformed(ActionEvent e) {if (e.getSource() == btnStart) {// 开始游戏或重置游戏if (start == 0) {// 游戏未开始,执行开始操作btnStart.setIcon(IconResourses.btn_reset_on);// 开始按钮变为重置按钮btnPass.setIcon(IconResourses.btn_pass_on);// 暂停按钮变为可用的按钮btnBack.setIcon(IconResourses.btn_back_un);// 悔棋按钮变为可用的按钮/** 初始化并将黑子居中*/crosses[7][7].setBounds(163 + 7 * 35, 13 + 7 * 35, 35, 35);crosses[7][7].setFlag(1);crosses[7][7].setRim(true);qb.add(crosses[7][7]);// palTimeHei.play();// palTimeBai.pause();getImage("bai.gif");// 鼠标变成白子的图片flag = false;// 下一步为白子// 黑方先走,开始计时if (flag == true) {palTimeHei.play();palTimeBai.pause();} else {palTimeBai.play();palTimeHei.pause();}lblEmotionBai.setIcon(IconResourses.bq_shikao);// 设置黑方表情btnPass.setEnabled(true);// 暂停按钮可用btnBack.setEnabled(false);// 悔棋按钮不可用start = 1;// 标志游戏是在进行中} else {// 否则执行游戏重置操作this.reSet();}} else if (e.getSource() == btnPass) {// 暂停或继续游戏if (start == 1) {// 游戏进行中,进行暂停操作// 暂停时间palTimeBai.pause();palTimeHei.pause();start = 2;// 标志游戏为暂停状态btnPass.setIcon(IconResourses.btn_goon_on);// 更改成继续图标/** 暂停中不可悔棋*/btnBack.setIcon(IconResourses.btn_back_un);btnBack.setEnabled(false);} else if (start == 2) {// 游戏暂停中,进行继续操作// 根据当前是哪方下子,play相应的时间if (flag == true) {// 黑方行棋,开始计时palTimeHei.play();} else {// 白方行棋,开始计时palTimeBai.play();}start = 1;// 标志游戏为进行状态btnPass.setIcon(IconResourses.btn_pass_on);// 更改成暂停图标/** 游戏进行中可悔棋*/btnBack.setIcon(IconResourses.btn_back_on);btnBack.setEnabled(true);}} else if (e.getSource() == btnBack) {// 悔棋// 有棋步记录,且获得对方的同意,才可以悔棋int answer = JOptionPane.showConfirmDialog(null, "对方请求悔棋,是不答应?","信息", JOptionPane.YES_NO_OPTION);if (qb.size() > 0) {// 清除掉可能后来选择的一些格子方框if (temp != null) {temp.setRim(false);}// 取得最后下的一步棋,同时将它从棋步数组中移除/** 只能在白方行了第二着棋之后才能悔棋*/if (answer == 0 && qb.size() >= 5) {// 如果用户点击“确定”所做的操作ChessGrid box = qb.remove(qb.size() - 1);// 置空最后一步棋box.setFlag(0);box.setRim(false);}else{btnBack.setEnabled(false);}// 下棋角色,时间,表情对换// int answer=1;if (flag) {// 当前为黑方下棋,说明是白方悔棋flag = false;lblEmotionBai.setIcon(IconResourses.bq_shikao);lblEmotionHei.setIcon(IconResourses.bq_yiban);// 把被白方浪费掉的时间,返还给黑方,同时被浪费掉的这部分时间视为白方的palTimeHei.pause();int timewasteHei = palTimeHei.getSecTemp();// 黑棋还未下这一步棋所用时间palTimeHei.setSeconds(palTimeHei.getSeconds()+ timewasteHei);// palTimeBai.setSeconds(palTimeBai.getSeconds()-timewasteHei);palTimeBai.play();getImage("bai.gif");}} else {// 当前为白方下棋,说明是黑方悔棋flag = true;lblEmotionBai.setIcon(IconResourses.bq_yiban);lblEmotionHei.setIcon(IconResourses.bq_shikao);// 把被黑方浪费掉的时间,返还给白方,同时被浪费掉的这部分时间视为黑方的palTimeBai.pause();int timewasteBai = palTimeBai.getSecTemp();// 白棋上一步棋所用时间palTimeBai.setSeconds(palTimeBai.getSeconds() + timewasteBai);// palTimeHei.setSeconds(palTimeHei.getSeconds()-timewasteBai);palTimeHei.play();getImage("hei.gif");}// 没有棋步记录时,悔棋不可用,否则取得当前棋步数组中的最后一个子,进行红框标注if (qb.size() == 0) {btnBack.setEnabled(false);} else {// get(index)和remove(index)都返回当前数组中的最后一个对象// 区别是,get仅返回不从数组中删除这个对象,而remove返回的同时从数组中移除这个对象qb.get(qb.size() - 1).setRim(true);btnBack.setIcon(IconResourses.btn_back_on);btnBack.setEnabled(true);}} else if (e.getSource() == btnReturn) {// 返回欢迎界面// 游戏中,提示是否返回if (start > 0) {if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this, "正在游戏中,返回将导至游戏信息丢失!", "五子棋",JOptionPane.YES_NO_OPTION)) {father.show("welcome");// 重置游戏this.reSet();}} else {father.show("welcome");}}}/** 当改白子行棋时鼠标上的图片变成白棋的图片,当改黑子行棋时鼠标上的图片变成黑棋的图片*/private void getImage(String image_url) {image = java.awt.Toolkit.getDefaultToolkit().createImage(FIR.class.getResource(image_url));Cursor transparentCursor = java.awt.Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisiblecursor"); // invisiblecursor是任意取的this.setCursor(transparentCursor);}/** 下棋的事件操作方法*/public void mouseClicked(MouseEvent e) {}/** 实现落子功能*/public void mousePressed(MouseEvent e) {crosses[7][7].setRim(false);/* 去掉当前棋上一步棋的外框*/if (qb.size() != 0) {temp = qb.get(qb.size() - 1);temp.setRim(false);}if (qb.size() == 4) {btnBack.setEnabled(true);}ChessGrid lblChessGrid = (ChessGrid) e.getSource();// 按键触发的是棋格上的JLableif (start == 1 && e.getButton() == 1) {// 游戏是否在进行中,同时只有左键起效if (lblChessGrid.getFlag() == 0) {// 只有无子的情况下,才允许落子,有子的情况下,不允许落子if (flag == false) {// 白子行棋getImage("hei.gif");// 鼠标变成黑子palTimeBai.pause();palTimeHei.play();lblChessGrid.setFlag(2);lblChessGrid.setVisible(true);lblChessGrid.setRim(true);qb.add(lblChessGrid);lblEmotionBai.setIcon(IconResourses.bq_yiban);lblEmotionHei.setIcon(IconResourses.bq_shikao);if (checkWin(lblChessGrid.getRow(), lblChessGrid.getCol())) {// System.out.println("fdk;");lblEmotionBai.setIcon(IconResourses.victory);lblEmotionHei.setIcon(IconResourses.lose);palTimeHei.pause();JOptionPane.showMessageDialog(this, "白方赢了!");this.gameOver();}flag = true;} else {// 黑子行棋getImage("bai.gif");// 鼠标变成白子palTimeHei.pause();palTimeBai.play();lblChessGrid.setFlag(1);lblChessGrid.setVisible(true);lblChessGrid.setRim(true);qb.add(lblChessGrid);lblEmotionBai.setIcon(IconResourses.bq_shikao);lblEmotionHei.setIcon(IconResourses.bq_yiban);if (checkWin(lblChessGrid.getRow(), lblChessGrid.getCol())) {lblEmotionBai.setIcon(IconResourses.lose);lblEmotionHei.setIcon(IconResourses.victory);palTimeBai.pause();JOptionPane.showMessageDialog(this, "黑方赢了!");this.gameOver();}flag = false;}}}}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}@Overridepublic void printComponents(Graphics arg0) {// TODO Auto-generated method stubsuper.printComponents(arg0);}/** 判胜处理*/// 检查当前下子是否可以胜利private boolean checkWin(int row, int col) {if (checkNum(row, col, 1) >= 5 || checkNum(row, col, 2) >= 5|| checkNum(row, col, 3) >= 5 || checkNum(row, col, 4) >= 5) { return true;} else {return false;}}// 判断连子数,type:1纵向,2横向,3左斜,4右斜private int checkNum(int row, int col, int type) {int nextrow = 0;// 向上走int nextcol = 0;int count = 1;int num = 0;if (row >= 0 && row < 15 && col >= 0 && col < 15) {if (type == 1) {// 纵向nextrow = row;// 向上走nextcol = col - 1;while (crosses[row][col].getFlag() != 0 && nextcol >= 0) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextcol--;} else {break;}}nextrow = row;// 向下走nextcol = col + 1;while (crosses[row][col].getFlag() != 0 && nextcol < 15) { if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextcol++;} else {break;}}num = count;}if (type == 2) {// 横向nextrow = row - 1;// 向左走nextcol = col;while (crosses[row][col].getFlag() != 0 && nextcol >= 0) { if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow--;} else {break;}}nextrow = row + 1;// 向右走nextcol = col;while (crosses[row][col].getFlag() != 0 && nextcol < 15) { if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow++;} else {break;}}num = count;}if (type == 3) {// 左斜nextrow = row - 1;// 向左上走nextcol = col - 1;while (crosses[row][col].getFlag() != 0 && nextcol >= 0&& nextrow >= 0) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow--;nextcol--;} else {break;}}nextrow = row + 1;// 向左下走nextcol = col + 1;while (crosses[row][col].getFlag() != 0 && nextcol < 15&& nextrow < 15) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow++;nextcol++;} else {break;}}num = count;}if (type == 4) {// 右斜nextrow = row - 1;// 向右下走nextcol = col + 1;while (crosses[row][col].getFlag() != 0 && nextcol >= 0&& nextrow >= 0) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow--;nextcol++;} else {break;}}nextrow = row + 1;// 向右上走nextcol = col - 1;while (crosses[row][col].getFlag() != 0 && nextcol < 15&& nextrow < 15) {if (crosses[nextrow][nextcol].getFlag() == crosses[row][col].getFlag()) {count++;nextrow++;nextcol--;} else {break;}}num = count;}}return num;}// 游戏结束后清空棋盘public void gameOver() {this.reSet();// 重置棋盘}// 游戏重新开始的处理方法public void reStart() {}/** 双方任何一方还未分胜负之前时间用完后的处理*/public void timeOver() {if (palTimeBai.getSeconds() == 0 && palTimeHei.getSeconds() != 0) { JOptionPane.showMessageDialog(this, "白方游戏时间到,黑方获胜");gameOver();}if (palTimeBai.getSeconds() != 0 && palTimeHei.getSeconds() == 0) { JOptionPane.showMessageDialog(this, "黑方游戏时间到,白方获胜");gameOver();}if (palTimeBai.getSeconds() == 0 && palTimeHei.getSeconds() == 0) { JOptionPane.showMessageDialog(this, "游戏时间到,不分胜负");gameOver();}}}package ui;import java.awt.CardLayout;import java.awt.Dimension;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import javax.swing.JFrame;import javax.swing.JOptionPane;import java.awt.Toolkit;public class FIR extends JFrame implements WindowListener{private static final long serialVersionUID = 1L;private CardLayout layout;//布局private Welcome welcome;//欢迎界面private Help help;//帮助界面private Sound bgSound;//游戏背景音乐private Game game;//游戏界面/*** Launch the application* @param args*/public static void main(String args[]) {try {FIR window = new FIR();window.setVisible(true);} catch (Exception e) {e.printStackTrace();}}/*** Create the application*/public FIR() {initialize();init();}/*** Initialize the attributes of the frame*/private void initialize() {this.setTitle("单机版五子棋(无禁手)");this.setSize(700, 575);Dimension screen=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((screen.width-700)/2, (screen.height-550)/2);this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);this.addWindowListener(this);//添加窗体监听器this.setResizable(false);}/*** 动态初始化该窗体*/public void init(){welcome=new Welcome(this);help=new Help(this);game=new Game(this);bgSound=new Sound();bgSound.loop();//循环播放背景音乐layout=new CardLayout();//将窗体设置为卡片布局this.setLayout(layout);this.add(welcome, "welcome");this.add(help,"help");this.add(game,"game");}/*** 显示相应名称的卡片* @param name 要显示的卡片的名称*/public void show(String name){layout.show(this.getContentPane(), name);}/***实现WindowListener接口中的抽象方法*/public void windowOpened(WindowEvent e){}/*** 在点游戏窗体关闭按钮时,提示是否退出游戏*/public void windowClosing(WindowEvent arg0) {//点击"是"确定退出游戏if(JOptionPane.YES_OPTION==JOptionPane.showConfirmDialog(this, "确定退出游戏吗?","五子棋",JOptionPane.YES_NO_OPTION)){System.exit(0);}}public void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){}}。
五子棋游戏代码(Java语言)
五子棋游戏代码(Java语言)五子棋游戏代码(Java语言)import java.awt.*;import java.awt.event.*;import javax.swing.*;class mypanel extends Panel implements MouseListener { int chess[][] = new int[11][11];boolean Is_Black_True;mypanel(){Is_Black_True=true;for(int i=0;i<11;i++){for(int j=0;j<11;j++){chess[i][j] = 0;}}addMouseListener(this);setBackground(Color.RED);setBounds(0, 0, 360, 360);setVisible(true);}public void mousePressed(MouseEvent e){int x = e.getX();int y = e.getY();if(x < 25 || x > 330 + 25 ||y < 25 || y > 330+25) {return;}if(chess[x/30-1][y/30-1] != 0) {return;}if(Is_Black_True==true){chess[x/30-1][y/30-1] = 1;Is_Black_True=false;repaint();Justisewiner();return;}if(Is_Black_True==false){chess[x/30-1][y/30-1]=2;Is_Black_True=true;repaint();Justisewiner();return;}}void Drawline(Graphics g) {for(int i=30;i<=330;i+=30) {for(int j = 30;j <= 330; j+= 30) {g.setColor(Color.GREEN);g.drawLine(i, j, i, 330);}}for(int j = 30;j <= 330;j+=30){g.setColor(Color.GREEN);g.drawLine(30, j, 330, j);}}void Drawchess(Graphics g){for(int i=0;i < 11;i++){for(int j = 0;j < 11;j++){if(chess[i][j] == 1){g.setColor(Color.BLACK);g.fillOval((i+1)*30-8, (j+1)*30-8, 16, 16); }if(chess[i][j]==2){g.setColor(Color.WHITE);g.fillOval((i+1)*30-8, (j + 1) * 30-8, 16, 16); }}}void Justisewiner(){int black_count = 0;int white_count = 0;int i = 0;for(i=0;i<11;i++) //竖向判断{for(int j=0;j<11;j++){if(chess[i][j]==1){black_count++;if(black_count==5){JOptionPane.showMessageDialog(this, "黑棋胜利"); Clear_Chess();return;}}else{black_count=0;}if(chess[i][j]==2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利"); Clear_Chess();return;}}else{white_count = 0;}for(i=0;i<11;i++) //横向判断{for(int j=0;j<11;j++){if(chess[j][i] == 1){black_count++;if(black_count==5){JOptionPane.showMessageDialog(this, "黑棋胜利"); Clear_Chess();return;}}else{black_count=0;}if(chess[j][i]==2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利"); Clear_Chess();return;}}elsewhite_count = 0;}}}for(i=0;i<7;i++) //左向右斜判断{for(int j=0;j < 7;j++){for(int k=0;k < 5;k++){if(chess[i+k][j+k]==1){black_count++;if(black_count==5){JOptionPane.showMessageDialog(this, "黑棋胜利"); Clear_Chess();return;}}else{black_count=0;}if(chess[i+k][j+k]==2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利"); Clear_Chess();return;}}else{white_count=0;}}}}for(i = 4;i < 11;i++) //右向左斜判断{for(int j = 6;j >= 0;j--){for(int k = 0;k < 5;k++){if(chess[i - k][j + k] == 1){black_count++;if(black_count == 5){JOptionPane.showMessageDialog(this, "黑棋胜利"); Clear_Chess();return;}}else{black_count = 0;}if(chess[i - k][j + k] == 2){white_count++;if(white_count==5){JOptionPane.showMessageDialog(this, "白棋胜利"); Clear_Chess();return;}}else{white_count=0;}}}}}void Clear_Chess(){for(int i=0;i<11;i++){for(int j=0;j<10;j++){chess[i][j]=0;}}repaint();}public void paint(Graphics g){Drawline(g);Drawchess(g);}public void mouseExited(MouseEvent e){}public void mouseEntered(MouseEvent e){}public void mouseReleased(MouseEvent e){}public void mouseClicked(MouseEvent e){}}class myframe extends Frame implements WindowListener { mypanel panel;myframe(){setLayout(null);panel=new mypanel();add(panel);panel.setBounds(0,23, 360, 360);setTitle("单人版五子棋");setBounds(200, 200, 360, 383);setVisible(true);addWindowListener(this);}public void windowClosing(WindowEvent e){System.exit(0);}public void windowDeactivated(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowOpened(WindowEvent e){} public void windowClosed(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} }public class WuZiQi{public static void main(String argc[]){myframe f=new myframe();}}。
Java编写的简单五子棋
Java程序设计—五子棋一、源码import java.awt.*;import java.awt.event.MouseListener;import java.awt.event.MouseEvent;import java.util.Vector;import javax.swing.*;public class wuziqi extends JFrame implements MouseListener{public static void main(String args[]){wuziqi d=new wuziqi();}Vector v=new Vector();Vector white=new Vector();Vector black=new Vector();JButton btnstart =new JButton("开始");JButton btnstop =new JButton("停止");JToolBar tool=new JToolBar();boolean b; //用来判断白棋还是黑棋int blackcount,whitecount; //计算悔棋/*** 构造方法*/public wuziqi(){super("五子棋");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮Container con=this.getContentPane();this.addMouseListener(this);//添加监听tool.add(btnstart);//添加按钮tool.add(btnstop);this.setSize(550,500);//设置窗体大小this.setVisible(true);}int w=20; //间距大小是双数int px=100,py=100; //棋盘的坐标int pxw=(px+w), pyw=(py+w);int width=w*16,height=w*16;int vline=(width+px); //垂直线的长度int hline=(height+py); //水平线的长度/*** 画棋盘*/public void paint(Graphics g){g.clearRect(0, 0, this.getWidth(), this.getHeight()); //清除面板g.setColor(Color.BLACK); //设置网格颜色g.drawRect(px, py, width, height); //网格大小g.drawString("简易五子棋", 110, 70);for(int i=0;i<15;i++){g.drawLine(pxw+i*w,py,pxw+i*w,hline);//每条横线和竖线g.drawLine(px,pyw+i*w,vline,pyw+i*w);}for(int x=0;x<v.size();x++){String str=(String)v.get(x);String tmp[]=str.split("-");int a=Integer.parseInt(tmp[0]);int b=Integer.parseInt(tmp[1]);a=a*w+px;b=b*w+py;if(x%2==0){g.setColor(Color.CY AN);}else{g.setColor(Color.BLACK);}g.fillArc(a-w/2, b-w/2, w, w,0,360);}}public void updeta(Graphics g){this.paint(g);}public void victory(int x,int y,Vector contain){ //判断胜利的方法int cv=0; //计算垂直的变量int ch=0; //计算水平的变量int ci1=0; //计算斜面的变量1int ci2=0; //计算斜面的变量2for(int i=1;i<5;i++){if(contain.contains((x+i)+"-"+y))ch++;elsebreak;}System.out.println("前面执行了"+ch+"次");for(int i=1;i<5;i++){if(contain.contains((x-i)+"-"+y))ch++;elsebreak;}System.out.println("后面执行了"+ch+"次");for(int i=1;i<5;i++){if(contain.contains(x+"-"+(y+i)))cv++;elsebreak;}for(int i=1;i<5;i++){if(contain.contains(x+"-"+(y-i)))cv++;elsebreak;}for(int i=1;i<5;i++){if(contain.contains((x+i)+"-"+(y+i)))ci1++;elsebreak;}for(int i=1;i<5;i++){if(contain.contains((x-i)+"-"+(y-i)))ci1++;elsebreak;}for(int i=1;i<5;i++){if(contain.contains((x-i)+"-"+(y+i)))ci2++;elsebreak;}for(int i=1;i<5;i++){if(contain.contains((x+i)+"-"+(y-i)))ci2++;elsebreak;}if(ch>=4||cv>=4||ci1>=4||ci2>=4){System.out.println(v.size()+"步棋");if(v.size()%2==0){ //判断偶数是黑棋胜利,奇数白棋胜利JOptionPane.showMessageDialog(null,"恭喜你黑棋赢了");}else{JOptionPane.showMessageDialog(null,"恭喜你白棋赢了");}this.v.clear();this.black.clear();this.white.clear();this.repaint();}System.out.println(ch+" "+cv+" "+ci1+" "+ci2);}public void mouseClicked(MouseEvent e) {if(e.getButton()==e.BUTTON1){int x=e.getX();int y=e.getY();x=(x-x%w)+(x%w>w/2?w:0);y=(y-y%w)+(y%w>w/2?w:0);x=(x-px)/w;y=(y-py)/w;if(x>=0&&y>=0&&x<=16&&y<=16){if(v.contains(x+"-"+y)){System.out.println("已有棋了");}else{v.add(x+"-"+y);this.repaint();if(v.size()%2==0){black.add(x+"-"+y);this.victory(x, y,black);System.out.println("黑棋");}else{white.add(x+"-"+y);this.victory(x, y,white);System.out.println("白棋");}System.out.println(e.getX()+"-"+e.getY());}}else{System.out.println(e.getX()+"-"+e.getY()+"|"+ x+"-"+y+"\t超出边界");}}if(e.getButton()==e.BUTTON3){ //悔棋方法全在这里System.out.println("鼠标右键-悔棋");if(v.isEmpty()){JOptionPane.showMessageDialog(this,"没有棋可以悔");}else{if(v.size()%2==0){ //判断是白方悔棋还是黑方悔棋blackcount++;if(blackcount>3){JOptionPane.showMessageDialog(this, "黑棋已经悔了三步");}else{v.remove(stElement());this.repaint();}}else{whitecount++;if(whitecount>3){JOptionPane.showMessageDialog(this, "白棋已经悔了三步");}else{v.remove(stElement());this.repaint();}}}}}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}}二、简要说明该程序为一简易五子棋,棋盘为15*15,白子先落。
简单JAVA五子棋代码
简单JA V A五子棋代码只需要建两个类就可以了1.MainFrame类继承JFrame类2.MainPanel类继承JPanel类实现接口MouseListener两个类详细代码如下MainFrame类,如下:package game.gobang;import java.awt.BorderLayout;import java.awt.Color;import javax.swing.JFrame;/*** 五子棋* @WangJB* @version 19:46 13/03/17*/public class MainFrame extends JFrame{public static void main(String[] args) {M ainPanel panel = new MainPanel();MainFrame frame = new MainFrame("五子棋");frame.setSize(680,680);panel.setBackground(Color.GRAY);frame.add(panel,BorderLayout.CENTER);panel.addMouseListener(panel);frame.setVisible(true);}public MainFrame(){s uper();}public MainFrame(String str){s uper(str);}}MainPanel类如下:package game.gobang;import java.awt.Color;import java.awt.Graphics;import java.awt.Panel;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JOptionPane;/*** 五子棋的面板设计* @author WangJB* @version 00.59 13/3/16*/public class MainPanel extends Panel implements MouseListener{ private static final int COLUMN = 16;//列数private static final int ROW = 16;//行数private static final int GAP = 40;//间距private static boolean isBlack = true;private static int click_X;private static int click_Y;private char[][] allChess= new char[ROW][COLUMN];public MainPanel(){super();for(int i=0;i<allChess.length;i++){for(int j=0;j<allChess[i].length;j++){allChess[i][j]='*';}}}public void paint(Graphics g){f or(int i=0;i<ROW;i++){//划横线g.setColor(Color.BLACK);g.drawLine(20, 20+i*GAP, 640-20, 20+i*GAP);}f or(int i=0;i<COLUMN;i++){//划纵线g.setColor(Color.BLACK);g.drawLine(20+i*GAP, 20, 20+i*GAP, 640-20);}f or(int i=0;i<allChess.length;i++){for(int j=0;j<allChess[i].length;j++){if(allChess[i][j]=='~'){g.setColor(Color.WHITE);g.fillOval(5+i*40, 5+j*40, 30, 30);g.drawOval(5+i*40, 5+j*40, 30, 30);}if(allChess[i][j]=='!'){g.setColor(Color.BLACK);g.fillOval(5+i*40, 5+j*40, 30, 30);g.drawOval(5+i*40, 5+j*40, 30, 30);}}}}public boolean isWin(int x,int y,boolean isColor){//判断是否为5个相同的棋子,是返回true,否返回falsec har ch=allChess[x][y];/* 横向判断 */i nt RLastX = x;w hile(RLastX>=0 && allChess[RLastX][y]==ch){//横向判断是否到达5个相同的棋子RLastX --;}int RNum = 0;//统计横向相同的棋子数RLastX ++;w hile(RLastX<allChess.length && allChess[RLastX][y]==ch){//横向判断是否到达5个相同的棋子RNum ++;RLastX ++;}/* 纵向判断 */i nt LLastY = y;w hile(LLastY>=0 && allChess[x][LLastY]==ch){//纵向判断是否到达5个相同的棋子LLastY --;}i nt LNum = 0;//统计纵向相同的棋子数L LastY ++;w hile(LLastY<allChess[x].length && allChess[x][LLastY]==ch){//纵向判断是否到达5个相同的棋子LLastY ++;LNum ++;}/* 左下右上判断 */i nt LDLastX = x;i nt RULastY = y;w hile(LDLastX>=0 && RULastY<allChess.length &&allChess[LDLastX][RULastY]==ch){LDLastX --;RULastY ++;}i nt LDNum = 0;L DLastX ++;R ULastY --;w hile(LDLastX<allChess.length && RULastY>=0 &&allChess[LDLastX][RULastY]==ch){LDNum ++;LDLastX ++;RULastY --;}/* 左上右下判断 */i nt RULastX = x;i nt LDLastY = y;w hile(RULastX>=0 && LDLastY>=0 && allChess[RULastX][LDLastY]==ch){ RULastX --;LDLastY --;}i nt RUNum = 0;R ULastX ++;L DLastY ++;w hile(RULastX>=0 && LDLastY<allChess.length &&allChess[RULastX][LDLastY]==ch){RULastX ++;LDLastY ++;RUNum ++;}i f(RNum>=5||LNum>=5||RUNum>=5||LDNum>=5){return true;}r eturn false;}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub//System.out.println(e.getX());//e.getY();}public void mousePressed(MouseEvent e) {//鼠标点击事件处理过程// TODO Auto-generated method stubint click_x = e.getX();int click_y = e.getY();int chess_x = Math.round((float)(click_x-20)/GAP);int chess_y = Math.round((float)(click_y-20)/GAP);click_X = chess_x;click_Y = chess_y;if(isBlack==true&&allChess[chess_x][chess_y]=='*'){ allChess[chess_x][chess_y] = '!';isBlack = false;}if(isBlack==false&&allChess[chess_x][chess_y]=='*'){allChess[chess_x][chess_y] = '~';isBlack = true;}System.out.println(e.getX());System.out.println(e.getY());repaint();for(int j=0;j<16;j++){f or(int i=0;i<16;i++){System.out.print(allChess[i][j]+" ");}S ystem.out.println();}System.out.println();if(isWin(chess_x,chess_y,isBlack)){S ystem.out.println("你赢了");}if(isWin(chess_x,chess_y,isBlack)){i f(isBlack){JOptionPane.showMessageDialog(null,"白子赢了");}else{JOptionPane.showMessageDialog(null,"黑子赢了");}System.exit(0);}}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}public void setAllChess(char[][] allChess) { this.allChess = allChess;}public char[][] getAllChess() {return allChess;}}运行结果图片:更多精彩代码请访问【安卓阅】。
java五子棋程序
一个很经典的java 五子棋程序(源码)import java.awt.*;import java.awt.event.*;import java.applet.Applet;import java.awt.Color;publicclass enzit extends Applet implementsActionListener,MouseListener,MouseMotionListener,ItemListener { int color_Qizi=0;// 旗子的颜色标识0: 白子1: 黑子int intGame_Start=0;// 游戏开始标志0 未开始 1 游戏中int intGame_Body[][]=newint[16][16]; // 设置棋盘棋子状态0 无子 1 白子 2 黑子Button b1=new Button(" 游戏开始");Button b2=new Button(" 重置游戏");Label lblWin=new Label(" ");Checkbox ckbHB[]=new Checkbox[2];CheckboxGroup ckgHB=new CheckboxGroup(); public void init() { setLayout(null);addMouseListener(this);add(b1);b1.setBounds(330,50,80,30); b1.addActionListener(this);add(b2);b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=new Checkbox(" 白子先",ckgHB,false);ckbHB[0].setBounds(320,20,60,30);ckbHB[1]=new Checkbox(" 黑子先",ckgHB,false);ckbHB[1].setBounds(380,20,60,30);add(ckbHB[0]);add(ckbHB[1]);ckbHB[0].addItemListener(this);ckbHB[1].addItemListener(this); add(lblWin);lblWin.setBounds(330,130,80,30);Game_start_csh();}publicvoid itemStateChanged(ItemEvent e){if (ckbHB[0].getState()) // 选择黑子先还是白子先{color_Qizi=0;}else{color_Qizi=1;}}publicvoid actionPerformed(ActionEvent e){Graphics g=getGraphics();if (e.getSource()==b1){Game_start();}else{Game_re();}}publicvoid mousePressed(MouseEvent e){} publicvoid mouseClicked(MouseEvent e){Graphics g=getGraphics();int x1,y1;x1=e.getX();y1=e.getY();if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300) {return;}if (x1%20>10){x1+=20;}if(y1%20>10){y1+=20;}x1=x1/20*20;y1=y1/20*20;set_Qizi(x1,y1);}publicvoid mouseEntered(MouseEvent e){} publicvoid mouseExited(MouseEvent e){} publicvoid mouseReleased(MouseEvent e){} publicvoid mouseDragged(MouseEvent e){}public void mouseMoved(MouseEvent e){}publicvoid paint(Graphics g){ draw_qipan(g);}publicvoid set_Qizi(int x,int y) // 落子{if (intGame_Start==0) // 判断游戏未开始{return;}if (intGame_Body[x/20][y/20]!=0){return;}Graphics g=getGraphics();if (color_Qizi==1)// 判断黑子还是白子{g.setColor(Color.black);color_Qizi=0;}else{g.setColor(Color.white);color_Qizi=1;g.fillOval(x-10,y-10,20,20);intGame_Body[x/20][y/20]=color_Qizi+1;if (Game_win_1(x/20,y/20)) // 判断输赢{lblWin.setText(Get_qizi_color(color_Qizi)+" intGame_Start=0;}if (Game_win_2(x/20,y/20)) // 判断输赢{ lblWin.setText(Get_qizi_color(color_Qizi)+" intGame_Start=0;}if (Game_win_3(x/20,y/20)) // 判断输赢{ lblWin.setText(Get_qizi_color(color_Qizi)+" intGame_Start=0;}if (Game_win_4(x/20,y/20)) // 判断输赢{ lblWin.setText(Get_qizi_color(color_Qizi)+" intGame_Start=0;}}赢了!");赢了!");赢了!");赢了!");public String Get_qizi_color(int x) {if (x==0) return} else{return" 白子";}}publicvoid draw_qipan(Graphics G) // 画棋盘15*15{G.setColor(Color.lightGray); G.fill3DRect(10,10,300,300,true);G.setColor(Color.black);for(int i=1;i<16;i++){G.drawLine(20,20*i,300,20*i);G.drawLine(20*i,20,20*i,300);}}publicvoid Game_start() // 游戏开始{ intGame_Start=1;Game_btn_enable(false); b2.setEnabled(true);}publicvoid Game_start_csh() // 游戏开始初始化设置组件状判断{intGame_Start=0; Game_btn_enable(true); b2.setEnabled(false); ckbHB[0].setState(true);for (int i=0;i<16 ;i++ ){for (int j=0;j<16 ;j++ ){intGame_Body[j]=0;}}lblWin.setText("");}publicvoid Game_re() // 游戏重新开始{repaint();Game_start_csh();}publicvoid Game_btn_enable(boolean e) //{b1.setEnabled(e);b2.setEnabled(e);ckbHB[0].setEnabled(e);ckbHB[1].setEnabled(e);}publicboolean Game_win_1(int x,int y) //{int x1,y1,t=1; x1=x;y1=y;for (int i=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1+i][y1]==intGame_Body[x][y]) { t+=1; }else{break;}}for (int i=1;i<5 ;i++ ){if (x1<1){break;} if(intGame_Body[x1-i][y1]==intGame_Body[x][y]){t+=1;}else{break;}}if (t>4){returntrue;}else{returnfalse;}}publicboolean Game_win_2(int x,int y) // 判断输赢竖{int x1,y1,t=1;x1=x;y1=y;for (int i=1;i<5 ;i++ ){if (x1>15){if (intGame_Body[x1][y1+i]==intGame_Body[x][y]){t+=1;}else{break;} for (int i=1;i<5 ;i++ ) {if (x1<1){break;} if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){t+=1;}else{break;}}return true;}else{return false;}}publicboolean Game_win_3(int x,int y) // 判断输赢左斜{int x1,y1,t=1;x1=x;y1=y;for (int i=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1+i][y1-i]==intGame_Body[x][y]) {t+=1;}else{for (int i=1;i<5 ;i++ ) {if (x1<1){break;if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]) {t+=1;}else{break;}}if (t>4){return true;}else{return false;}}publicboolean Game_win_4(int x,int y) // 判断输赢左斜{int x1,y1,t=1;x1=x;y1=y;for (int i=1;i<5 ;i++ ){if (x1>15){break;}if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]){t+=1;}else{break;}}for (int i=1;i<5 ;i++ ) {if (x1<1){if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]) {t+=1;}else{break;}}if (t>4){returntrue;}else{returnfalse;}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5 详细设计5.1 人机界面设计
5.1 五子棋游戏界面
6 测试
6.1 白盒测试
1.白盒测试:白盒测试的前提是可以把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。
这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否能按预定的要求正确工作。
本次课程设计采用语句覆盖的方法:
图6.1 五子棋流程图
6.2 黑盒测试
1.黑盒测试:黑盒测试把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程。
也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当的接受输入数据并产生正确的输出信息,程序运行过程中能否保持外部信息的完整性。
图 6.2 黑盒测试图。