java-----五子棋小游戏(五)-----按钮功能设置(The End)

来源:互联网 发布:mvc数据传到前台 编辑:程序博客网 时间:2024/06/05 12:08

一、代码实现

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,Runnable//实现Runnable接口{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;    String message = "黑方先行";    int maxTime = 0;    Thread td= new Thread(this);//创建线程用来显示计时    int blackTime = 0;//黑方剩余时间    int whiteTime = 0;//白方剩余时间    String blackMessage = "无限制";//计时区间所显示的内容    String whiteMessage = "无限制";//如果没有设置时间或是设置时间为0,则显示"无限制",否则,通过线程显示剩余时间    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);td.start();//启动线程td.suspend();//线程挂起this.repaint();//刷新一遍界面,防止刚开始运行程序时出现黑窗口现象this.addMouseListener(this);try{bgImage = ImageIO.read(new File("F:/mypicture/java/background.jpg"));}catch (IOException e){e.printStackTrace();}}public void paint(Graphics g){BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);Graphics g2 = bi.createGraphics();g2.setColor(Color.BLACK);g2.drawImage(bgImage,3,20,this);g2.setFont(new Font("黑体",Font.BOLD,20));g2.drawString("游戏信息:"+message, 150, 50);g2.setFont(new Font("宋体",0,14));g2.drawString("黑方时间:"+blackMessage, 45, 470);g2.drawString("白方时间:"+whiteMessage, 260, 470);for(int i=0;i<19;i++){   g2.drawLine(13, 70+20*i, 372, 70+20*i);   g2.drawLine(13+20*i,70,13+20*i,430);}g2.fillOval(71, 128, 4, 4);g2.fillOval(311, 128, 4, 4);g2.fillOval(311, 368, 4, 4);g2.fillOval(71, 368, 4, 4);g2.fillOval(311, 248, 4, 4);g2.fillOval(191, 128, 4, 4);g2.fillOval(71, 248, 4, 4);g2.fillOval(191, 368, 4, 4);g2.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;g2.fillOval(x-7, y-7, 14, 14);}if(allChess[i][j] == 2){x = i * 20 + 13;y = j * 20 + 70;g2.setColor(Color.WHITE);g2.fillOval(x-7, y-7, 14, 14);g2.setColor(Color.BLACK);g2.drawOval(x-7, y-7, 14, 14);}}}g.drawImage(bi, 0, 0, this);}@Overridepublic void mouseClicked(MouseEvent e){}@Overridepublic void mousePressed(MouseEvent e){if(canPlay == true){        x = e.getX();        y = e.getY();        if(x >= 13 && x <= 380 && y >= 70 && y <= 440)//在原来基础上将x,y的上限扩大了一点,使得最右边和最下边也能下棋子        {        x = (x - 13) / 20;        y = (y - 70) / 20;        if(allChess[x][y] == 0)        {            if(isBlack)            {            allChess[x][y] = 1;            isBlack = false;            message = "轮到白方下棋";            }            else            {            allChess[x][y] = 2;            isBlack = true;            message = "轮到黑方下棋";            }            this.repaint();            boolean winFlag = this.checkWin();            if(winFlag == true)            {            JOptionPane.showMessageDialog(this, "游戏结束"+(allChess[x][y] == 1?"黑方":"白棋")+"获胜!");                canPlay = false;            }            }        else        {        JOptionPane.showMessageDialog(this, "当前位置已经有棋子了,请重新落子!");        }        }}//重新开始按钮功能实现        if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 72 && e.getY() <= 99)        {                td.suspend();暂停计时        if(JOptionPane.showConfirmDialog(this, "是否重新开始游戏?") == 0)        {//弹出确认消息对话框,若选择“是”,就初始化allChess中的值        for(int i=0;i<19;i++)        {        for(int j=0;j<19;j++)        {        allChess[i][j] = 0;        }        }        this.message = "黑方先行";//并初始化一些显示和标记        isBlack = true;        canPlay = true;        blackTime = maxTime;        whiteTime = maxTime;        this.repaint();//刷新        td.resume();//唤醒线程,比如哪一方用时完毕结束时会挂起线程,而点开始按钮又重新唤醒线程        }        }                if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 121 && e.getY() <= 151)        {        String input = JOptionPane.showInputDialog("请输入游戏的最大时间(分钟),如果输入0,表示没有时间限制");        try{              maxTime = Integer.parseInt(input) * 60;        if(maxTime < 0)        {        JOptionPane.showMessageDialog(this, "输入有误,不允许输入负数");        }        if(maxTime == 0)        {        if(JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?") == 0)        {            for(int i=0;i<19;i++)            {            for(int j=0;j<19;j++)            {            allChess[i][j] = 0;            }            }            this.message = "黑方先行";            isBlack = true;            canPlay = true;            blackTime = maxTime;            whiteTime = maxTime;            blackMessage = "无限制";            whiteMessage = "无限制";            this.repaint();//repaint别忘了            }//maxTime为0时,时间无限制,所以也不用唤醒线程                }        if(maxTime > 0)        {        if(JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?") == 0)        {            for(int i=0;i<19;i++)            {            for(int j=0;j<19;j++)            {            allChess[i][j] = 0;            }            }            this.message = "黑方先行";            isBlack = true;            canPlay = 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);            this.repaint();//repaint别忘了            td.resume();            }                }}catch (Exception e2){JOptionPane.showMessageDialog(this, "输入有误,请正确输入信息");}                }        //说明按钮功能实现        if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 171 && e.getY() <= 199)        {        JOptionPane.showMessageDialog(this, "这是一个五子棋程序,黑白方轮流下棋,当某一方连到五子时,游戏结束。");        }        //认输按钮功能实现        if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 271 && e.getY() <= 299)        {        if(JOptionPane.showConfirmDialog(this, "是否确认认输?") == 0)        {        if(isBlack)        {        JOptionPane.showMessageDialog(this, "黑方已经认输,游戏结束!");                                td.suspend();//挂起线程,防止继续计时        }        else        {        JOptionPane.showMessageDialog(this, "白方已经认输,游戏结束!");                                td.suspend();        }        canPlay = false;//设置不能再落子了        }        }        //关于按钮功能实现        if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 322 && e.getY() <= 348)        {        JOptionPane.showMessageDialog(this, "本游戏由周子新制作\nblog.csdn.net/zhouzixin053");        }        //退出按钮功能实现        if(e.getX() >= 404 && e.getX() <= 473 && e.getY() >= 371 && e.getY() <= 398)        {        if(JOptionPane.showConfirmDialog(this, "确认退出吗?", "退出", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)        {        System.exit(0);        }                }    }@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]) {count++;if (xChange != 0)xChange++;if (yChange != 0) {if (yChange > 0)yChange++;else {yChange--;}}}xChange = tempX;yChange = tempY;while (x - xChange >= 0 && x - xChange <= 18 && y - yChange >= 0&& y - yChange <= 18&& color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0)xChange++;if (yChange != 0) {if (yChange > 0)yChange++;else {yChange--;}}}return count;}@Overridepublic void run(){while(true){                        this.repaint();if(maxTime > 0){if(isBlack){blackTime--;if(blackTime == 0)//时间为0就弹出窗口提示游戏结束{JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");canPlay = false;//设置不能再落子td.suspend();//线程挂起,不然就会在计时区域继续显示,并且显示负数}}else{whiteTime--;if(whiteTime == 0){JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");canPlay = false;td.suspend();}}try{Thread.sleep(1000);//使计时以1秒为单位}catch (InterruptedException e){e.printStackTrace();}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();//每次计时完毕就刷新一遍}}}}


二、效果展示











0 0
原创粉丝点击