联网版五子棋

news/2024/11/24 4:48:10/

下面的代码实现了一个非常简单的联网五子棋程序,写给学生的一个例子,很多功能都还没实现,用的也是民间规则,姑且一看吧!

棋盘类:

package com.accp;import java.awt.Color;
import java.awt.Graphics;/*** 棋盘* @author 骆昊**/
public class Board {private int[][] board = new int[15][15];	// 用二维数组代表15*15的棋盘/*** 绘制棋盘* @param g 画笔*/public void draw(Graphics g) {for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[i].length; j++) {if(board[i][j] != 0) {	// 不是空格if(board[i][j] == 1) {	// 黑子g.setColor(Color.BLACK);}else {	// 白子g.setColor(Color.WHITE);}g.fillOval(35 * (j + 1), 35 * (i + 1), 30, 30);if(board[i][j] == 2) {	// 给白子加上边框g.setColor(Color.BLACK);g.drawOval(35 * (j + 1), 35 * (i + 1), 30, 30);}}}}}/*** 向棋盘中放置棋子* @param row 放置棋子的行* @param col 放置棋子的列* @param isBlack 黑棋还是白棋* @return 返回true落子成功, 返回false落子失败(已经有棋子)*/public boolean addPiece(int row, int col, boolean isBlack) {if(board[row][col] == 0) {	// 没有棋子的地方才能落子board[row][col] = isBlack? 1 : 2;	// 1代表黑子2代表白子return true;}return false;}/*** 判断胜负* @param row 落子的行* @param col 落子的列* @param isBlack 是黑子还是白子* @return 获胜返回true否则返回false*/public boolean isWin(int row, int col, boolean isBlack) {return checkH(row, col, isBlack) || checkV(row, col, isBlack) || checkX1(row, col, isBlack) || checkX2(row, col, isBlack);}// 判断从右上到左下的斜线上是否连成5颗棋子private boolean checkX2(int row, int col, boolean isBlack) {int counter = 1;int currentRow = row;int currentCol = col;int v = isBlack? 1 : 2;while(currentRow > 0 && currentCol < 14 && board[--currentRow][++currentCol] == v) {counter++;}currentRow = row;currentCol = col;while(currentRow < 14 && currentCol > 0 && board[++currentRow][--currentCol] == v) {counter++;}return counter >= 5;}// 判断从左上到右下的斜线上是否连成5颗棋子private boolean checkX1(int row, int col, boolean isBlack) {int counter = 1;int currentRow = row;int currentCol = col;int v = isBlack? 1 : 2;while(currentRow > 0 && currentCol > 0 && board[--currentRow][--currentCol] == v) {counter++;}currentRow = row;currentCol = col;while(currentCol < 14 && currentRow < 14 && board[++currentRow][++currentCol] == v) {counter++;}return counter >= 5;}// 判断竖着方向上是否连成5颗棋子private boolean checkV(int row, int col, boolean isBlack) {int counter = 1;int currentRow = row;int v = isBlack? 1 : 2;while(currentRow > 0 && board[--currentRow][col] == v) {counter++;}currentRow = row;while(currentRow < 14 && board[++currentRow][col] == v) {counter++;}return counter >= 5;}// 判断横着方向上是否连成5颗棋子private boolean checkH(int row, int col, boolean isBlack) {int counter = 1;int currentCol = col;int v = isBlack? 1 : 2;while(currentCol > 0 && board[row][--currentCol] == v) {counter++;}currentCol = col;while(currentCol < 14 && board[row][++currentCol] == v) {counter++;}return counter >= 5;}
}

绘制棋盘的面板类:

package com.accp;import java.awt.Color;
import java.awt.Graphics;import javax.swing.JPanel;@SuppressWarnings("serial")
/*** 绘制棋盘的面板* @author 骆昊**/
public class MyPanel extends JPanel {private Board b = null;public MyPanel(Board b) {this.b = b;}@Overridepublic void paint(Graphics g) {g.setColor(new Color(165, 185, 75));	g.fillRect(35, 35, 525, 525);	// 绘制背景g.setColor(Color.BLACK);for (int i = 0; i < 15; i++) {	// 绘制棋盘网格g.drawLine(50, 50 + i * 35, 540, 50 + i * 35);g.drawLine(50 + i * 35, 50, 50 + i * 35, 540);}g.fillOval(290, 290, 10, 10);	// 绘制天元b.draw(g);	// 绘制棋盘}
}

游戏窗体类:

package com.accp;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;@SuppressWarnings("serial")
public class MyFrame extends JFrame implements ActionListener {private boolean isBlack = true;	// 是否轮到黑棋private Board b = new Board();	// 棋盘对象private boolean isWin = false;	// 是否获得胜利private boolean isStart = false;	// 是否联机成功开始游戏private boolean isYourTurn = false;	// 是否轮到自己走子private DataInputStream din = null;private DataOutputStream dout = null;private class MouseHandler extends MouseAdapter {@Overridepublic void mousePressed(MouseEvent e) {if (isStart && isYourTurn && !isWin) {	// 游戏已经开始并且轮到自己且未分出胜负则可落子int x = e.getX();int y = e.getY();if (x >= 50 && x <= 540 && y >= 0 && y <= 540) {	// 棋盘范围以内// 通过鼠标坐标计算出点击棋盘的行和列int row = Math.round((y - 50) / 35f);int col = Math.round((x - 50) / 35f);if (b.addPiece(row, col, isBlack)) {	// 落子成功repaint();try {	// 向对方棋盘发送刚才落子的位置(行、列)以及黑子还是白子dout.writeInt(row);dout.writeInt(col);dout.writeBoolean(isBlack);} catch (IOException ex) {ex.printStackTrace();}isWin = b.isWin(row, col, isBlack);	// 判断是否获胜if (!isWin) {isYourTurn = !isYourTurn;	// 尚未分出胜负则交换走棋方} else {JOptionPane.showMessageDialog(null, isBlack ? "黑棋胜": "白棋胜");isWin = true;repaint();}}}}}}private JButton createGameButton, joinGameButton;private JPanel boardPanel;	// 绘制棋盘的面板public MyFrame() {this.setTitle("五子棋");this.setSize(700, 600);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(EXIT_ON_CLOSE);boardPanel = new MyPanel(b);boardPanel.setBounds(0, 0, 600, 600);this.add(boardPanel);boardPanel.addMouseListener(new MouseHandler());	// 向面板中添加鼠标监听器this.setLayout(null);createGameButton = new JButton("创建游戏");createGameButton.setBounds(580, 100, 100, 35);createGameButton.addActionListener(this);joinGameButton = new JButton("加入游戏");joinGameButton.setBounds(580, 160, 100, 35);joinGameButton.addActionListener(this);this.add(createGameButton);this.add(joinGameButton);// 创建一个线程监听对方走棋的消息new Thread(new Runnable() {public void run() {while (true) {	// 循环监听对方发送的走棋消息while (isStart && !isYourTurn) {try {// 读取对方落子的行列以及是黑子还是白子int row = din.readInt();int col = din.readInt();boolean isBlack = din.readBoolean();b.addPiece(row, col, isBlack);	// 向棋盘添加对方走的棋子repaint();if(b.isWin(row, col, isBlack)) {JOptionPane.showMessageDialog(null, isBlack ? "黑棋胜": "白棋胜");isWin = true;repaint();}isYourTurn = !isYourTurn;	// 收到对方棋子后交换走棋方} catch (IOException ex) {ex.printStackTrace();}}}}}).start();}public static void main(String[] args) {new MyFrame().setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {String command = e.getActionCommand();if (command.equals("创建游戏")) {// 创建一个线程启动服务器套接字new Thread(new Runnable() {@Overridepublic void run() {try {ServerSocket server = new ServerSocket(5566);Socket client = server.accept();din = new DataInputStream(client.getInputStream());dout = new DataOutputStream(client.getOutputStream());isStart = true;isBlack = true;isYourTurn = true;} catch (IOException e) {e.printStackTrace();}}}).start();joinGameButton.setEnabled(false);} else if (command.equals("加入游戏")) {String ip = JOptionPane.showInputDialog(this, "请输入游戏主机IP地址或机器名: ");if(ip != null && !ip.equals("")) {try {Socket client = new Socket(ip, 5566);din = new DataInputStream(client.getInputStream());dout = new DataOutputStream(client.getOutputStream());isStart = true;isYourTurn = false;isBlack = false;} catch (Exception ex) {ex.printStackTrace();}repaint();createGameButton.setEnabled(false);}}}}

下面是运行的效果:



http://www.ppmy.cn/news/881447.html

相关文章

我的五子棋人工智能算法

近期完成了一个支持人机对战的五子棋游戏。虽然比较简单,而且对于常下五子棋的人来说,计算机的胜率往往低于50%,但无论如何,我对人工智能一块还是比较满意,所以发表出来,以期抛砖引玉,和大家共同探讨。 对于五子棋游戏来说,人工智能的核心思想是:分析棋盘上所有的空…

五子棋项目

目录 核心技术: 主要模块和功能: 基本思路: 注册、登录接口: 具体实现: 匹配功能接口: 具体实现: 用户对战接口: 具体实现: 项目源码Gitee地址: 网页版五子棋的基本思路及实现 核心技术: Spring/SpringBoot/SpringMVCWebSocketMySQLMyBatisHTML/CSS/JS/AJAX 主要模…

python五子棋ai棋力最高_棋力最强的五子棋 App 是什么?

插嘴说下这个五子棋大师 编程我不懂&#xff0c;这个五子棋大师的计算尚可&#xff0c;应该在五步以上&#xff0c;除去掌握比较熟练的棋型&#xff0c;大部分情况下我没有它算的远&#xff0c;如果正常和它下的话&#xff0c;想赢最高级&#xff0c;很吃力。 但是我还是可以轻…

简易人机对弈算法的五子棋程序

要求的五子棋游戏应达到以下几方面的要求: &#xff08;1&#xff09;运行程序后即刻出现棋盘并可以开始下棋&#xff1b; &#xff08;2&#xff09;人机对弈时&#xff0c;先手为黑棋&#xff0c;后手为白棋&#xff1b;人为先手&#xff0c;计算机为后手&#xff1b; &…

inventor2五子棋游戏apk_五子棋大师2中文版游戏

五子棋大师2中文版是一款经典好玩的五子棋游戏&#xff0c;计有世界比赛和区域比赛两种形态。无论何种比赛形态&#xff0c;玩家均必须和电脑控制的几位对手进行比赛&#xff0c;求取最佳名次&#xff0c;以打入排行榜。电脑控制的对手棋力和棋风各有不同&#xff0c;但整体而言…

五子棋 源码

JS 五子棋 带成绩排名 游戏&#xff1a;http://wx0725.top/index.php/181.html 主程序学习&#xff1a;https://blog.csdn.net/qq_44731019/article/details/109586730 改了几个 BUG添加了成绩截图功能去掉了悔棋 自己看着重新写吧&#xff0c;下面代码只是一个思路&#xff0c…

五子棋AI算法

在本次“五子棋“程序的编写中&#xff0c;只编写了人机对弈部分&#xff0c;运用了博弈树进行搜索&#xff0c;在选取最优的走步时使用极大极小分析法&#xff0c;考虑到搜索的时间复杂度和空间复杂度&#xff0c;在程序中只进行了2步搜索&#xff0c;即计算机在考虑下一步的走…

五子棋 ai算法

博弈类人工智能&#xff0c;其中一个方法就是&#xff1a;博弈树极大极小值alpha-beta剪枝搜索。 是不是觉得这个名字很牛逼&#xff0c; 但经过我的详细解读&#xff0c; 你马上就会发现&#xff0c;原来不过如此。 对于要实现一个会智能下五子棋的AI&#xff0c;要怎么去实…