java swing实现简单的五子棋游戏

用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();
 }
 }
 }

}

背景图片

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现五子棋小游戏

    java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

  • Java实现五子棋网络版

    本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以在服务器上创建新游戏或加入已创建的游戏 4.用户在下棋的时候可以进行聊天交流 由上可以知道需要实现的功能: ·提供服务器和客户端的功能 ·服务器将监听客户端的登录情况并允许多个客户端进行登录 ·用户通过客户端可以登录服

  • java实现单人版五子棋游戏

    本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 package gyb.exam; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.

  • Java编程实现五子棋人人对战代码示例

    利用Java,在控制台操作下,编写的五子棋,作为复习二维数组,面向对象等基础知识.w表示白棋,b表示黑棋 import java.util.Scanner; public class MainMethod { public static char[][] c = new char[10][10]; public static void main(String[] args) { MainMethod mainMethod = new MainMethod(); mainMethod.init()

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • java Swing实现五子棋游戏

    本文实例为大家分享了java实现五子棋项目,供大家参考,具体内容如下 运行结果 视频经过压缩画质略显粗糙. 标题 1)绘制网格棋盘: 重写JPanel的paint(Graphics g)方法,绘制16*16网格. 如图: 2)代码如下(仅包含部分代码): public class Board extends JPanel{ int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.get

  • Java swing五子棋的实现方法

    今天给大家介绍一下如何用Java swing实现五子棋的开发即用Java开发图形界面程序五子棋,代码由于太多,只贴部分,最下面会附上下载地址,废话不多说,下面我们先看一下运行结果: 接下来我们看代码: 首先是创建主frame框架界面: package org.liky.game.frame; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import

  • java实现单机版五子棋

    这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~ 一.该游戏需要实现 1.设计主框架,界面. 2.利用ActionListener接口实现按钮事件的监听. 3.重新开始功能的实现. 4.悔棋功能的实现. 5.退出功能的实现. 6.棋盘中棋子点类的定义. 7.利用MouseListener接口实现事件监听,并实现接口里的所有方法. 8.当鼠标移动到棋盘上的交点上,且该点上无棋子时能够变成小手形状. 9.点击棋盘时

  • java swing实现简单的五子棋游戏

    用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.

  • Java实现简单的五子棋游戏示例代码

    目录 项目结构 核心代码 ArrComparator.java类 ChessMap.java类 ChessPanel.java类 效果图展示 项目结构 这个是在网上找的资源,出处记不得了,记录一下.程序的总体结构,很简单的: 核心代码 代码如下: ArrComparator.java类 import java.util.Comparator; /** * 排序 Comparator */ class ArrComparator implements Comparator<Object> { i

  • Java实现的简单掷骰子游戏示例

    本文实例讲述了Java实现的简单掷骰子游戏.分享给大家供大家参考,具体如下: 要求: 掷两个骰子,每个骰子有六面, 分别为1.2.3.4.5.6.检查这两个骰子的和. 如果为2.3或12你就输了:如果和是7或者11你就赢了. 但如果和是其他数字(例如4.5.6.8.9或者10), 就确定了一个点.继续掷骰子直至抛出一个7或者 掷出和刚才相同的点数.如果掷出的是7,你就输了. 如果掷出的点数和你前一次掷出的点数相同, 你就赢了. java实现代码: enum Status { Win, Lose,

  • Java+swing实现经典贪吃蛇游戏

    目录 前言 主要设计 功能截图 代码实现 总结 前言 贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长. 本程序是通过java的swing来实现<贪吃蛇大作战>这款游戏. 主要需求 1.通过上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,蛇的身体会变长 2.蛇头碰到自己的身体,则算失败 主要设计 1.设置swing的窗体大小 2.随机初始化蛇的位置和食物的位置,且食物不能落在蛇的身体上.

  • java实现的简单猜数字游戏代码

    本文实例讲述了java实现的简单猜数字游戏代码.分享给大家供大家参考. 具体代码如下: 复制代码 代码如下: import java.util.InputMismatchException; import java.util.Scanner; public class Main {         public static void main(String[] args) {                 // 产生一个随机数                 int number = (in

  • Java Swing实现简单的体重指数(BMI)计算器功能示例

    本文实例讲述了Java Swing实现简单的体重指数(BMI)计算器功能.分享给大家供大家参考,具体如下: BMI,Body Mass Index,身体质量指数,是用体重公斤数 除以 身高米数平方得出的,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准. 而本文通过运用Java Swing实现了一个简单的BMI计算器.虽然现在网页上也有相应的网页应用,但是能够做出这个计算器来,还是有点成就感的,希望自己以后做出更多比这个好的应用. 最终运行效果: 功能:可以选择三个标准:中国.亚洲.WH

  • 使用C++ MFC编写一个简单的五子棋游戏程序

    MFC简介: MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数. MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll.xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的

  • C#实现简单的五子棋游戏

    最近利用业余时间写了一个简单的五子棋游戏,没有利用深层次的面向对象技术,自学一年,代码和程序设计有不妥之处,还望大神指出,先看下实现的功能,三个button按钮,黑棋和白棋选择先出,和重置. 其他的不多说了,直接上全部代码(通过测试).计算输赢的时候,左斜和右斜用了数学y=kx+b的线性函数计算. private Image myImage; /// <summary> /// 初始化背景数组 /// int[x,y] x为行 y为列 /// </summary> private

  • java swing实现简单计算器界面

    本文实例为大家分享了java swing实现简单计算器界面的具体代码,供大家参考,具体内容如下 已经学习了一部分的swing知识,现在综合运用里面的部分知识来实现一个计算器的界面. 运用到的知识: 1.常用顶层容器 JFrame类 的使用2.常用中间容器 JPanel类 的使用3.单行文本框的实现类 JTextField类 的使用4.按钮的实现类 JButton类 的使用5.边框布局管理器 的使用6.网格布局管理器 的使用 基本思路: 1.创建1个窗口f12.创建1个文本框t13.创建内层面板p

  • java实现简单的五子棋游戏

    本文实例为大家分享了java实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 一.主要界面 1.登录界面:2.游戏选择界面:3.五子棋下棋界面 它们间的逻辑关系为先通过登录界面登录跳转到游戏选择界面,再通过游戏选择界面进入到五子棋下棋界面. 二.功能概况 1.登录界面:a.设置一定的布局和添加一些组件:b.通过点击登录按钮判断账号和密码是否正确,正确则成功登录,反之则弹出一个提示账号或密码输入错误的窗口:c.在窗口中添加一个按钮,在点击此按钮后关闭当前窗口,并在第三次输入错误后弹出提示并关

随机推荐