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
- java-----五子棋小游戏(五)-----按钮功能设置(The End)
- 【java】五子棋小游戏
- 【java】五子棋小游戏
- Java写五子棋小游戏
- java----五子棋小游戏
- Java编写的五子棋小游戏
- Java程序实现五子棋小游戏
- 基于java的五子棋小游戏
- java课程设计五子棋小游戏(1)
- java小游戏第四弹 五子棋
- 五子棋--小游戏
- 小游戏-五子棋
- java-----五子棋小游戏(一)-----背景图片制作
- java-----五子棋小游戏(三)-----判断输赢
- java小游戏之控制台下五子棋!
- java小游戏-双人五子棋小案例
- java swing实现五子棋小游戏项目源码
- Qt小游戏开发:五子棋(带AI功能)
- 国家天地图API 创建点 覆盖物
- do{}while(0)和switch中嵌套while 整理
- WAMP安装教程
- redhat安装ftp服务
- centos 6.4 / 5.5下vnc的配置 [已经验证可用]
- java-----五子棋小游戏(五)-----按钮功能设置(The End)
- EBS 打印机——psata命令行FNDPASTX
- FORK()函数的理解
- 构造函数在类中初始化数据成员
- poj 2935 Basic Wall Maze
- Android拨打电话和发送短信
- HDU 1329 汉诺塔&dfs
- poj 2524
- Mavne + Spring整合CXF