随着中国象棋的发展,越来越多的赛事开始出现在玩家们的视野中,不少爱好者为了一饱眼福可以观看到顶尖国手之间的对决,也是想方设法地寻找各种方法。新兴直播平台的崛起,给了玩家提供了便捷的通道。

象棋男子赛联动KS开启直播,蒋川爆冷输棋,王天一地位被动摇?

象棋作为传统的益智类棋牌与KS直播进行了联动,此次中国象棋男子甲级联赛第二阶段将会全程在KS进行直播,玩家即便是足不出户也可以完整地观看全天六台或者十二台的精彩赛况。值得一提的是KS还邀请了王斌、林延秋等象棋大师帮助观众分析场上的局势和选手特点,以便于玩家更加清晰明了。

几行代码实现简单的网络象棋游戏,看看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协议的一些基本方法,这里就不细讲了。

象棋男子赛联动KS开启直播,蒋川爆冷输棋,王天一地位被动摇?

不知不觉中象甲级男子联赛赛程已经过半,在经历了七天的常规赛后,队伍的排名和选手个人积分排名都发生了较大的变化,有人欢喜有人忧,赛制的升级对于部分选手有着较大的影响,每台比赛必须分出胜负,如果慢棋弈和需加赛超快棋,再弈和则进入附加赛,由超快棋黑方选择先后走,和棋黑胜。这样就要求选手时刻都保持着最佳状态,一不小心就会被决定反击。

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

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

象棋男子赛联动KS开启直播,蒋川爆冷输棋,王天一地位被动摇?

在第20轮结束后,郑惟桐继续保持着无敌的状态,第一阶段加上第二阶段的比赛,一共豪取了20连胜的战绩,稳稳地占据着个人积分榜单的第一名,完全不给后面选手机会,虽然王天一在第二阶段表现亮眼,不断地用连胜证明自己五射王的实力,但无奈郑惟桐完全不给机会,目前郑惟桐排在第一、王天一排在第二。

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

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

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

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

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

象棋男子赛联动KS开启直播,蒋川爆冷输棋,王天一地位被动摇?

天才选手蒋川在对阵赵旸鹤的比赛中,输掉比赛看懵了现场的观众,爆了一个不小的冷门。随着时间的推移,留给队伍的时间也不多了,每支队伍都在努力争取出线的机会,各位小伙伴你们最看好哪支队伍呢?欢迎留言讨论!

“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 InetAddress youID;//目标ID地址 private int sendport;//发送端口 private int receiveport = 8888;//接收端口 public ChessPanel()//构造函数 { init_map();//初始化棋盘 //给这个面板添加鼠标监听机制 this.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if(isPlay == true)//判断是否该本方下棋 { SelectChess(e.getPoint());//选择要移动的棋子 repaint(); } } public void SelectChess(Point pos) { int x = pos.x; int y = pos.y;//获取此时此刻鼠标点击的位置坐标 System.out.println("选择要移动的棋子坐标:x->"+x+" y->"+y); if(x > 0 && x < (Col-1)*width && y > 0 && y < (Row-1)*height)//判断鼠标是否在合理的范围,不在就直接退出 { Point point = ReSetID(x,y); if(isFirst)//判断是否是第一次选中的棋子 { x1 = point.x; y1 = point.y; //判断第一次选中的棋子是不是自己的棋子或者是不是无效棋子,不是就失败 int id = map[x1][y1]; if(id != -1 && chess[id].owner == player) { isFirst = false; firstChess = chess[id]; System.out.println("id->"+id); } else//第一次选择的棋子无效 { JOptionPane.showConfirmDialog(null, "提示", "第一次选棋无效!请重新选择!", JOptionPane.OK_OPTION); isFirst = true; } } else//第二次选中的棋子 { x2 = point.x; y2 = point.y; int id = map[x2][y2]; if(id != -1 && chess[id].owner != player)//第二次选择了敌方棋子,将敌方棋子保存起来 { isFirst = true; secondChess = chess[id]; //开始判断是否可以移动棋子,如果可以就将棋子移动,并发信息给对方我们已经移动的棋子信息 //判断是否可以移动棋子 if(IsMoveChess(firstChess,x2,y2))//可以移动-吃棋 { int idx1 = map[x1][y1]; map[x1][y1] = -1; map[x2][y2] = idx1; chess[id] = null; firstChess.SetPos(x2, y2); repaint(); send("move|"+String.valueOf(idx1)+"|"+String.valueOf(Row-1-x2)+"|"+String.valueOf(Col-1-y2)+"|",youID,sendport); if(id == 0)//吃掉了黑棋将军 {