package Five_Chess;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
/**
* 五子棋程序主类
*/
public class Five {
//******************************************变量定义************************************************
// 可修改参数
// 搜索的深度以及广度
protected int deep = 3, weight = 7;
// 和棋步数
protected int drawn_num = 110;
// 不可修改
// 主窗口
protected Shell shell = new Shell(SWT.TITLE | SWT.BORDER | SWT.CLOSE);
// 棋盘
private Canvas canvas;
// 记录下棋点的x,y坐标 最多 (drawn_num + 1) 个
protected int[][] pre = new int[drawn_num + 1][2];
// 棋局是否开始标志 0:未开始(默认) 1:已经开始
protected boolean startflag = false;
// 棋盘单元格大小
protected final int size = 30;
// 当前棋局 0:黑子占据,1:白子占据,2:空位
protected int[][] chess = new int[15][15];
// 当前应该下的棋色 0:黑色(默认), 1:白色
protected int bw = 0;
// 是否已经分出胜负
protected boolean win = false;
// 胜利棋色
protected int win_bw;
// 是否选择禁手标志 0:无禁手 1:有禁手(默认)
protected boolean able_flag = true;
// 禁手选择的button
protected final Group group_1 = new Group(shell, SWT.NONE);
protected final Button button_1 = new Button(group_1, SWT.RADIO);
protected final Button button_2 = new Button(group_1, SWT.RADIO);
// 玩家棋色选择 0:黑色(默认) 1:白色
protected int sbw = 0;
// 棋色选择的button
protected final Group group_2 = new Group(shell, SWT.NONE);
protected final Button button_3 = new Button(group_2, SWT.RADIO);
protected final Button button_4 = new Button(group_2, SWT.RADIO);
// 难度选择的button
protected final Group group_3 = new Group(shell, SWT.NONE);
protected final Button button_5 = new Button(group_3, SWT.RADIO);
protected final Button button_6 = new Button(group_3, SWT.RADIO);
// 游戏信息
private Label label_total;
private static Label label_time;
private Label label_wait_bw;
// 总落子数目
private int chess_num = 0;
// 相关时间,单位s
private int total_time = 0;
private Timer time;
// 边界值,用于速度优化
protected int x_max = 15, x_min = 0;
protected int y_max = 15, y_min = 0;
//**********************************主界面菜单块******************************************
/**
* Launch the application
*
* @param args
*/
public static void main(String[] args) {
try {
Five window = new Five();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Open the window
*/
public void open() {
final Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
dispose();
}
/**
* Create contents of the window
*/
protected void createContents() {
// 初始化窗口
shell.setSize(488, 572);
shell.setText(" 五子棋--人机对战版 v1.0 ");
// 初始化棋盘
for (int i = 0; i < 15; i++)
for (int j = 0; j < 15; j++)
chess[i][j] = 2;
// 其它初始化
initCanvas();
initUp();
initDown();
// 开始计时
startTime();
}
/**
* 初始化下侧 button
*/
private void initDown() {
// 禁手选择
group_1.setBounds(2, 495, 63, 40);
button_1.setText("有禁手");
button_1.setBounds(5, 7, 55, 15);
button_1.setSelection(true);
button_2.setText("无禁手");
button_2.setBounds(5, 22, 55, 15);
// 棋色选择
group_2.setBounds(67, 495, 75, 40);
button_3.setText("黑棋先手");
button_3.setBounds(5, 7, 65, 15);
button_3.setSelection(true);
button_4.setText("白棋后手");
button_4.setBounds(5, 22, 65, 15);
// 难度选择
group_3.setBounds(144, 495, 75, 40);
button_5.setText("初级电脑");
button_5.setBounds(5, 7, 65, 15);
button_5.setSelection(true);
button_6.setText("高级电脑");
button_6.setBounds(5, 22, 65, 15);
// 开始
final Button startButton = new Button(shell, SWT.NONE);
startButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent se) {
// 初始化所有游戏信息
startflag = true;
win = false;
chess_num = 0;
total_time = 0;
bw = 0;
for (int i = 0; i < 15; i++)
for (int j = 0; j < 15; j++)
chess[i][j] = 2;
// 是否选择禁手
if (button_1.getSelection())
able_flag = true;
else
able_flag = false;
button_1.setEnabled(false);
button_2.setEnabled(false);
// 棋色
if (button_3.getSelection()) {
sbw = 0;
label_wait_bw.setText("等待 玩家 落子...");
}
else {
sbw = 1;
// 随机下一子
int x = 7, y = 7;
for (int i = 5; i < 9; i++)
for (int j = 5; j < 9; j++)
if (randomTest(20 * (Math.abs(7 - i) + Math.abs(7 - j)) + 2)) {
x = i;
y = j;
}
chess[x][y] = bw;
update( x, y );
if(x-1>=0)
x_min = x-1;
if(x-1<=15)
x_max = x+1;
if(y-1>=0)
y_min = y-1;
if(y-1<=15)
y_max = y+1;
}
button_3.setEnabled(false);
button_4.setEnabled(false);
// 难度
if(button_5.getSelection())
deep = 3;
else if (button_6.getSelection())
deep = 5;
button_5.setEnabled(false);
button_6.setEnabled(false);
startButton.setText("重新开始");
canvas.redraw();
}
});
startButton.setText("开始");
startButton.setBounds(221, 501, 65, 33);
// 悔棋
final Button backButton = new Button(shell, SWT.NONE);
backButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent se) {
if(win) {
MessageBox mb = new MessageBox(shell, SWT.ICON_INFORMATION|SWT.YES);
mb.setText("不能悔棋");
mb.setMessage("棋局已经结束!请从新开始新的棋局!");
mb.open();
return;
}
// 当前轮到玩家下棋,取消两步 否则,取消一步
if(chess_num >= 2 && bw == sbw){
chess[pre[chess_num-1][0]][pre[chess_num-1][1]] = 2;
chess[pre[chess_num-2][0]][pre[chess_num-2][1]] = 2;
chess_num -= 2;
label_total.setText("总落子
java五子棋Five-Chess(java)
需积分: 0 33 浏览量
更新于2024-01-31
收藏 31KB RAR 举报
Java五子棋是一款基于Java编程语言开发的桌面游戏,它实现了两人对弈的传统五子棋玩法。在设计这款五子棋游戏时,开发者通常会遵循以下几个关键知识点:
1. **图形用户界面(GUI)**:游戏首先从设计用户界面开始,这通常涉及到Java Swing或JavaFX库。这些库提供了丰富的组件来构建窗口、按钮、面板等,使得用户可以直观地点击、拖动棋子。开发者需要定义棋盘布局,以及棋子的样式和交互行为。
2. **事件监听**:为了响应用户的操作,如点击棋盘上的某个位置放置棋子,Java中需要添加事件监听器。例如,使用MouseListener或ActionListener来捕获并处理用户的点击事件。
3. **棋盘逻辑**:游戏的核心是棋盘上的棋局逻辑。开发者需要编写代码来检查每一步是否合法,比如棋子只能放在空位上,不能放在已经有棋子的位置。此外,还需要实现棋子的交替放置规则,确保黑白双方轮流下棋。
4. **游戏状态判断**:五子棋的关键在于判断输赢。开发者需要实现算法来检查当前棋局是否有五子连线,即横、竖、斜方向上有五个相同颜色的棋子连在一起。这通常通过遍历棋盘,进行多次线性搜索来实现。
5. **回溯法**:为了防止用户非法操作,如连续下棋或在已有棋子的位置下棋,开发者可能会采用回溯法。当检测到非法操作时,可以撤销上一步,让游戏回到合法的状态。
6. **游戏结束条件**:除了五子连珠的胜利条件,还需要考虑平局(即棋盘填满,双方都无法形成五子连线)的情况。当满足结束条件时,程序应显示相应的提示信息。
7. **人机对战模式**:如果游戏包含人机对战模式,那么还需要设计一个简单的AI算法。这可能是一个基于规则的系统,也可能是一个更复杂的搜索算法,如Minimax或Alpha-Beta剪枝,以让计算机能够智能地选择下一步。
8. **多线程**:为了保证游戏的流畅性,人机对战时的计算过程可能需要在单独的线程中执行,以避免阻塞用户界面。
9. **错误处理和日志记录**:良好的程序设计还包括错误处理机制,当遇到异常情况时,能够给出有用的反馈,同时通过日志记录问题,便于调试和改进。
通过以上这些技术,一个完整的Java五子棋游戏就能被实现。在这个过程中,开发者不仅可以提升Java编程技能,还能深入理解游戏逻辑设计和用户交互原理。五子棋的简单规则和复杂策略使其成为学习游戏开发的理想项目。
星尘库
- 粉丝: 1447
- 资源: 82
最新资源
- 冒泡排序算法详解及Java与Python实现
- 字幕网页文字检测20-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- FastAdmin后台框架开源且可以免费商用,一键生成CRUD, 一款基于ThinkPHP和Bootstrap的极速后台开发框架,基于Auth验证的权限管理系统,一键生成 CRUD,自动生成控制器等
- IMG_4525.jpg
- 基于 Spring Cloud 的一个分布式系统套件的整合 具备 JeeSite4 单机版的所有功能,统一身份认证,统一基础数据管理,弱化微服务开发难度
- GigaDevice.GD32F4xx-DFP.2.1.0 器件安装包
- 智慧校园数字孪生,三维可视化
- 多种土地使用类型图像分类数据集【已标注,约30,000张数据】
- 3.0(1).docx
- 国产文本编辑器:EverEdit用户手册 1.1.0