Java编程五⼦棋⼩游戏(全代码)
这是这三天⾃⼰跟着学习完成的简单五⼦棋⼩游戏的全部代码,通过这个⼩游戏,我学到了很多,包括程序的设计以及怎么将⾃⼰想实现的功能转化成代码,⽤代码编写出来,对我的Java学习之路⼜有⼀个新的提升。
需要注意的是⾥⾯有很多数字是要根据⾃⼰的实际情况来设置的,⽐如主窗体的⼤⼩等等,详情请看前两篇博客
Test类测试代码:包含主⽅法
package org.st;
import org.liky.game.frame.FiveChessFrame;
public class Test {
public static void main(String[] args) {
FiveChessFrame ff = new FiveChessFrame();
}
}
FiveChessFrame功能实现代码:包括了整个五⼦棋⼩游戏的所有功能
package org.liky.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 {
// 取得屏幕⼤⼩,屏幕的⾼度和宽度
int width = DefaultToolkit().getScreenSize().width;
int height = DefaultToolkit().getScreenSize().height;
// 背景图⽚
BufferedImage bgImage = null;
/
/ ⽤来保存棋⼦的坐标
int x = 0;
int y = 0;
// 保存之前下过的全部棋⼦的坐标
// 0:表⽰这个点并没有棋⼦ 1:表⽰这个点是⿊⼦ 2:表⽰这个点是⽩⼦
int[][] allChess = new int[19][19];
// 标识当前应该是⿊棋还是⽩棋下下⼀步
boolean isBlack = true;
// 标识当前游戏是否可以继续
boolean canPlay = true;
// 保存显⽰的提⽰信息
String message = "⿊⽅先⾏";
// 保存最多拥有多少时间(秒)
int maxTime = 0;
// 做倒计时的线程类
Thread t = new Thread(this);
// 保存⿊⽅与⽩⽅的剩余时间
int blackTime = 0;
int whiteTime = 0;
// 保存双⽅剩余时间的显⽰信息
String blackMessage = "⽆限制";
String whiteMessage = "⽆限制";
public FiveChessFrame() {
// 设置标题
this.setTitle("五⼦棋");
// 设置窗体⼤⼩
this.setSize(500, 530);
// 设置窗体出现位置
this.setLocation((width - 500) / 2, (height - 500) / 2);
// 将窗体设置为⼤⼩不可变
this.setResizable(false);
// 将窗体的关闭⽅式设置为默认关闭后程序结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/
/ 为窗体加⼊
this.addMouseListener(this);
// 将窗体显⽰出来
this.setVisible(true);
t.start();
t.suspend();
// 将背景图⽚显⽰到窗体中
try {
bgImage = ad(new File("e:/Image/Five.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void paint(Graphics g) {
// 双缓冲技术防⽌屏幕闪烁
BufferedImage bi = new BufferedImage(500, 530, BufferedImage.TYPE_INT_ARGB);  Graphics g2 = bi.createGraphics();
g2.setColor(Color.BLACK);
// 绘制背景
g2.drawImage(bgImage, 0, 30, this);
// 输出标题信息
g2.setFont(new Font("⿊体", Font.BOLD, 14));
g2.drawString("游戏信息:" + message, 10, 50);
// 输出时间信息
g2.setFont(new Font("宋体", 0, 17));
g2.drawString("⿊⽅时间:" + blackMessage, 60, 490);
g2.drawString("⽩⽅时间:" + whiteMessage, 290, 490);
// 绘制棋盘
for (int i = 0; i < 19; i++) {
g2.drawLine(21, 84 + 20 * i, 377, 84 + 20 * i);
g2.drawLine(20 + 20 * i, 85, 20 + 20 * i, 441);
}
// 标注点位
g2.fillOval(78, 140, 6, 6);
g2.fillOval(317, 140, 6, 6);
g2.fillOval(317, 380, 6, 6);
g2.fillOval(78, 380, 6, 6);
g2.fillOval(198, 261, 6, 6);
// 绘制全部棋⼦
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if (allChess[i][j] == 1) {
// ⿊⼦
int tempX = i * 20 + 21;
int tempY = j * 20 + 84;
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
}
if (allChess[i][j] == 2) {
// ⽩⼦
int tempX = i * 20 + 21;
int tempY = j * 20 + 84;
g2.setColor(Color.WHITE);
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
java爱心代码编程简单g2.setColor(Color.BLACK);
g2.drawOval(tempX - 7, tempY - 7, 14, 14);
}
}
}
g.drawImage(bi, 0, 0, this);
}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
// 利⽤点击监听操作得到各个点的坐标
if (canPlay == true) {
x = e.getX();
y = e.getY();
if (x >= 20 && x <= 377 && y >= 84 && y <= 441) {
x = (x - 20) / 20;
y = (y - 84) / 20;
if (allChess[x][y] == 0) {
// 判断当前要下的是什么演的的棋⼦
if (isBlack == true) {
allChess[x][y] = 1;
isBlack = false;
message = "轮到⽩⽅";
} else {
allChess[x][y] = 2;
isBlack = true;
message = "轮到⿊⽅";
}
// 判断这个棋⼦是否和其他的棋⼦连成5连,即判断游戏是否结束
boolean winFlag = this.checkWin();
if (winFlag == true) {
JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "⿊⽅" : "⽩⽅") + "获胜!");      canPlay = false;
}
} else {
JOptionPane.showMessageDialog(this, "当前位置已经有棋⼦,请重新落⼦!");
}
}
}
// 点击开始游戏按钮
if (e.getX() >= 400 && e.getX() <= 480 && e.getY() >= 87 && e.getY() <= 122) {
int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");
if (result == 0) {
// 现在重新开始游戏
// 重新开始所要做的操作:
// 1、把棋盘清空,将allChess这个数组中的全部数据归0;
// 2、将游戏信息:的显⽰改回到开始位置
// 3、将下⼀步下棋的⼈改为⿊⽅
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
allChess[i][j] = 0;
}
}
message = "⿊⽅先⾏";
isBlack = true;
blackTime = maxTime;
whiteTime = maxTime;
if (maxTime > 0) {
blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
} else {
blackMessage = "⽆限制";
whiteMessage = "⽆限制";
}
this.canPlay = true;
}
}
/
/ 点击游戏设置按钮
if (e.getX() >= 400 && e.getX() <= 480 && e.getY() >= 150 && e.getY() <= 180) {
String input = JOptionPane.showInputDialog("请输⼊游戏的最⼤时间(单位:分钟),如果输⼊0表⽰没有时间限制");
try {
maxTime = Integer.parseInt(input) * 60;
if (maxTime < 0) {
JOptionPane.showMessageDialog(this, "请输⼊正确信息,不允许输⼊负数");
}
if (maxTime == 0) {
int result = JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?");
if (result == 0) {
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
allChess[i][j] = 0;
}
}
message = "⿊⽅先⾏";
isBlack = true;
blackTime = maxTime;
whiteTime = maxTime;
blackMessage = "⽆限制";
whiteMessage = "⽆限制";
this.canPlay = true;
}
}
if (maxTime > 0) {
int result = JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?");
if (result == 0) {
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
allChess[i][j] = 0;
}
}
message = "⿊⽅先⾏";
isBlack = 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.canPlay = true;
}
}
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(this, "请输⼊⼤于等于零的数字");
e1.printStackTrace();
}
}
// 点击游戏说明按钮
if (e.getX() >= 400 && e.getX() <= 480 && e.getY() >= 210 && e.getY() <= 245) {
JOptionPane.showMessageDialog(this, "这是⼀个五⼦棋游戏程序,⿊⽩双⽅轮流下棋,当某⼀⽅连到五⼦时游戏结束。");  }
if (e.getX() >= 400 && e.getX() <= 480 && e.getY() >= 280 && e.getY() <= 310) {
int result = JOptionPane.showConfirmDialog(this, "是否确认认输");
if (result == 0) {
if (isBlack) {
JOptionPane.showMessageDialog(this, "⿊⽅已经认输,游戏结束");
} else {
JOptionPane.showMessageDialog(this, "⽩⽅已经认输,游戏结束");
}
canPlay = false;
}
}
/
/ 点击关于按钮
if (e.getX() >= 400 && e.getX() <= 480 && e.getY() >= 340 && e.getY() <= 370) {
JOptionPane.showMessageDialog(this, "本游戏由邢洪浩制作,有相关问题可以加:xhh19980926");  }
// 点击退出按钮
if (e.getX() >= 400 && e.getX() <= 480 && e.getY() >= 400 && e.getY() <= 427) {
JOptionPane.showMessageDialog(this, "游戏结束");
}
x = (x - 20) / 20;
y = (y - 84) / 20;
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public boolean checkWin() {
boolean flag = false;
// 保存共有相同颜⾊多少棋⼦相连
int count = 1;
// 判断横向的是否有5个棋⼦相连,特点纵坐标是相同的,即allChess[x][y]中y值是相同的
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) {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。