java-----五子棋小游戏(三)-----判断输赢

来源:互联网 发布:超级女声2016网络海选 编辑:程序博客网 时间:2024/04/30 20:14

一、代码实现

package org.like.game.frame;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JOptionPane;public class FiveChessFrame extends JFrame implements MouseListener{int width = Toolkit.getDefaultToolkit().getScreenSize().width;int height = Toolkit.getDefaultToolkit().getScreenSize().height;    BufferedImage bgImage = null;    int x = 0;    int y = 0;        int[][] allChess = new int[19][19];    boolean isBlack = true;    boolean canPlay = true;//判断游戏可以继续落子,如果哪一方胜利,就置为false,不执行mousePressed的主体public FiveChessFrame(){this.setTitle("五子棋");this.setSize(500,500);this.setLocation((width-500)/2,(height-500)/2);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);this.addMouseListener(this);try{bgImage = ImageIO.read(new File("F:/mypicture/java/background.jpg"));}catch (IOException e){e.printStackTrace();}}public void paint(Graphics g){g.drawImage(bgImage,3,20,this);g.setFont(new Font("黑体",Font.BOLD,20));g.drawString("游戏信息:", 150, 50);g.setFont(new Font("宋体",0,14));g.drawString("黑方时间:无限制", 45, 470);g.drawString("白方时间:无限制", 260, 470);for(int i=0;i<19;i++){   g.drawLine(13, 70+20*i, 372, 70+20*i);   g.drawLine(13+20*i,70,13+20*i,430);}g.fillOval(71, 128, 4, 4);g.fillOval(311, 128, 4, 4);g.fillOval(311, 368, 4, 4);g.fillOval(71, 368, 4, 4);g.fillOval(311, 248, 4, 4);g.fillOval(191, 128, 4, 4);g.fillOval(71, 248, 4, 4);g.fillOval(191, 368, 4, 4);g.fillOval(191, 248, 4, 4);for(int i=0;i<19;i++)for(int j=0;j<19;j++){if(allChess[i][j] == 1){x = i * 20 + 13;y = j * 20 + 70;g.fillOval(x-7, y-7, 14, 14);}if(allChess[i][j] == 2){x = i * 20 + 13;y = j * 20 + 70;g.setColor(Color.WHITE);g.fillOval(x-7, y-7, 14, 14);g.setColor(Color.BLACK);g.drawOval(x-7, y-7, 14, 14);}}}@Overridepublic void mouseClicked(MouseEvent e){}@Overridepublic void mousePressed(MouseEvent e){if(canPlay == true){        x = e.getX();        y = e.getY();        if(x >= 13 && x <= 372 && y >= 70 && y <= 430)        {        x = (x - 13) / 20;        y = (y - 70) / 20;        if(allChess[x][y] == 0)        {            if(isBlack)            {            allChess[x][y] = 1;            isBlack = false;            }            else            {            allChess[x][y] = 2;            isBlack = true;            }            this.repaint();            boolean winFlag = this.checkWin();//每下一个棋子就判断输赢            if(winFlag == true)//哪一方获胜就弹出窗口并将canPlay置为false            {            JOptionPane.showMessageDialog(this, "游戏结束"+(allChess[x][y] == 1?"黑方":"白棋")+"获胜!");                canPlay = false;            }            }        else        {        JOptionPane.showMessageDialog(this, "当前位置已经有旗子了,请重新落子!");        }        }    } }@Overridepublic void mouseReleased(MouseEvent e){}@Overridepublic void mouseEntered(MouseEvent e){}@Overridepublic void mouseExited(MouseEvent e){}public static void main(String[] args){FiveChessFrame ff = new FiveChessFrame(); }private boolean checkWin()//判断输赢{boolean flag = false;int count = 1;int color = allChess[x][y];count = this.checkCount(1, 0, color);//判断横向if (count >= 5) {flag = true;} else {// 判断纵向count = this.checkCount(0, 1, color);if (count >= 5) {flag = true;} else {// 判断右上、左下count = this.checkCount(1, -1, color);if (count >= 5) {flag = true;} else {// 判断右下、左上count = this.checkCount(1, 1, color);if (count >= 5) {flag = true;}}}}return flag;}private int checkCount(int xChange, int yChange, int color) {int count = 1;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 18 && y + yChange >= 0&& y + yChange <= 18&& color == allChess[x + xChange][y + yChange]) {//下一个需要判断的棋子在边界内并且与上一个棋子颜色相同则执行,这是判断x的右边和y的下边count++;if (xChange != 0)//xChange不为零,就判断x的右上和左下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]) {//继续判断x的左边和y的上边count++;if (xChange != 0)//xChange不为零,就判断x的左上和右下xChange++;if (yChange != 0) {if (yChange > 0)yChange++;else {yChange--;}}}return count;//返回当前判断的方向共有多少个同色棋子相连,共四个方向,横竖对角线四个}}

二、效果展示


1 0
原创粉丝点击