几行代码实现简单的网络象棋游戏,看看Java大牛是怎么做到的?

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

几行代码实现简单的网络象棋游戏,看看Java大牛是怎么做到的?

 

游戏规则:

  • 1.将/帅:不能出田字格,不能走斜线,只能前进后退向左向右,每次只走一格;
  • 2.士/仕:不能出田字格,只能走斜线,每次只走一格;
  • 3.象/相:只能走田字格,中间防止蹩脚,不能有棋;

几行代码实现简单的网络象棋游戏,看看Java大牛是怎么做到的?

 

  • 4.马:只能走日,(这个比较麻烦,且看下图标识)

几行代码实现简单的网络象棋游戏,看看Java大牛是怎么做到的?

 

  • 5.车:车只能走直线,这个很好理解,不细说了;
  • 6.炮:
    情况一:纯走路—->中间和目的地都不能有棋
    情况二:吃棋—–>中间要有一颗棋,目标也有棋,且是敌方的棋,毕竟不能自己吃自己哈
  • 7.卒/兵:
    河这边:只能前进不能后退,不能横着走!!!
    河对面:可以前进,可以横着走,不能后退!!!

面板设计

几行代码实现简单的网络象棋游戏,看看Java大牛是怎么做到的?

 

看上去一定很挫!哈哈,别急,听我细细道来!
一般的界面设计我们都知道横纵坐标是这样的:

几行代码实现简单的网络象棋游戏,看看Java大牛是怎么做到的?

 

但是我选择背道而行,不是因为别的,是为了更好的去让初学者理解,我们把原本的x坐标看成数组的列(col),把y坐标看成我们数组的行(row),这样是不是更好理解一点呢,当然了我就是这么理解的,哈哈,接下来的游戏代码编程我们会把横坐标用y*width,纵坐标用x*height你们应该就能理解为什么了,因为x是数组的行,也就是坐标纵坐标(y)的体现,同理数组中的y也是如此。

数据传输:这里我们采用UDP协议来进行通讯,所以你们也要先去了解一下UDP协议的一些基本方法,这里就不细讲了。

通讯协议:这里我们自定义通讯协议啊:

“play|”——–以此开头代表一端发出了游戏邀请,等待另一端的回应;

“connect|”——-以此开头代表另一端收到邀请并且同意建立连接通讯!如果邀请者收到这条消息就代表通讯建立成功,可以开始游戏了;

“move|”——以此开头代表移动数据传输,如果一端移动了棋子,那么另一端也要收到信息,重新绘制界面;

“lose|”——–以此开头代表一方认输,如果有一方认输就会向另一方发送该信息;

“quit|”——-以此开头代表一方退出游戏,任意一方离开都会向对方发送该信息,以提示对方;

“success|”—–以此开头代表胜利,某一方胜利就向对方发出信息,通知对方;

“regret|”——以此开头表示悔棋,这个不用讲了吧,大家都明白,但是本次编程中我没有把这个加进去,这个你们可以自己根据自己需要去添加。

(肯定有人问我这个协议是谁定义的,啊哈哈,让你们失望了,这是我自己定义的,这个通讯协议只适用于你们写的这个代码,和使用这个代码的两个人通讯使用,所以协议如何自己可以定义的哦)

代码实现

1.Chess类:
package internet_chess;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.image.ImageObserver;

import javax.swing.JPanel;

public class Chess {
    public int Row = 12;
    public int Col = 11;
    public String chessName;//当前棋子对象的名字
    public int owner;//当前棋子对象的所有者--黑方还是红方
    public Point point;//当前棋子对象的位置
    public Image chessImage;//当前棋子对象的图像
    private int BLACKCHESS = 1;
    private int REDCHESS = 0;//红方0,黑方1
    private int width = 40;
    private int height = 40;

    public Chess(String name, int own,Point point)//获取每一个棋子对象名字,所有者,位置,和图片信息
    {
        this.chessName = name;
        this.owner = own;
        this.point = point;
        if(owner == BLACKCHESS)//如果所有者是黑方
        {
            if(chessName.equals("将"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/0.png");
            }
            else if(chessName.equals("士"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/1.png");
            }
            else if(chessName.equals("象"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/3.png");
            }
            else if(chessName.equals("马"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/5.png");
            }
            else if(chessName.equals("车"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/7.png");
            }
            else if(chessName.equals("炮"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/9.png");
            }
            else if(chessName.equals("卒"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/11.png");
            }
        }
        else//如果所有者是红方
        {
            if(chessName.equals("帅"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/16.png");
            }
            else if(chessName.equals("仕"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/17.png");
            }
            else if(chessName.equals("相"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/19.png");
            }
            else if(chessName.equals("马"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/21.png");
            }
            else if(chessName.equals("车"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/23.png");
            }
            else if(chessName.equals("炮"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/25.png");
            }
            else if(chessName.equals("兵"))
            {
                chessImage = Toolkit.getDefaultToolkit().getImage("F:/Image/chess/27.png");
            }
        }
    }

    protected void paint(Graphics g,JPanel i)//画棋子
    {
        g.drawImage(chessImage, point.y*width-width/2, point.x*height-height/2, width, height, (ImageObserver)i);
    }

    protected void paintSeclected(Graphics g)//画鼠标选择了以后的棋子对象的边框
    {
        g.drawRect(point.y*width-width/2, point.x*height-height/2, width, height);
    }

    public void SetPos(int x, int y)//重新设置移动以后的棋子对象的位置坐标
    {
        point.x = x;
        point.y = y;
    }

    public void ReversePos()//将该对象的位置坐标逆置输出,用于方便显示信息情况
    {
        point.x = Row-1 - point.x;
        point.y = Col-1 - point.y;
    }
}

2.ChessPanel类:
package internet_chess;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class ChessPanel extends JPanel implements Runnable{
    private int BLACKCHESS = 1;
    private int REDCHESS = 0;//黑棋是1,红旗是0
    public Chess chess[] = new Chess[32];//创建了32个棋子对象
    private int width = 40;
    private int height = 40;
    public int Row = 12;
    public int Col = 11;//11行10列
    public int map[][] = new int [Row][Col];
    public int player;//设置当前玩家对象
    private boolean isFirst = false;//判断是否是第一次点击的棋子,以此分开两次点击棋子的碰撞矛盾
    private int x1,y1,x2,y2;//用来保存第一次第二次选中的坐标的
    private boolean flag = true;//用来控制线程的运行
    private boolean isPlay = false;
    private Chess firstChess = null;
    private Chess secondChess = null;//设置第一次点击的棋子和第二次选中的棋子对象

    private InetAddress myID;//自己id地址
    private In
基于JAVA象棋游戏的设计与实现 Java编程环境下,设计和实现国际象棋应用展现出了其独特的优势。首先,Java的数据类型识别能力使其胜任实时数据流的高效管理和I/O操作,这显著降低了开发难度并便于后续维护升级。随着项目的深化,可以扩展其架构,集成API功能以支持数据的上传下载和存储。Java本质上是通过目标对象的组织和交互来驱动的,这些对象作为类的实例,拥有自身的属性和状态,模式则扩展了类的功能,表现为行为或函数。在实际应用中,变化对象作为程序的核心,涉及增删改查等操作,关注其状态和属性。 阅读详情

相关推荐

java-gui编程-中国象棋游戏

将棋子从起始位置移动到目标位置的过程拆分成多个小步骤,在每个步骤中更新棋子的位置并重新绘制界面,从而实现平滑的动画过渡。类中包含了较多的游戏逻辑,可进一步分离职责,提高代码的可维护性。例如,可以将一些与界面绘制无关的逻辑,如游戏初始化参数的处理、下棋历史记录的管理等,从。整个代码采用了 MVC(Model-View-Controller)架构的思想,将不同的功能模块分离,提高了代码的可维护性和可扩展性。通过上述代码,在界面上添加了难度选择的下拉框,用户可以选择不同的难度级别。:负责游戏界面的展示,主要由。

qq_57785748的博客 1682

五子棋游戏-uniapp-源码

这是一个uniapp应用项目源码完整,是下五子棋的单机游戏,通过HBuilder X开发工具选uniapp方式打开,uniapp项目可编译发行跨端应用(包括了各种小程序以及APP),可编译正常运行,适合新手入门参考学习。 相关指导教程请看作者发表的文章https://blog.csdn.net/zs1028/article/details/123255998

java实现象棋游戏(附完整源码)

java实现象棋游戏(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1424

Java中国象棋代码.rar

Java中国象棋代码,人机对点版的象棋程序,用Java写的,1、保证你的java是1.4.2或更高,设置了必要的jre classpath,能运行“java HelloWorld”。   2、运行run1.bat或run2.bat   3、联系方式:acerge@163.com, QQ:554653408   操作:   1、Setting,选择对战方式。如果选择“网络对战”,进入“2”,否则,进入“3”。   2、connect,只在“网络对战”第一盘是需要。   3、set rule,设置计时规则。   4、start,开始下棋。   其他:   Read:读入棋局,读入后可用-〉、  Save:保存棋局。   ResetAll:开始新局面。在“网络对战”进行时不能使用。Computer:手动让计算机走一步,计算机在思考时变为“Stop”,用来中断计算机思考。   备注:1、有些bug我实在懒得修复(比如,计算机会出现“常将”这种耍赖的状况),有一些控制功能如“对计算机的时间控制”我没有在界面中实现(原因很简单:我恨j2se的什么“布局(Layout)”,东南西北的老是搞不清楚,总是不能将适当的控件以恰当的小放在适当的位置)。   2、一些完善性的扩展功能,如“多人观棋”、“悔棋”、“从文件读入后进行网络对战”、“连接中断后的恢复(网络连接的恢复、当前局面的恢复、时间的恢复)”

Java版本实现中国象棋

中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史,由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。阿巴阿巴阿巴代码结构:Button类和Rect类是直接使用前面画板中的类,Qizi类是所有棋子的父类每个棋子都要继承Qizi父类并重写getNext方法,该方法是返回棋子可以前进的位置。

meisir666的博客 4011

JAVA象棋具体代码

很抱歉,由于篇幅限制,我无法在此处提供完整的 Java 象棋代码。不过,您可以参考一些 Java 象棋代码片段,以获得对编写代码的思路: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ChessBoard extends JFrame { private JPanel ches...

weixin_42601608的博客 338

Unity技能工厂——怎样实现丝滑的角色连击动画

三个攻击动作也是这么操作,分别创建atk_1、atk_2、atk_3的图形化面板,选定atk_1、atk_2、atk_3的攻击动作并且给其Motion添加atk_1、atk_2、atk_3的动画。RPG类型的动作游戏因为其敏捷的工作动作,技能连招之间丝滑的衔接,视觉冲击感爆棚的技能释放特效,所谓“拳拳刀肉,刀刀进身”的攻击效果,吸引了一批忠实角色类扮演游戏的忠实粉丝。分别右键atk_1、atk_2、atk_3—Make Transition—连Idle,将Has Exit Time勾选(默认是勾选的)

Richard_shen的博客 2539

Java游戏开发 —— 象棋

一个AI极其弱智的象棋游戏,有事AI那块暂时未做完!

小木鱼的博客 1万+

java隔山打算法_几行代码实现简单网络象棋游戏,看看Java是怎么做到的?...

游戏规则:1.将/帅:不能出田字格,不能走斜线,只能前进后退向左向右,每次只走一格;2.士/仕:不能出田字格,只能走斜线,每次只走一格;3.象/相:只能走田字格,中间防止蹩脚,不能有棋; 4.马:只能走日,(这个比较麻烦,且看下图标识) 5.车:车只能走直线,这个很好理解,不细说了;6.炮:情况一:纯走路—->中间和目的地都不能有棋情况二:吃棋—–>中间要有一颗棋,目标也有棋,且是敌...

weixin_33520805的博客 243

c++简单游戏代码_几行代码实现简单网络象棋游戏,看看Java是怎么做到的?...

游戏规则:1.将/帅:不能出田字格,不能走斜线,只能前进后退向左向右,每次只走一格;2.士/仕:不能出田字格,只能走斜线,每次只走一格;3.象/相:只能走田字格,中间防止蹩脚,不能有棋;4.马:只能走日,(这个比较麻烦,且看下图标识)5.车:车只能走直线,这个很好理解,不细说了;6.炮:情况一:纯走路—->中间和目的地都不能有棋情况二:吃棋—–>中间要有一颗棋,目标也有棋,且是敌方的棋...

weixin_39830205的博客 270

java实现简单网络象棋游戏

- 游戏规则: 1.将/帅:不能出田字格,不能走斜线,只能前进后退向左向右,每次只走一格; 2.士/仕:不能出田字格,只能走斜线,每次只走一格; 3.象/相:只能走田字格,中间防止蹩脚,不能有棋;4.马:只能走日,(这个比较麻烦,且看下图标识)5.车:车只能走直线,这个很好理解,不细说了; 6.炮: 情况一:纯走路—->中间和目的地都不能有棋 情况二:吃棋—–>中间要有一颗棋,目标也有棋,且是敌

angry_youth的博客 2万+

【经典游戏java实现中国象棋游戏

中国象棋是一种双人对弈的棋类游戏,其中每个玩家控制一组棋子,目标是将对方的“将军”困住。规则包括棋子的移动方式、吃子规则、将军、将死等。在分析游戏时,需要确保游戏规则符合中国象棋的规范。

m0_46013789的博客 1795

Java网络象棋游戏(功能版)

Java 网络象棋游戏(功能版)网络象棋目录客户端走棋悔棋认输保存棋谱演示棋谱(自动、手动)服务器端与客户端相同 网络象棋目录 客户端 走棋 悔棋 认输 保存棋谱 演示棋谱(自动、手动) 服务器端 与客户端相同 象棋界面图片: 棋谱演示界面: 网络象棋游戏中基本的走棋、认输、悔棋功能,都是参考其他博主代码,在这里只写象棋的拓展——棋谱的制作和演示。 扩展一个棋谱功能,可以在列表中在增加一个棋谱类,然后在服务器端/客户端类中引用。因为博主在引用过程中不断报错,所以放弃了创建新的棋谱类,而是直接在服务器类中

weixin_43489930的博客 2240

Java课程设计—中国象棋(源代码及视频)

谢谢家的支持,您的一键三连是 罡罡同学前进的最动力! 一键三连 一键三连 一键三连 一键三连 一键三连 一键三连 传送地址 数据结构课程设计——校园导游系统(C语言): B站视频: https://www.bilibili.com/video/BV1ui4y137X9 CSDN源码: https://blog.csdn.net/m0_46625346/article/details/107149473 Java课程设计——中国象棋 B站视频:https://www.bilibili

m0_46625346的博客 1万+

基于java象棋游戏_基于JAVA技术的中国象棋游戏设计与实现

© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.doczj.com/doc/ea5a60dd6f1aff00bed51e4b.html基于JAVA 技术的中国象棋游戏设计与实现①高 伟 郭 瑾 张 昊(辽宁师范学计算机与信息技术学院,辽宁连 11...

weixin_31865445的博客 3150

Java实现中国象棋(联机版)

Java实现中国象棋(联机版) 该版本的中国象棋,程序有点复杂,是基于网络通信的基础上实现的。由于代码带太长,我这里就只做简单的演示,下面会给出链接地址的。 一、程序结构: 客户端: 服务端: 二、操作步骤: 第一步:先在D盘创建一个Game文件夹,即D:\Game 然后把压缩包中的ChineseChessGame文件夹整体放下Game文件夹下。主要是读取素材的时候是从D:\G...

Code__rookie的博客 4605

象棋开发游戏

1 绪论 1.1休闲类游戏开发简述 休闲类游戏(Casual Game)可以包含任何游戏类型的游戏性要素,通常休闲游戏游戏规则相对简单,无需特别的技巧,也不需要较长的时间就能完成游戏。休闲游戏经常出现在不同的平台上,包括家用游戏机、掌上游戏机和个人电脑上等等。休闲类游戏通常也适合于各种不同性别、地域和文化的玩家群体。本文所涉及的游戏项目,是一款棋类休闲游戏,基于Windows平台,无需较长的时间就能完成一局的游戏,一局游戏一般在5 到20 分钟左右就能完成。根据该局游戏玩家的游戏策略等因素

qq_61141142的博客 1548

Java实现象棋游戏完整源码解析

本文还有配套的精品资源,点击获取 简介:本文详细解读了用Java语言编写的象棋游戏源码,通过分析帮助读者深入理解游戏机制。项目包括完整的源代码、构建工具配置和发布包,覆盖了Java编程基础、面向对象设计、算法实现等方面。通过实际案例学习,读者能够提升编程技巧和算法设计能力,培养逻辑和抽象思维。 1. Java编程基础 1.1 简介与安装 Java是一种...

weixin_42502040的博客 848
上一篇: 为什么选择Docker?一文带你鸟瞰容器生态系统,零基础入门Docker
下一篇: 初识数据库,零基础如何学习MySQL,MySQL触发器简介及使用
爱玛士
博客等级 码龄6年 719粉丝 253原创
评论 70
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值