最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java swing實現(xiàn)簡單的五子棋游戲

 更新時間:2021年03月02日 11:57:09   作者:Jayce27  
這篇文章主要為大家詳細介紹了java swing實現(xiàn)簡單的五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

用java swing寫的一個簡單的五子棋游戲。

下面是Main.java。

package com.crossing.main;
import com.crossing.view.GameWindow;
public class Main {
 /**
 * @param args
 */
 public static void main(String[] args) {
 GameWindow gameWindow = new GameWindow();
 }
}

下面是GameWindow.java。

package com.crossing.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * @Title: GameWindow.java
 * @Package com.crossing.view
 * @Description: TODO(用一句話描述該文件做什么)
 * @author crossing
 * @date 2021年2月28日 下午9:23:14
 * @version V1.0
 */
@SuppressWarnings("serial")
public class GameWindow extends JFrame implements MouseListener, Runnable {
 private int width, height;// 屏幕寬高
 private int mouseX = 0, mouseY = 0, mapsX = 0, mapsY = 0;// 鼠標坐標,鼠標在地圖中的位置
 private int game_width = 600, game_height = 600;// 游戲窗口大小
 private BufferedImage bgImage = null;// 背景圖片
 private int chessBoardItemWidth = 25;// 棋盤每一小格的大小
 private Rectangle chessBoardRect = null;// 棋盤所在矩形
 private BufferedImage offsetImg = new BufferedImage(game_width, game_height, BufferedImage.TYPE_4BYTE_ABGR);
 private Graphics g = offsetImg.getGraphics();// 雙緩沖解決閃爍問題
 private int[][] maps = new int[15][15];// 0無棋子,1黑子,2白子
 private boolean isBlack = true;// 是否是黑方的回合
 private String message = "黑方先行", whitemessage = "無限制", blackmessage = "無限制";// 界面上方信息,下方時間信息
 // 右邊操作界面
 private JButton btn_start, btn_exit, btn_settings;
 private JPanel operaterPanel;// 操作面板

 private int gametime = 0;// 游戲時間限制(秒)
 private int blackTime = 0, whiteTime = 0;// 黑白方剩余時間

 private Thread timeThread = new Thread(this);// 黑白雙方倒計時線程
// private boolean isLimitTime = false;

 public GameWindow() {
 setTitle("五子棋");
 setSize(game_width, game_height);
 setResizable(false);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 // 獲取屏幕寬高
 width = Toolkit.getDefaultToolkit().getScreenSize().width;
 height = Toolkit.getDefaultToolkit().getScreenSize().height;

 // 棋盤位置矩形
 chessBoardRect = new Rectangle(50, 120, 370, 370);

 setLocation((width - game_width) / 2, (height - game_height) / 2);

 addMouseListener(this);

 // 初始化右邊的面板
 initOeratePane();

 repaint();

 // 設置背景
 try {
 bgImage = ImageIO.read(new File("img/backgroung.png"));
// System.out.println(bgImage);
 } catch (IOException e) {
 e.printStackTrace();
 }
 setVisible(true);
 }

 /**
 * 初始化黑白雙方時間
 */
 private void initTime() {
// System.out.println("isLimitTime:" + isLimitTime);
 if (gametime > 0) {

 timeThread.start();

 if (blackTime < 0) {
 JOptionPane.showMessageDialog(this, "黑方時間已到,白方獲勝!");
 timeThread.interrupt();
 } else if (whiteTime < 0) {
 JOptionPane.showMessageDialog(this, "白方時間已到,黑方獲勝!");
 timeThread.interrupt();
 }
 }
 }

 /**
 * 初始化右邊操作界面
 */
 private void initOeratePane() {
 btn_start = new JButton("開始游戲");
 btn_settings = new JButton("游戲設置");
 btn_exit = new JButton("退出游戲");
 btn_start.addActionListener(new ActionListener() {

 @Override
 public void actionPerformed(ActionEvent e) {
 int select = JOptionPane.showConfirmDialog(getContentPane(), "確定要重新開始嗎?");
 if (select == 0) {
  reStartGame();
 }

 }
 });
 btn_settings.addActionListener(new ActionListener() {

 @Override
 public void actionPerformed(ActionEvent e) {
 String select = "";
 select = JOptionPane.showInputDialog("請輸入游戲時間(分鐘),輸入0不限時間:");
 if (select != null && !select.equals("")) {
  try {
  gametime = Integer.parseInt(select) * 60;
//  System.out.println("gametime:" + gametime);
//  isLimitTime = true;
//  System.out.println("設置isLimitTime--" + isLimitTime);
  blackTime = gametime;
  whiteTime = gametime;
  if (gametime > 0) {
  blackmessage = blackTime / 3600 + ":" + blackTime / 60 % 60 + ":" + blackTime % 60;
  whitemessage = whiteTime / 3600 + ":" + whiteTime / 60 % 60 + ":" + whiteTime % 60;
//  timeThread.resume();
  } else {
  whitemessage = "無限制";
  blackmessage = "無限制";
  }
  initTime();
  repaint();
  } catch (Exception e2) {
  e2.printStackTrace();
  JOptionPane.showMessageDialog(getContentPane(), "請輸入正確信息!");
  }

//  
 }
 }
 });
 btn_exit.addActionListener(new ActionListener() {

 @Override
 public void actionPerformed(ActionEvent e) {
 System.exit(0);
 }
 });

 operaterPanel = new JPanel();
 GridLayout layout = new GridLayout(0, 1, 100, 100);
 operaterPanel.setLayout(layout);
 operaterPanel.add(btn_start);
 operaterPanel.add(btn_settings);
 operaterPanel.add(btn_exit);
 getContentPane().add(operaterPanel, BorderLayout.EAST);
 }

 /**
 * 重新開始游戲
 */
 protected void reStartGame() {
 isBlack = true;
 blackTime = gametime;
 whiteTime = gametime;
// for (int i = 0; i < maps[0].length; i++) {
// for (int j = 0; j < maps.length; j++) {
// maps[i][j] = 0;
// }
// }
 maps = new int[15][15];
 repaint();
 }

 @Override
 public void paint(Graphics g1) {
 super.paint(g);
 // 繪制背景
 g.drawImage(bgImage, 20, 90, this);
 // 繪制上方標題
 g.setColor(Color.black);
 g.setFont(new Font("楷體", Font.BOLD, 30));
 g.drawString("游戲信息:" + message, 100, 75);
 // 繪制下方
 g.setColor(Color.gray);
 g.fillRect(50, 530, 200, 50);
 g.fillRect(300, 530, 200, 50);
 g.setColor(Color.black);
 g.setFont(new Font("宋體", Font.BOLD, 20));
 g.drawString("黑方時間:" + blackmessage, 60, 560);
 g.drawString("白方時間:" + whitemessage, 310, 560);
// g.setColor(Color.blue);
 // 繪制棋盤線條
 for (int i = 0; i < 15; i++) {
 g.drawLine(60, 130 + i * chessBoardItemWidth, 410, 130 + i * chessBoardItemWidth);
 g.drawLine(60 + i * chessBoardItemWidth, 130, 60 + i * chessBoardItemWidth, 480);
 }
 // 標注點位
 g.fillOval(131, 200, 8, 8);
 g.fillOval(331, 200, 8, 8);
 g.fillOval(131, 400, 8, 8);
 g.fillOval(331, 400, 8, 8);
 g.fillOval(230, 299, 10, 10);

 // 繪制棋子
 for (int j = 0; j < maps.length; j++) {
 for (int i = 0; i < maps[0].length; i++) {
 if (maps[j][i] == 1) {
  g.setColor(Color.black);
  g.fillOval(50 + i * chessBoardItemWidth, 120 + j * chessBoardItemWidth, 20, 20);
 }
 if (maps[j][i] == 2) {
  g.setColor(Color.white);
  g.fillOval(50 + i * chessBoardItemWidth, 120 + j * chessBoardItemWidth, 20, 20);
 }
 }
 }

 // 雙緩沖解決屏幕閃爍
 g1.drawImage(offsetImg, 0, 0, this);
 }

 @Override
 public void mouseClicked(MouseEvent e) {
 mouseX = e.getX();
 mouseY = e.getY();
 // 鼠標落子
 if (chessBoardRect.contains(mouseX, mouseY)) {
 mapsX = (mouseX - 50) / chessBoardItemWidth;
 mapsY = (mouseY - 120) / chessBoardItemWidth;
// System.out.println("mapsXY:" + mapsX + "," + mapsY);
// maps[mapsY][mapsX] = (isBlack == true ? 1 : 2);

 if (maps[mapsY][mapsX] == 0) {
 if (isBlack) {
  maps[mapsY][mapsX] = 1;
  isBlack = false;
  message = "白色落子";
 } else {
  maps[mapsY][mapsX] = 2;
  isBlack = true;
  message = "黑色落子";
 }
 checkGame();
 }

 }
 repaint();
 }

 /**
 * 判斷游戲是否結束
 */
 private void checkGame() {
 int color = maps[mapsY][mapsX];
 boolean isWin = false;

// System.out.println("mapsXY:" + mapsX + "," + mapsY);

 isWin = checkChess(1, 0, color) || checkChess(0, 1, color) || checkChess(1, 1, color)
 || checkChess(1, -1, color);
 if (isWin) {
 if (color == 1)
 JOptionPane.showMessageDialog(this, "黑方勝利!");
 else {
 JOptionPane.showMessageDialog(this, "白方勝利!");
 }
 reStartGame();
// new GameWindow();
 }

 }

 /**
 * @param xChange 只能是1,0,-1
 * @param yChange 只能是1,0,-1
 * @param color
 */
 private boolean checkChess(int xChange, int yChange, int color) {
 boolean isWin = false;

 int count = 1, tempX = xChange, tempY = yChange;
 while ((mapsX + tempX) >= 0 && (mapsX + tempX) < 15 && (mapsY + tempY) >= 0 && (mapsY + tempY) < 15
 && maps[mapsY + tempY][mapsX + tempX] == color) {
 count++;
 if (tempX == 0 && tempY == 0)
 break;
 if (tempX > 0)
 tempX++;
 if (tempX < 0)
 tempX--;
 if (tempY > 0)
 tempY++;
 if (tempY < 0)
 tempY--;
 }
 tempX = xChange;
 tempY = yChange;
 while ((mapsX - tempX) >= 0 && (mapsX - tempX) < 15 && (mapsY - tempY) >= 0 && (mapsY - tempY) < 15
 && maps[mapsY - tempY][mapsX - tempX] == color) {
 count++;
 if (tempX == 0 && tempY == 0)
 break;
 if (tempX > 0)
 tempX++;
 if (tempX < 0)
 tempX--;
 if (tempY > 0)
 tempY++;
 if (tempY < 0)
 tempY--;
 }
// System.out.println("count:" + count);
 if (count >= 5) {
 return true;
 }
 return isWin;
 }

 @Override
 public void mousePressed(MouseEvent e) {

 }

 @Override
 public void mouseReleased(MouseEvent e) {

 }

 @Override
 public void mouseEntered(MouseEvent e) {
// mouseX = e.getX();
// mouseY = e.getY();
// System.out.println("鼠標進入游戲窗口");
// System.out.println("鼠標坐標:" + mouseX + "," + mouseY);
// if (chessBoardRect.contains(mouseX, mouseY)) {
// System.out.println("進入棋盤");
// if (isBlack) {
// g.setColor(Color.black);
// } else {
// g.setColor(Color.white);
// }
// g.fillOval(mouseX, mouseY, 20, 20);
// repaint();
// }
 }

 @Override
 public void mouseExited(MouseEvent e) {

 }

 @Override
 public void run() {
 while (true) {
// System.out.println("isblack:" + isBlack);
 if (isBlack) {
 blackTime--;
 } else {
 whiteTime--;
 }
 blackmessage = blackTime / 3600 + ":" + blackTime / 60 % 60 + ":" + blackTime % 60;
 whitemessage = whiteTime / 3600 + ":" + whiteTime / 60 % 60 + ":" + whiteTime % 60;
// System.out.println("blackTime:" + blackTime);
// System.out.println("whiteTime:" + whiteTime);
 repaint();
 if (blackTime < 0) {
 JOptionPane.showMessageDialog(getContentPane(), "黑方時間已到,白方獲勝!");
 timeThread.interrupt();
 new GameWindow();
 break;
 } else if (whiteTime < 0) {
 JOptionPane.showMessageDialog(getContentPane(), "白方時間已到,黑方獲勝!");
 timeThread.interrupt();
 new GameWindow();
 break;
 }
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 }

}

背景圖片

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 淺析Spring?中?Bean?的理解與使用

    淺析Spring?中?Bean?的理解與使用

    這篇文章主要介紹了Spring?中?Bean?的理解與使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 談談我對Spring Bean 生命周期的理解

    談談我對Spring Bean 生命周期的理解

    Spring Bean 的生命周期在整個 Spring 中占有很重要的位置,掌握這些可以加深對 Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下
    2018-03-03
  • lombok的@EqualsAndHashcode注解詳解

    lombok的@EqualsAndHashcode注解詳解

    這篇文章主要介紹了lombok的@EqualsAndHashcode注解的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java解析XML的四種方式

    Java解析XML的四種方式

    本文詳細講解了Java解析XML的四種方式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Spring運行時手動注入bean的方法實例

    Spring運行時手動注入bean的方法實例

    spring給我們提供了IOC服務,讓我們可以用注解的方式,方便的使用bean的相互引用,下面這篇文章主要給大家介紹了關于Spring運行時手動注入bean的相關資料,需要的朋友可以參考下
    2022-05-05
  • Java基于正則表達式實現(xiàn)查找匹配的文本功能【經典實例】

    Java基于正則表達式實現(xiàn)查找匹配的文本功能【經典實例】

    這篇文章主要介紹了Java基于正則表達式實現(xiàn)查找匹配的文本功能,結合具體實例形式分析了java正則查找、字符串遍歷、group分組相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • Springboot GET和POST請求參數(shù)獲取方式小結

    Springboot GET和POST請求參數(shù)獲取方式小結

    Spring Boot GET和POST請求參數(shù)獲取是開發(fā)人員經常需要解決的問題,本文主要介紹了Springboot GET和POST請求參數(shù)獲取方式小結,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java的List集合中泛型使用詳解

    Java的List集合中泛型使用詳解

    這篇文章主要介紹了Java的List集合中泛型使用詳解,泛型類,如果沒有指定具體的數(shù)據(jù)類型,此時,操作類型是Object,泛型的類型參數(shù)只能是類類型,不能是基本數(shù)據(jù)類型,需要的朋友可以參考下
    2023-12-12
  • Java?Optional的判空操作詳解

    Java?Optional的判空操作詳解

    JAVA在1.8版本推出Optional,官方文檔將其描述為可能包含或不包含非空值的容器對象,目前Optional用于避免程序出現(xiàn)異常NullPointerException,感興趣的可以了解一下
    2022-09-09
  • java中的DTO的使用示例

    java中的DTO的使用示例

    在Java中,DTO代表數(shù)據(jù)傳輸對象,本文主要介紹了java中的DTO的使用示例,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

张家港市| 武汉市| 崇左市| 新竹县| 准格尔旗| 建阳市| 旌德县| 闸北区| 马边| 广宗县| 云龙县| 定陶县| 满城县| 古蔺县| 穆棱市| 黄大仙区| 独山县| 德保县| 嘉兴市| 纳雍县| 时尚| 长乐市| 镇原县| 漯河市| 布拖县| 林西县| 慈利县| 大理市| 西吉县| 历史| 界首市| 桂阳县| 电白县| 天峨县| 长寿区| 阳高县| 五河县| 阜南县| 遂昌县| 克东县| 五寨县|