import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;
public class GobangGame {
public static void main(String[] args) {
GameF game = new GameF();
game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.show();
}
}
class GameF extends JFrame {
public GameF() {
Container contentPane = getContentPane();
final Panel panel = new Panel();
panel.setBackground(new Color(255, 182, 147));
contentPane.setBackground(new Color(255, 182, 147));
contentPane.add(panel);
setSize(560, 560);
setTitle("五子棋游戏 版本1.0");
setResizable(false);
panel.setCursor(new Cursor(Cursor.HAND_CURSOR));
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("选项");
JMenuItem menuStart = new JMenuItem("开始游戏");
menuStart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
panel.ResetGame();
panel.repaint();
}
});
JMenuItem menuExit = new JMenuItem("退出");
menuExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menuBar.add(menu);
menu.add(menuStart);
menu.add(menuExit);
this.setJMenuBar(menuBar);
}
}
class Panel extends JPanel {
private URL blackImgURL = GobangGame.class.getResource("black.gif");
private ImageIcon black = new ImageIcon(blackImgURL);
private URL whiteImgURL = GobangGame.class.getResource("white.gif");
private ImageIcon white = new ImageIcon(whiteImgURL);
private URL currentImgURL = GobangGame.class.getResource("current.gif");
private ImageIcon current = new ImageIcon(currentImgURL);
private int i, j, k, m, n, icount;
private int[][] board = new int[16][16];
private boolean[][][] ptable = new boolean[16][16][672];
private boolean[][][] ctable = new boolean[16][16][672];
private int[][] cgrades = new int[16][16];
private int[][] pgrades = new int[16][16];
private int cgrade, pgrade;
private int[][] win = new int[2][672];
private int oldx, oldy;
private int bout = 1;
private int pcount, ccount;
private boolean player, computer, over, pwin, cwin, tie, start;
private int mat, nat, mde, nde;
public Panel() {
addMouseListener(new Xiazi());
this.ResetGame();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < 16; i++)
for (int j = 0; j < 16; j++) {
g.drawLine(50, 50 + j * 30, 500, 50 + j * 30);
}
for (int i = 0; i < 16; i++)
for (int j = 0; j < 16; j++) {
g.drawLine(50 + j * 30, 50, 50 + j * 30, 500);
}
for (int i = 0; i < 16; i++) {
String number = Integer.toString(i);
g.drawString(number, 46 + 30 * i, 45);
}
for (int i = 1; i < 16; i++) {
String number = Integer.toString(i);
g.drawString(number, 33, 53 + 30 * i);
}
updatePaint(g);
}
class Xiazi extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (!over) {
oldx = e.getX();
oldy = e.getY();
mouseClick();
repaint();
}
}
}
// 游戏初始化
public void ResetGame() {
// 初始化棋盘
for (i = 0; i < 16; i++)
for (j = 0; j < 16; j++) {
this.pgrades[i][j] = 0;
this.cgrades[i][j] = 0;
this.board[i][j] = 2;
}
// 遍历所有的五连子可能情况的权值
// 横
for (i = 0; i < 16; i++)
for (j = 0; j < 12; j++) {
for (k = 0; k < 5; k++) {
this.ptable[j + k][i][icount] = true;
this.ctable[j + k][i][icount] = true;
}
icount++;
}
// 竖
for (i = 0; i < 16; i++)
for (j = 0; j < 12; j++) {
for (k = 0; k < 5; k++) {
this.ptable[i][j + k][icount] = true;
this.ctable[i][j + k][icount] = true;
}
icount++;
}
// 右斜
for (i = 0; i < 12; i++)
for (j = 0; j < 12; j++) {
for (k = 0; k < 5; k++) {
this.ptable[j + k][i + k][icount] = true;
this.ctable[j + k][i + k][icount] = true;
}
icount++;
}
// 左斜
for (i = 0; i < 12; i++)
for (j = 15; j >= 4; j--) {
for (k = 0; k < 5; k++) {
this.ptable[j - k][i + k][icount] = true;
this.ctable[j - k][i + k][icount] = true;
}
icount++;
}
for (i = 0; i <= 1; i++)
// 初始化黑子白子上的每个权值上的连子数
for (j = 0; j < 672; j++)
this.win[i][j] = 0;
this.player = true;
this.icount = 0;
this.ccount = 0;
this.pcount = 0;
this.start = true;
this.over = false;
this.pwin = false;
this.cwin = false;
this.tie = false;
this.bout = 1;
}
public void ComTurn() { // 找出电脑(白子)最佳落子点
for (i = 0; i <= 15; i++)
// 遍历棋盘上的所有坐标
for (j = 0; j <= 15; j++) {
this.pgrades[i][j] = 0; // 该坐标的黑子奖励积分清零
if (this.board[i][j] == 2) // 在还没下棋子的地方遍历
for (k = 0; k < 672; k++)
// 遍历该棋盘可落子点上的黑子所有权值的连子情况,并给该落子点加上相应奖励分
if (this.ptable[i][j][k]) {
switch (this.win[0][k]) {
case 1: // 一连子
this.pgrades[i][j] += 5;
break;
case 2: // 两连子
this.pgrades[i][j] += 50;
break;
case 3: // 三连子
this.pgrades[i][j] += 180;
break;
case 4: // 四连子
this.pgrades[i][j] += 400;
break;
}
}
this.cgrades[i][j] = 0;// 该坐标的白子的奖励积分清零
if (this.board[i][j] == 2) // 在还没下棋子的地方遍历
for (k = 0; k < 672; k++)
// 遍历该棋盘可落子点上的白子所有权值的连子情况,并给该落子点加上相应奖励分
if (this.ctable[i][j][k]) {
switch (this.win[1][k]) {
case 1: // 一连子
this.cgrades[i][j] += 5;
break;
case 2: // 两连子
this.cgrades[i][j] += 52;
break;
case 3: // 三连子
this.cgrades[i][j] += 100;
break;
case 4: // 四连子
this.cgrades[i][j] += 400;
break;
}
}
}
if (this.start) { // 开始时白子落子坐标
if (this.board[4][4] == 2) {
m = 4;
n = 4;
} else {
m = 5;
n = 5;
}
this.start = false;
} else {
for (i = 0; i < 16; i++)
for (j = 0; j < 16; j++)
if (this.board[i][j] == 2) { // 找出棋盘上可落子点的黑子白子的各自最大权值,找出各自的最佳落子点
if (this.cgrades[i][j] >= this.cgrade) {
this.cgrade = this.cgrades[i][j];
this.mat = i;
this.nat = j;
}
if (this.pgrades[i][j] >= this.pgrade) {
this.pgrade = this.pgrades[i][j];
this.mde = i;
this.nde = j;
}
}
if (this.cgrade >= this.pgrade) { // 如果白子的最佳落子点的权值比黑子的最佳落子点权值大,则电脑的最佳落子点为白子的最佳落子点,否则相反
m = mat;
n = nat;
} else {
m = mde;
n = nde;
}
}
this.cgrade = 0;
this.pgrade = 0;
this.board[m][n] = 1; // 电脑下子位置
ccount++;
if ((ccount == 50) && (pcount == 50)) // 平局判断
{
this.tie = true;
this.over = true;
}
for (i = 0; i < 672; i++) {
if (this.ctable[m][n][i] && this.win[1][i] != 7)
this.win[1][i]++; // 给白子的所有五连子可能的加载当前连子数
if (this.ptable[m][n][i]) {
this.ptable[m][n][i] = false;
this.win[0][i] = 7;
}
}
this.player = true; // 该人落子
this.computer = false; // 电脑落子结束
}
public void mouseClick() {
if (!this.over)
if (this.player) {
if (this.oldx < 520 && this.oldy < 520) {
int m1 = m, n1 = n;
m = (oldx - 33) / 30;
n = (oldy - 33) / 30;
if (this.board[m][n] == 2) {
this.bout++;
this.board[m][n] = 0;
pcount++;
if ((ccount == 50) && (pcount == 50)) {
this.tie = true;
this.over = true;
}
for (i = 0; i < 672; i++) {
if (this.ptable[m][n][i] && this.win[0][i] != 7)
this.win[0][i]++; // 给黑子的所有五连子可能的加载当前连子数
if (this.ctable[m][n][i]) {
this.ctable[m][n][i] = false;
this.win[1][i] = 7;
}
}
this.player = false;
this.computer = true;
} else {
m = m1;
n = n1;
}
}
}
}
public void updatePaint(Graphics g) {
if (!this.over) { // 如果是轮到电脑下
if (this.computer)
this.ComTurn(); // 得到最佳下子点
// 遍历当前棋盘上的五连子情况,判断输赢
for (i = 0; i <= 1; i++)
for (j = 0; j < 672; j++) {
if (this.win[i][j] == 5)
if (i == 0) { // 人赢
this.pwin = true;
this.over = true; // 游戏结束
break;
} else {
this.cwin = true; // 电脑赢
this.over = true;
break;
}
if (this.over) // 一遇到五连子退出棋盘遍历
break;
}
g.setFont(new Font("华文行楷", 0, 20));
g.setColor(Color.RED);
// 画出当前棋盘所有棋子
for (i = 0; i <= 15; i++)
for (j = 0; j <= 15; j++) { // 如果board元素值为0,则该坐标处为黑子
if (this.board[i][j] == 0) {
g.drawImage(black.getImage(), i * 30 + 31, j * 30 + 31,
black.getImage().getWidth(
black.getImageObserver()) - 3, black
.getImage().getHeight(
black.getImageObserver()) - 3,
black.getImageObserver());
}
// 如果board元素值为1,则该坐标处为白子
if (this.board[i][j] == 1) {
g.drawImage(white.getImage(), i * 30 + 31, j * 30 + 31,
white.getImage().getWidth(
white.getImageObserver()) - 3, white
.getImage().getHeight(
white.getImageObserver()) - 3,
white.getImageObserver());
}
}
// 画出白子(电脑)当前所下子,便于辨认
if (this.board[m][n] != 2)
g
.drawImage(current.getImage(), m * 30 + 31,
n * 30 + 31, current.getImage().getWidth(
current.getImageObserver()) - 4,
current.getImage().getHeight(
current.getImageObserver()) - 4,
current.getImageObserver());
// 判断输赢情况
// 人赢
if (this.pwin)
g.drawString("您太厉害了!再来一次请重新开始游戏..", 20, 200);
// 电脑赢
if (this.cwin)
g.drawString("很遗憾,你输了!再来一次请重新开始游戏..", 84, 190);
// 平局
if (this.tie)
g.drawString("不分胜负!再来一次请重新开始游戏..", 80, 200);
g.dispose();
}
}
}
分享到:
相关推荐
Java人机对战五子棋游戏FiveChessGame设计思路: 1、用按钮做棋子,用图片填充每个按钮。 2、棋盘为24*24的 FiveChessGame类的构造方法。主要设置JFrame的相关属性、棋盘初始化方法initChess(JButton[][] ...
【标题】"GoBang-master_java人机对战五子棋_源码" 是一个开源项目,专注于实现基于Java的人工智能与人类玩家之间的五子棋对战。该项目旨在提供一个平台,让编程爱好者和游戏开发者可以研究和学习如何构建一个简单的...
这个小程序是我1年多前自己写着玩的,当时不懂这么多,两个个文件就搞定了,写的也不规范。 ai不是很智能,只是会搜索当前局面的最优解,评分规则是我从网上找的一个。大概介绍一下这个规则: 能成死二(当前位置下...
java实现的五子棋人机对战游戏.zipjava实现的五子棋人机对战游戏.zip java实现的五子棋人机对战游戏.zipjava实现的五子棋人机对战游戏.zip java实现的五子棋人机对战游戏.zipjava实现的五子棋人机对战游戏.zip java...
【网页版人机对战五子棋】是一种在网页上实现的互动游戏,它允许玩家与计算机进行对弈。这个游戏的开发涉及到了多种技术,包括前端界面设计、后端逻辑处理以及人工智能算法的运用。 首先,前端部分是用户与游戏交互...
主要是一个五子棋游戏,利用java swing技术编写,总共只有一个类,两个内部类。人机对战
java人机对战五子棋,只是为了证明电脑思维是一种机械化的、愚蠢的、无情绪化的思维
综上所述,"人机对战五子棋程序"的开发涵盖了许多IT领域的核心知识,包括但不限于算法、AI、GUI设计、数据结构、程序优化和项目管理。通过这个项目,开发者不仅可以提升自身的编程技能,还能深入理解人工智能在游戏...
使用Java开发的人机对战五子棋,具有界面效果,总代码量500多行。界面使用awt,swing简单技术,机器落子算法是评分法,对572个五元组评分,思路简单,效果很好,机器胜率非常高。 笔者不仅打包了jar,而且打包的....
本项目是一套基于java swing的人机对战五子棋系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格...
【Java五子棋人机对战】是一款基于Java编程语言实现的桌面游戏,它允许玩家与计算机进行对弈,提供了一种娱乐与学习相结合的方式。在这个项目中,开发者利用Java的强大功能,创建了一个直观且互动性强的五子棋界面,...
【标题】"JAVA版GUI人机对战 五子棋"是使用Java编程语言和Swing库构建的一款桌面游戏,允许玩家与计算机进行五子棋的对弈。五子棋是一种双人对弈的策略游戏,目标是在棋盘上先形成连续的五个棋子(横向、纵向或对角...
【Java版人机对战五子棋】是一个利用Java编程语言实现的计算机游戏,主要特点在于它的人机对战模式,让玩家可以与计算机进行博弈。这个程序在设计上不仅展示了基本的游戏逻辑,还涉及到了人工智能和博弈算法的运用,...
【标题】"java编写的人机对战五子棋"是一个基于Java编程语言实现的互动游戏项目,它允许玩家与计算机进行对弈。在这款游戏中,玩家可以体验到经典的五子棋玩法,即先连成五子直线(横、竖、斜)的一方获胜。 【描述...
【标题】"五子棋人机对战_初级"是一个基于Java编程语言开发的简易五子棋游戏,专为初学者设计。这个项目的核心在于实现一个简单的命令行界面,允许玩家与计算机进行对战,从而体验到编程带来的乐趣和成就感。 ...
【Android人机对战五子棋游戏源码】是一个典型的Android平台上的游戏开发实例,它展示了如何构建一个简单但互动性强的对战游戏。在这个项目中,开发者将面临多个技术挑战,包括图形用户界面(GUI)设计、人工智能...
在本项目中,"Android人机对战五子棋源码FiveChess" 是一个基于Android平台开发的五子棋游戏应用程序。它包含了两种不同难度级别的AI(人工智能)对手,即“愚蠢的AI”和“聪明的AI”,为用户提供了一种与计算机对弈...
本程序适用于java初学者巩固类与对象、事件响应、awt包中各种工具的相关概念以及对逻辑能力的锻炼 需要注意的有: ①要加入java界面的重绘(基本原则) ②由于玩家需要通过鼠标点击,计算机响应出棋子的位置,但...
《人机对战五子棋》是一款基于计算机编程技术实现的简单游戏,它融合了人工智能与传统棋类游戏的精髓,让玩家可以在数字世界中体验五子棋的乐趣。这款开源项目不仅提供了源码,还展示了如何利用编程技术来构建一个...