package Day8_06;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel; /**
*
* @author sky
*
*/
public class Game {
/**
* 控件属性
*/
private JFrame frame; // 五子棋游戏的窗口框架
private GameMap map; // 五子棋游戏的窗口容器
private JMenuBar bar; // 菜单
private JMenu game; // 菜单项
private JMenuItem[] items; // 菜单下拉项 /**
* 静态数据属性
*/
private static final int BOARD_SIZE = 15; // 棋盘大小(15 * 15)
private static final int ROW_WIDTH = 36; // 间距
private static final int SPACE = ROW_WIDTH / 2; // 上下边间距 /**
* 数据属性
*/
private boolean player; // true黑,false白
private char[][] board; // 后台虚拟棋盘 public Game() {
player = true; // 游戏先黑子下
board = new char[BOARD_SIZE][BOARD_SIZE]; // 建立后台虚拟棋盘
clearMap();
createGUI();
} /**
* 对GUI控件的创建
*/
private void createGUI() {
frame = new JFrame("五子棋"); // 实现五子棋游戏窗口框架
map = new GameMap(); // 实现五子棋游戏窗口容器
bar = new JMenuBar(); // 建立菜单栏
game = new JMenu("游戏"); // 建立名为“游戏”的菜单
items = new JMenuItem[2]; // game菜单下创建2个子菜单项
game.add(items[0] = new JMenuItem("重新开始"));// 第一个子菜单为“重新开始”
game.add(items[1] = new JMenuItem("退出")); // 第二个子菜单为“退出”
} /**
* 清空棋子
*/
protected void clearMap() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = '+';
}
}
} /**
* 运行游戏
*/
public void start() {
map.setPreferredSize(new Dimension(ROW_WIDTH * (BOARD_SIZE - 1) + SPACE
* 2, ROW_WIDTH * (BOARD_SIZE - 1) + SPACE * 2));
map.addMouseListener(new MouseAdapter() {
// 鼠标点击事件
public void mouseClicked(MouseEvent e) {
// 将用户鼠标事件的座标转换成棋子数组的座标。
int xPos = (int) (e.getX() / ROW_WIDTH);
int yPos = (int) (e.getY() / ROW_WIDTH);
if (board[xPos][yPos] == '+') {// 判断是否下过棋
board[xPos][yPos] = player ? 'b' : 'w'; // 给虚拟键盘赋值
map.repaint(); // 通过读取board数组进行贴图
if (isWin(xPos, yPos)) {// 如果有满足胜利条件的玩家了
map.repaint(); // 刷新图像
String str = player ? "黑方胜利" : "白方胜利";
JOptionPane.showMessageDialog(null, str, "游戏结束",
JOptionPane.PLAIN_MESSAGE); // 弹出消息框
clearMap(); // 清空棋盘
map.repaint(); // 刷新棋盘
player = true; // 新一局继续黑子先下
} else {
player = player ? false : true; // 切换玩家
}
}
}
});
// 点击重新开始事件
items[0].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String str = "是否要重新开始游戏?";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "重新开始",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
clearMap(); // 清空棋盘
map.repaint(); // 刷新棋盘
player = true; // 玩家为黑棋
}
}
});
// 点击退出事件
items[1].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String str = "是否要退出游戏?";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "重新开始",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0); // 退出
}
}
});
// 点关闭按钮事件
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
String str = "是否要退出游戏?";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "退出游戏",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0); // 退出
}
}
});
bar.add(game);
frame.setJMenuBar(bar);
frame.add(map);
frame.pack();
frame.setLocation(250, 50);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
} /**
* 纵向找
*/
protected boolean find(int x, int y) {
int i, num = 1;
char temp = player ? 'b' : 'w';
for (i = x + 1; i < 15; i++) {// 向下找
if (board[i][y] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = x - 1; i >= 0; i--) {// 向上找
if (board[i][y] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
} /**
* 横向找
*/
protected boolean find2(int x, int y) {
int i, num = 1;
char temp = player ? 'b' : 'w';
for (i = y + 1; i < 15; i++) { // 向右找
if (board[x][i] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = y - 1; i >= 0; i--) {// 向左找
if (board[x][i] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
} /**
* \方向
*/
protected boolean find3(int x, int y) {
int i, j, num = 1;
char temp = player ? 'b' : 'w';
for (i = x + 1, j = y + 1; i < 15 && j < 15; i++, j++) {// 向下方
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {// 向上方
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
} /**
* /方向
*/
protected boolean find4(int x, int y) {
int i, j, num = 1;
char temp = player ? 'b' : 'w';
for (i = x + 1, j = y - 1; i < 15 && j >= 0; i++, j--) {// 向下
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = x - 1, j = y + 1; i >= 0 && j < 15; i--, j++) { // 向上
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
} /**
*判断胜负
*/
protected boolean isWin(int x, int y) {
return (find(x, y) || find2(x, y) || find3(x, y) || find4(x, y));
} /**
* 内部容器类,用于实现图像处理
*/
private class GameMap extends JPanel {
private static final long serialVersionUID = 16578987565248L; public void paintComponent(Graphics g) {
super.paintComponent(g);
// 棋盘
g.setColor(new Color(200, 100, 50)); // 设为桔黄色
g.fillRect(0, 0, ROW_WIDTH * (BOARD_SIZE + 1), ROW_WIDTH
* (BOARD_SIZE + 1)); // 填充棋盘
g.setColor(Color.black); // 设为黑色
for (int i = 0; i < BOARD_SIZE; i++) {// 画竖线
g.drawLine(SPACE + ROW_WIDTH * i, SPACE, SPACE + ROW_WIDTH * i,
SPACE + ROW_WIDTH * (BOARD_SIZE - 1));
}
for (int i = 0; i < BOARD_SIZE; i++) {// 画横线
g.drawLine(SPACE, SPACE + ROW_WIDTH * i, SPACE + ROW_WIDTH
* (BOARD_SIZE - 1), SPACE + ROW_WIDTH * i);
}
// 画点
g.fillOval(SPACE + 3 * ROW_WIDTH - 3, SPACE + 3 * ROW_WIDTH - 3, 7,
7);
g.fillOval(SPACE + 11 * ROW_WIDTH - 3, SPACE + 3 * ROW_WIDTH - 3,
7, 7);
g.fillOval(SPACE + 3 * ROW_WIDTH - 3, SPACE + 11 * ROW_WIDTH - 3,
7, 7);
g.fillOval(SPACE + 7 * ROW_WIDTH - 3, SPACE + 7 * ROW_WIDTH - 3, 7,
7);
g.fillOval(SPACE + 11 * ROW_WIDTH - 3, SPACE + 11 * ROW_WIDTH - 3,
7, 7); // 棋子
// 遍历数组,绘制棋子。
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 'b') {// 绘制黑棋
g.setColor(Color.black);
g.fillOval(SPACE + i * ROW_WIDTH - ROW_WIDTH / 2, SPACE
+ j * ROW_WIDTH - ROW_WIDTH / 2, ROW_WIDTH,
ROW_WIDTH);
}
if (board[i][j] == 'w') {// 绘制白棋
g.setColor(Color.white);
g.fillOval(SPACE + i * ROW_WIDTH - ROW_WIDTH / 2, SPACE
+ j * ROW_WIDTH - ROW_WIDTH / 2, ROW_WIDTH,
ROW_WIDTH);
}
}
}
}
} public static void main(String[] args) {
Game game = new Game();
game.start();
}
}

Java 五子棋小游戏的更多相关文章

  1. Java五子棋小游戏(控制台纯Ai算法)

    Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...

  2. Java太阳系小游戏分析和源代码

    Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...

  3. Java猜拳小游戏(剪刀、石头、布)

    1.第一种实现方法,调用Random数据包,直接根据“1.2.3”输出“剪刀.石头.布”.主要用了9条输出判断语句. import java.util.Random; import java.util ...

  4. 从零开始学java(小游戏 石头剪刀布)

    Game.java package com.java;import java.util.Scanner;public class Game {        private Player player ...

  5. Java石头剪刀布小游戏

    package com.neusoft.test; import java.awt.BorderLayout; import java.awt.Choice; import java.awt.Colo ...

  6. Java开发小游戏 用键盘控制精灵在游戏中上下左右跑动 窗体小游戏可打包下载,解压后双击start运行

    package com.swift; import java.awt.Point; import java.awt.event.KeyEvent; import com.rupeng.game.Gam ...

  7. Java经典小游戏——贪吃蛇简单实现(附源码)

    一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...

  8. Java 坦克小游戏心得

    原本是闲得慌无聊才去尝试做这个项目的,因为小时候玩小霸王的游戏机,那个时候经常玩这个游戏吧,特别是喜欢那种自定义地图的模式,觉得自由度非常不错.总之关于这个游戏,想说的一大堆.鉴于能有个空闲的时间,打 ...

  9. jQuery网页版五子棋小游戏源码下载

    体验效果:http://hovertree.com/texiao/game/4/ 网页五子棋源代码: <!DOCTYPE html> <html> <head> & ...

随机推荐

  1. QMainWindow: No such file or directory 问题的解决方法

    这种问题往往是由于QT4的程序转换到QT5所导致的,在.pro文件中加上一句 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 就可以解决问题

  2. DB2导入导出数据

    1.导出表数据到txt文件: export to /brcb_edp/data_public_edp/file/CCDM/file/FILE_CCDM_DR_CARD_CUST_DET.txt of ...

  3. QT 相关书籍

    qt qucik 核心编程 个人觉得此书写得非常之好....这位作者的另外一本虽然没看过,估计也不错 https://bbs.csdn.net/topics/390942701?list=lz qt5 ...

  4. intellij 出现“Usage of API documented as @since 1.6+”的解决办法(转)

    原文链接:http://www.cnblogs.com/cxj20160928/p/5954196.html intellij 出现“Usage of API documented as @since ...

  5. 了解jmeter

    JMeter是Apache组织的开放源代码项目,100%的用java实现应用.用于压力测试和性能测试.它最初被设计用于Web应用测试但后来扩展到其它测试领域. jmeter和loadrunner的对比 ...

  6. 经典问题:查询有多少段区间和等于k值

    题目连接 题意:在大小为1e5以内的数组求存在多少个区间和的值等于k的次方 这种题很经常见,总是想着用两个for循环解决,但是一定会超时. 题解:算出前缀和,使用map去查找mp[sum[i+1]-t ...

  7. 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf

    转载请注明出处:windeal专栏 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq  结构体struct ifconf来获取网络接口的各种信息. ioctl 首先看 ...

  8. MySQL之联合索引

    以 index(a, b, c) 为例: 语句 发挥作用的索引 记忆方法(以三块板子过河记忆, 顺序很重要) WHERE a=3 只用到了a列 只走了a板子 WHERE a=3 AND b=5 使用了 ...

  9. SpringMVC札集(07)——JSON数据

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  10. SpringMVC札集(03)——基于注解的SpringMVC入门完整详细示例

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...