Java游戏源码:象棋网络对战版

学习java朋友们,福利来了,今天小编给大家带来了一款象棋网络对战版源码。

源码搭建和讲解

源码分为客户端和服务器,采用java原生 java.net.Socket 实现,服务器主循环代码:

import java.net.ServerSocket;
import java.net.Socket;//************************************************************************
// ************完整源码移步: gitee典康姆/hadluo/java_game01.git *********
//************************************************************************
public class ServerThread extends Thread {Server father;ServerSocket ss;boolean flag = true;public ServerThread(Server father) {this.father = father;ss = father.ss;}public void run() {while (flag) {try {Socket sc = ss.accept();//等待客户端连接ServerAgentThread sat = new ServerAgentThread(father, sc);sat.start();//创建并启动服务器代理线程} catch (Exception e) {e.printStackTrace();}}}
}

客户端主函数

public class XiangQi extends JFrame implements ActionListener {public static final Color bgColor = new Color(245, 250, 160);public static final Color focusbg = new Color(242, 242, 242);public static final Color focuschar = new Color(96, 95, 91);public static final Color color1 = new Color(249, 50, 183);public static final Color color2 = Color.white;JLabel jlHost = new JLabel("主机名");JLabel jlPort = new JLabel("端口号");JLabel jlNickName = new JLabel("昵    称");JTextField jtfHost = new JTextField("127.0.0.1");JTextField jtfPort = new JTextField("9999");JTextField jtfNickName = new JTextField("Play1");JButton jbConnect = new JButton("连  接");JButton jbDisconnect = new JButton("断  开");JButton jbFail = new JButton("认  输");JButton jbChallenge = new JButton("挑  战");JComboBox jcbNickList = new JComboBox();JButton jbYChallenge = new JButton("接受挑战");JButton jbNChallenge = new JButton("拒绝挑战");int width = 60;QiZi[][] qiZi = new QiZi[9][10];QiPan jpz = new QiPan(qiZi, width, this);JPanel jpy = new JPanel();JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jpz, jpy);boolean caiPan = false;//可否走棋的标志位int color = 0;//0 代表红棋,1代表白棋Socket sc;ClientAgentThread cat;public XiangQi() {this.initialComponent();this.addListener();this.initialState();this.initialQiZi();this.initialFrame();}public void initialComponent() {jpy.setLayout(null);this.jlHost.setBounds(10, 10, 50, 20);jpy.add(this.jlHost);this.jtfHost.setBounds(70, 10, 80, 20);jpy.add(this.jtfHost);this.jlPort.setBounds(10, 40, 50, 20);jpy.add(this.jlPort);this.jtfPort.setBounds(70, 40, 80, 20);jpy.add(this.jtfPort);this.jlNickName.setBounds(10, 70, 50, 20);jpy.add(this.jlNickName);this.jtfNickName.setBounds(70, 70, 80, 20);jpy.add(this.jtfNickName);this.jbConnect.setBounds(10, 100, 80, 20);jpy.add(this.jbConnect);this.jbDisconnect.setBounds(100, 100, 80, 20);jpy.add(this.jbDisconnect);this.jcbNickList.setBounds(20, 130, 130, 20);jpy.add(this.jcbNickList);this.jbChallenge.setBounds(10, 160, 80, 20);jpy.add(this.jbChallenge);this.jbFail.setBounds(100, 160, 80, 20);jpy.add(this.jbFail);this.jbYChallenge.setBounds(5, 190, 86, 20);jpy.add(this.jbYChallenge);this.jbNChallenge.setBounds(100, 190, 86, 20);jpy.add(this.jbNChallenge);jpz.setLayout(null);jpz.setBounds(0, 0, 700, 700);}public void addListener() {this.jbConnect.addActionListener(this);this.jbDisconnect.addActionListener(this);this.jbChallenge.addActionListener(this);this.jbFail.addActionListener(this);this.jbYChallenge.addActionListener(this);this.jbNChallenge.addActionListener(this);}public void initialState() {this.jbDisconnect.setEnabled(false);this.jbChallenge.setEnabled(false);this.jbYChallenge.setEnabled(false);this.jbNChallenge.setEnabled(false);this.jbFail.setEnabled(false);}public void initialQiZi() {qiZi[0][0] = new QiZi(color1, "車", 0, 0);qiZi[1][0] = new QiZi(color1, "馬", 1, 0);qiZi[2][0] = new QiZi(color1, "相", 2, 0);qiZi[3][0] = new QiZi(color1, "仕", 3, 0);qiZi[4][0] = new QiZi(color1, "帥", 4, 0);qiZi[5][0] = new QiZi(color1, "仕", 5, 0);qiZi[6][0] = new QiZi(color1, "相", 6, 0);qiZi[7][0] = new QiZi(color1, "馬", 7, 0);qiZi[8][0] = new QiZi(color1, "車", 8, 0);qiZi[1][2] = new QiZi(color1, "砲", 1, 2);qiZi[7][2] = new QiZi(color1, "砲", 7, 2);qiZi[0][3] = new QiZi(color1, "兵", 0, 3);qiZi[2][3] = new QiZi(color1, "兵", 2, 3);qiZi[4][3] = new QiZi(color1, "兵", 4, 3);qiZi[6][3] = new QiZi(color1, "兵", 6, 3);qiZi[8][3] = new QiZi(color1, "兵", 8, 3);qiZi[0][9] = new QiZi(color2, "車", 0, 9);qiZi[1][9] = new QiZi(color2, "馬", 1, 9);qiZi[2][9] = new QiZi(color2, "象", 2, 9);qiZi[3][9] = new QiZi(color2, "士", 3, 9);qiZi[4][9] = new QiZi(color2, "將", 4, 9);qiZi[5][9] = new QiZi(color2, "士", 5, 9);qiZi[6][9] = new QiZi(color2, "象", 6, 9);qiZi[7][9] = new QiZi(color2, "馬", 7, 9);qiZi[8][9] = new QiZi(color2, "車", 8, 9);qiZi[1][7] = new QiZi(color2, "炮", 1, 7);qiZi[7][7] = new QiZi(color2, "炮", 7, 7);qiZi[0][6] = new QiZi(color2, "卒", 0, 6);qiZi[2][6] = new QiZi(color2, "卒", 2, 6);qiZi[4][6] = new QiZi(color2, "卒", 4, 6);qiZi[6][6] = new QiZi(color2, "卒", 6, 6);qiZi[8][6] = new QiZi(color2, "卒", 8, 6);}public void initialFrame() {this.setTitle("中国象棋--客户端");Image image = new ImageIcon("ico.gif").getImage();this.setIconImage(image);this.add(this.jsp);jsp.setDividerLocation(730);jsp.setDividerSize(4);this.setBounds(30, 30, 930, 730);this.setVisible(true);this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {if (cat == null)//客户端代理线程为空,直接退出{System.exit(0);return;}try {if (cat.tiaoZhanZhe != null){try {cat.dout.writeUTF("<#RENSHU#>" + cat.tiaoZhanZhe);} catch (Exception ee) {ee.printStackTrace();}}cat.dout.writeUTF("<#CLIENT_LEAVE#>");cat.flag = false;//终止客户端代理线程cat = null;} catch (Exception ee) {ee.printStackTrace();}System.exit(0);}});}public void actionPerformed(ActionEvent e) {if (e.getSource() == this.jbConnect) {this.jbConnect_event();} else if (e.getSource() == this.jbDisconnect) {this.jbDisconnect_event();} else if (e.getSource() == this.jbChallenge) {this.jbChallenge_event();} else if (e.getSource() == this.jbYChallenge) {this.jbYChallenge_event();} else if (e.getSource() == this.jbNChallenge) {this.jbNChallenge_event();} else if (e.getSource() == this.jbFail) {this.jbFail_event();}}public void jbConnect_event() {int port = 0;try {port = Integer.parseInt(this.jtfPort.getText().trim());} catch (Exception ee) {JOptionPane.showMessageDialog(this, "端口号只能是整数", "错误",JOptionPane.ERROR_MESSAGE);return;}if (port > 65535 || port < 0) {JOptionPane.showMessageDialog(this, "端口号只能是0-65535的整数", "错误",JOptionPane.ERROR_MESSAGE);return;}String name = this.jtfNickName.getText().trim();if (name.length() == 0) {JOptionPane.showMessageDialog(this, "玩家姓名不能为空", "错误",JOptionPane.ERROR_MESSAGE);return;}try {sc = new Socket(this.jtfHost.getText().trim(), port);cat = new ClientAgentThread(this);cat.start();this.jtfHost.setEnabled(false);this.jtfPort.setEnabled(false);this.jtfNickName.setEnabled(false);this.jbConnect.setEnabled(false);this.jbDisconnect.setEnabled(true);this.jbChallenge.setEnabled(true);this.jbYChallenge.setEnabled(false);this.jbNChallenge.setEnabled(false);this.jbFail.setEnabled(false);JOptionPane.showMessageDialog(this, "已连接到服务器", "提示",JOptionPane.INFORMATION_MESSAGE);} catch (Exception ee) {JOptionPane.showMessageDialog(this, "连接服务器失败", "错误",JOptionPane.ERROR_MESSAGE);return;}}public void jbDisconnect_event() {try {this.cat.dout.writeUTF("<#CLIENT_LEAVE#>");this.cat.flag = false;this.cat = null;this.jtfHost.setEnabled(!false);this.jtfPort.setEnabled(!false);this.jtfNickName.setEnabled(!false);this.jbConnect.setEnabled(!false);this.jbDisconnect.setEnabled(!true);this.jbChallenge.setEnabled(!true);this.jbYChallenge.setEnabled(false);this.jbNChallenge.setEnabled(false);this.jbFail.setEnabled(false);} catch (Exception ee) {ee.printStackTrace();}}public void jbChallenge_event() {Object o = this.jcbNickList.getSelectedItem();if (o == null || ((String) o).equals("")) {JOptionPane.showMessageDialog(this, "请选择对方名字", "错误",JOptionPane.ERROR_MESSAGE);//当未选中挑战对象,给出错误提示信息} else {String name2 = (String) this.jcbNickList.getSelectedItem();try {this.jtfHost.setEnabled(false);this.jtfPort.setEnabled(false);this.jtfNickName.setEnabled(false);this.jbConnect.setEnabled(false);this.jbDisconnect.setEnabled(!true);this.jbChallenge.setEnabled(!true);this.jbYChallenge.setEnabled(false);this.jbNChallenge.setEnabled(false);this.jbFail.setEnabled(false);this.cat.tiaoZhanZhe = name2;this.caiPan = true;this.color = 0;this.cat.dout.writeUTF("<#TIAO_ZHAN#>" + name2);JOptionPane.showMessageDialog(this, "已提出挑战,请等待恢复...", "提示",JOptionPane.INFORMATION_MESSAGE);} catch (Exception ee) {ee.printStackTrace();}}}public void jbYChallenge_event() {try {this.cat.dout.writeUTF("<#TONG_YI#>" + this.cat.tiaoZhanZhe);this.caiPan = false;//将caiPan设为falsethis.color = 1;//将color设为1this.jtfHost.setEnabled(false);this.jtfPort.setEnabled(false);this.jtfNickName.setEnabled(false);this.jbConnect.setEnabled(false);this.jbDisconnect.setEnabled(!true);this.jbChallenge.setEnabled(!true);this.jbYChallenge.setEnabled(false);this.jbNChallenge.setEnabled(false);this.jbFail.setEnabled(!false);} catch (Exception ee) {ee.printStackTrace();}}public void jbNChallenge_event() {try {this.cat.dout.writeUTF("<#BUTONG_YI#>" + this.cat.tiaoZhanZhe);this.cat.tiaoZhanZhe = null;this.jtfHost.setEnabled(false);this.jtfPort.setEnabled(false);this.jtfNickName.setEnabled(false);this.jbConnect.setEnabled(false);this.jbDisconnect.setEnabled(true);this.jbChallenge.setEnabled(true);this.jbYChallenge.setEnabled(false);this.jbNChallenge.setEnabled(false);this.jbFail.setEnabled(false);} catch (Exception ee) {ee.printStackTrace();}}public void jbFail_event() {try {this.cat.dout.writeUTF("<#RENSHU#>" + this.cat.tiaoZhanZhe);this.cat.tiaoZhanZhe = null;this.color = 0;this.caiPan = false;this.next();this.jtfHost.setEnabled(false);this.jtfPort.setEnabled(false);this.jtfNickName.setEnabled(false);this.jbConnect.setEnabled(false);this.jbDisconnect.setEnabled(true);this.jbChallenge.setEnabled(true);this.jbYChallenge.setEnabled(false);this.jbNChallenge.setEnabled(false);this.jbFail.setEnabled(false);} catch (Exception ee) {ee.printStackTrace();}}public void next() {for (int i = 0; i < 9; i++) {for (int j = 0; j < 10; j++) {this.qiZi[i][j] = null;}}this.caiPan = false;this.initialQiZi();this.repaint();//重绘}public static void main(String args[]) {new XiangQi();}
}

结尾语

我是分享好物+教程+源码 的老罗,欢迎关注,更多精品源码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391420.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【吊打面试官系列-Dubbo面试题】Dubbo 配置文件是如何加载到 Spring 中的 ?

大家好&#xff0c;我是锋哥。今天分享关于 【Dubbo 配置文件是如何加载到 Spring 中的 &#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Dubbo 配置文件是如何加载到 Spring 中的 &#xff1f; Spring 容器在启动的时候&#xff0c;会读取到 Spring 默认的一些…

nodejs多版本随心切换-windows

nodejs多版本控制 1. 安装 nvm github下载地址 不需要卸载已安装的nodejs&#xff0c;安装时会让你选择nodejs的位置&#xff0c;可修改为你已经安装的路径&#xff0c;会自动搜索已安装版本&#xff0c;并进行弹窗询问&#xff0c;选择托管即可 2. 修改配置文件 在 nvm 安装…

案例分享|Alluxio在自动驾驶数据闭环中的应用

分享嘉宾&#xff1a; 孙涛 - 中汽创智智驾工具链数据平台开发专家 关于中汽创智&#xff1a; 中汽创智科技有限公司&#xff08;以下简称“中汽创智”&#xff09;由中国一汽、东风公司、南方工业集团、长安汽车和南京江宁经开科技共同出资设立。聚焦智能底盘、新能动力、智…

K8S可视化管理平台KubeSphere

什么是 KubeSphere &#xff1f; KubeSphere 是一款开源项目&#xff0c;在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台&#xff0c;提供简单易用的操作界面以及向导式操作方式&#xff0c;在降低用户使用容器调度平台学习成本的同时&#xff…

7.怎么配置一个axios来拦截前后端请求

首先创建一个axios.js文件 导入我们所需要的依赖 import axios from "axios"; import Element from element-ui import router from "./router"; 设置请求头和它的类型和地址 注意先注释这个url,还没有解决跨域问题,不然会出现跨域 // axios.defaults.…

计算机网络-http协议和https的加密原理

HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是用于在万维网&#xff08;World Wide Web&#xff09;上传输超文本的基础协议。它定义了客户端&#xff08;通常是浏览器&#xff09;和服务器之间的文本数据传输格式和规则。以下是HTTP的…

假如家里太大了,wifi连不上了怎么办

最近有个土豪朋友抱怨&#xff0c;他家里太大了&#xff0c;一个路由器的Wi-Fi信号根本无法覆盖他们家的每个房间&#xff0c;都没办法上网看奥运会比赛了。&#xff08;还好我是穷人&#xff0c;就没有这种烦恼T_T&#xff09;。 然后我问他为何不用一个路由器作主路由器&…

BGP对等体组、聚合、路由反射器、联盟、团体属性

一.实验拓扑 二.实验需求 1.AS1中存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能在任何协议中宣告 As3中存在两个环回&#xff0c;一个地址为192.168.2.0/24,、该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以ping通; 2.整个AS2的I…

vue el-input 输入框下拉显示匹配数据

1、效果图&#xff1a; 2、需求&实现&#xff1a; 输入条件 下面匹配查询到的数据有多少个 需要调用后端接口展示&#xff0c;后端查询到之后返回条数 前端展示 3、具体代码实现&#xff1a; html&#xff1a; 图片需要自己根据实际情况增加 // 查询 重置 筛选 本文章…

delphi 12 学习如何登陆网站下载文件

启动时等待验证码. 输入验证码后,等待处理数据 处理完成后,显示数据 实现原理:利用已有的账号和密码登录后产生的cookie,向服务器请求数据.返回的数据是JSON格式,后期需要自己整理. 注意,请在程序中使用同一个TnetHttpClient控件来完成.因为里面保存了cookie信息 需要了解的知…

btslab靶场-通过xss获取他人cookie并利用

目录 安装 通过xss获取cookie cookie利用 安装 下载btslab靶场链接&#xff1a;https://pan.baidu.com/s/1I9ZgzlZEWdobINGQUhy7Jw?pwd8888 提取码&#xff1a;8888 用phpEnv或者phpStudy部署好靶场环境&#xff08;这里就省略了&#xff09; 通过xss获取cookie 先访问…

Golang | Leetcode Golang题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; func removeDuplicateLetters(s string) string {left : [26]int{}for _, ch : range s {left[ch-a]}stack : []byte{}inStack : [26]bool{}for i : range s {ch : s[i]if !inStack[ch-a] {for len(stack) > 0 && ch < stack…

通过Java实现插入排序(直接插入,希尔)与选择排序(直接选择,堆排)

目录 &#xff08;一&#xff09;插入排序 1.直接插入排序 &#xff08;1&#xff09;核心思想&#xff1a; &#xff08;2&#xff09;代码实现&#xff08;以从小到大排序为例&#xff09;&#xff1a; &#xff08;3&#xff09;代码分析&#xff1a; 2.希尔排序&#xff08…

MQ消息队列篇:三大MQ产品的必备面试种子题

MQ有什么用&#xff1f; MQ&#xff08;消息队列&#xff09;是一种FIFO&#xff08;先进先出&#xff09;的数据结构&#xff0c;主要用于实现异步通信、削峰平谷和解耦等功能。它通过将生产者生成的消息发送到队列中&#xff0c;然后由消费者进行消费。这样&#xff0c;生产…

(四)activit5.23.0修复跟踪高亮显示BUG

一、先看bug 在 &#xff08;三&#xff09;springboot2.7.6集成activit5.23.0之流程跟踪高亮显示 末尾就发现高亮显示与预期不一样&#xff0c;比如上面的任务2前面的箭头没有高亮显示。 二、分析原因 具体分析步骤省略了&#xff0c;主要是ProcessInstanceHighlightsResour…

【iOS】暑假第二周——网易云APP 仿写

目录 前言首页关于UINavigationBarAppearance “我的”账号夜间模式——多界面传值遇到的问题所用到的其他知识整理NSNotificationreloadData各种键盘模式 总结 前言 有了之前仿写ZARA的基础&#xff0c;本周我们仿写了网易云APP&#xff0c;在这里对多界面传值进行了首次应用—…

算力共享中神经网络切片和算力分配策略

目录 神经网络切片 按照算力的分布进行网络层数切片;就是算力越强,运算神经网络层数越多 神经网络切片和算力占比进行映射 算力分配策略 get_current_shard 神经网络切片 按照算力的分布进行网络层数切片;就是算力越强,运算神经网络层数越多 神经网络切片和算力占比进…

【MySQL】索引——索引的引入、认识磁盘、磁盘的组成、扇区、磁盘访问、磁盘和MySQL交互、索引的概念

文章目录 MySQL1. 索引的引入2. 认识磁盘2.1 磁盘的组成2.2 扇区2.3 磁盘访问 3. 磁盘和MySQL交互4. 索引的概念4.1 索引测试4.2 Page4.3 单页和多页情况 MySQL 1. 索引的引入 海量表在进行普通查询的时候&#xff0c;效率会非常的慢&#xff0c;但是索引可以解决这个问题。 -…

PHP中关于排名和显示的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

RabbitMQ应用场景及特性

RabbitMQ是一款开源的消息队列中间件&#xff0c;拥有非常好用的管理控制面板&#xff0c;类似使用navicat一样&#xff0c;简便的操纵数据库。 应用场景 一、流量削峰 在一些并发量较高的场景下&#xff0c;比如秒杀活动&#xff0c;抢票等&#xff0c;同一时间访问量急剧增…