package com.koudinglang.main.view;
import com.koudinglang.main.game.Chess;
import com.koudinglang.main.game.ChessFactory;
import com.koudinglang.main.model.MyMessage;
import com.koudinglang.main.model.Record;
import com.koudinglang.main.server.ClientReceiveThread;
import com.koudinglang.main.server.ClientThread;
import com.koudinglang.main.util.SocketUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.net.Socket;
import java.util.LinkedList;
public class GamePanel_LD extends JPanel {
//定义一个保存所有棋子的成员变量,类型是数组
private Chess[] chesses = new Chess[32];//保存所有棋子
public Chess[] getChesses() {
return chesses;
}
public void setChesses(Chess[] chesses) {
this.chesses = chesses;
repaint();
}
private boolean isLocked = false;
public void setLocked(boolean locked) {
isLocked = locked;
}
//自定义实现链表的数据结构
//Java集合的使用
private LinkedList<Record> huiqiList = new LinkedList();
//当前选中的棋子
private Chess selectedChess;
//记住当前的阵营
private int curPlayer = 0;
public void setCurPlayer(int curPlayer) {
this.curPlayer = curPlayer;
}
//提示的label
private JLabel hintLabel;
public void setHintLabel(JLabel hintLabel) {
this.hintLabel = hintLabel;
}
private GameFrame gameFrame;
public void setGameFrame(GameFrame gameFrame) {
this.gameFrame = gameFrame;
}
/**
* 实现悔棋功能
*/
void huiqi(MyMessage req) {
Record record = huiqiList.pollLast();
//将操作的棋子的坐标修改回去
record.getChess().setP(record.getStart());
chesses[record.getChess().getIndex()] = record.getChess();
if (record.getEatedChess() != null) {
chesses[record.getEatedChess().getIndex()] = record.getEatedChess();
}
curPlayer = 1 - record.getChess().getPlayer();
if (req != null) {
overMyTurn(record, req);
}
//刷新棋盘
repaint();
}
private MyMessage req;
void startReceive() {
ClientReceiveThread crt = ClientReceiveThread.getInstance();
crt.setListener(new ClientReceiveThread.ResponseListener() {
@Override
public void response(MyMessage resp) {
Object content = resp.getContent();
if (content instanceof Record) {
Record r = (Record) content;
switch (resp.getType()) {
case MOVE:
chesses[r.getChess().getIndex()] = r.getChess();
huiqiList.add(r);
//解锁棋盘
isLocked = false;
//修改提示文字
hintLabel.setText("红方走".equals(hintLabel.getText()) ? "黑方走" : "红方走");
repaint();
break;
case EAT:
System.out.println("吃子");
//删除吃子
chesses[r.getEatedChess().getIndex()] = null;
chesses[r.getChess().getIndex()] = r.getChess();
huiqiList.add(r);
//解锁棋盘
isLocked = false;
//修改提示文字
hintLabel.setText("红方走".equals(hintLabel.getText()) ? "黑方走" : "红方走");
repaint();
break;
case HuiQi:
System.out.println("GamePanel:::huiqi");
huiqi(null);
//解锁棋盘
isLocked = false;
//修改提示文字
hintLabel.setText("红方走".equals(hintLabel.getText()) ? "黑方走" : "红方走");
repaint();
break;
case PEACE:
System.out.println("GamePanel:::PEACE");
int result = JOptionPane.showConfirmDialog(null, "是否同意求和?", "求和", JOptionPane.YES_NO_OPTION);
req.setContent(new Record());
if (0 == result) {
//同意
req.setType(MyMessage.Type.PEACE_SUCCESS);
gameFrame.dispose();
new MainFrame();
} else {
//否
req.setType(MyMessage.Type.PEACE_FAILURE);
}
System.out.println(req);
SocketUtil.getInstance().send(req);
System.out.println("求和结束");
break;
case PEFEAT:
// ct.setShutdown(true);
gameFrame.dispose();
new MainFrame();
break;
case PEACE_SUCCESS:
System.out.println("求和成功");
// ct.setShutdown(true);
gameFrame.dispose();
new MainFrame();
break;
case PEACE_FAILURE:
System.out.println("求和失败");
if (("红方走".equals(hintLabel.getText()) && 0 == curPlayer) || ("黑方走".equals(hintLabel.getText()) && 1 == curPlayer)) {
isLocked = false;//解锁棋盘
}
break;
default:
break;
}
}
}
});
}
//无参构造方法:权限修饰符 类名(){}
//构造方法,可以让我自定义创建对象,做一些必要的操作
public GamePanel_LD() {
req = SocketUtil.getInstance().getReq();
//调用父类构造方法,每个类的构造方法中,都隐藏有这一行代码,且必须是第一行
System.out.println("GamePanel_LD");
// super();必须在构造方法的第一行
createChesses();
// startReceive();
/* 如何操作棋子
1、点击棋盘
2、如何判断点击的地方是否有棋子
3、如何区分第一次选择、重新选择、移动、吃子
棋盘规则
1、红方不可以操作黑方棋子
2、一方走完结束,另一方才能走
*/
//添加点击事件
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (isLocked) {//如果棋盘被锁,则点击无用
return;
}
System.out.println("点击棋盘的坐标为:x=" + e.getX() + ",y=" + e.getY());
Point p = Chess.getPointFromXY(e.getX(), e.getY());
System.out.println("点击棋盘的网格坐标对象为:p===" + p);
if (selectedChess == null) {
//第一次选择
selectedChess = getChessByP(p);
if (selectedChess != null && selectedChess.getPlayer() != curPlayer) {
selectedChess = null;
hintLabel.setText("<html> �
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于Java+Swing+Socket实现中国象棋-网络版(课程设计)已获导师指导并通过的95分的高分期末大作业项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 1、寻找棋盘界面和对应的棋子图片,程序设计棋盘界面和功能菜单 2、设计不同的棋子的移动逻辑 3、棋子移动时,要有音效 4、对局开始前,双方棋子在棋盘上的摆法。 5、对局时,由执红棋的一方先走,双方轮流走一步。 6、轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走了一着。 7、双方各走一着,称为一个回合。 8、走一着棋时,如果己方棋子能够走到的位置有对方棋子存在,就可以把对方棋子吃掉而占领那个位置。 9、实现悔棋、保存棋谱、导出棋谱、求和、认输功能。 详情:https://blog.csdn.net/qq_33037637/article/details/125461769
资源推荐
资源详情
资源评论
收起资源包目录
基于Java+Swing+Socket实现中国象棋-网络版(课程设计) (110个子文件)
GameFrame.class 7KB
GamePanel_LD.class 7KB
ChessServer$ServerThread.class 7KB
Chess.class 7KB
GamePanel_LD$1.class 5KB
SocketUtil.class 4KB
GamePanel_LD$2.class 4KB
LoginFrame.class 4KB
MainFrame$2.class 3KB
MainFrame.class 3KB
Server.class 3KB
MyMessage.class 3KB
Record.class 2KB
Client.class 2KB
ClientReceiveThread.class 2KB
MyMessage$Type.class 2KB
ChessServer.class 2KB
LoginFrame$1.class 2KB
ChessClient.class 2KB
ClientThread.class 2KB
Server$1.class 2KB
Server$2.class 2KB
MainFrame$1.class 2KB
Bing.class 1KB
User.class 1KB
Pao.class 1KB
SingletonThreadDemo.class 1KB
SingletonThread.class 1KB
ChessFactory.class 1KB
InetAddressDemo.class 1KB
ThreadDemo.class 1KB
MyThread.class 1KB
FileDemo.class 1KB
Xiang.class 990B
Che.class 960B
Boss.class 950B
Shi.class 946B
Ma.class 904B
LinkedListDemo.class 862B
SingletonThreadDemo$1.class 839B
SingletonThreadDemo$2.class 839B
AbstractClass.class 665B
Zi.class 578B
Zi.class 576B
MyInteface.class 518B
AbstractClassDemo.class 436B
ClientReceiveThread$ResponseListener.class 330B
Fu.class 325B
ClientThread$ResponseListener.class 308B
SingletonThread$MyListener.class 253B
.classpath 303B
GamePanel_LD.java 14KB
Chess_bak.java 12KB
Chess.java 10KB
GamePanel_LD_biji.java 9KB
GameFrame.java 9KB
GamePanel_LD_bak.java 7KB
ChessServer.java 6KB
Server.java 5KB
LoginFrame.java 4KB
MainFrame.java 3KB
SocketUtil.java 3KB
MyMessage.java 3KB
Client.java 2KB
Record.java 2KB
FileDemo.java 1KB
ClientReceiveThread.java 1KB
ClientThread.java 1KB
ChessClient.java 1KB
User.java 1018B
ChessFactory.java 855B
InetAddressDemo.java 830B
SingletonThreadDemo.java 826B
Pao.java 809B
Bing.java 785B
SingletonThread.java 745B
AbstractClass.java 571B
Xiang.java 554B
MyThread.java 530B
Ma.java 522B
Boss.java 514B
Shi.java 511B
Che.java 508B
ThreadDemo.java 480B
Zi.java 445B
LinkedListDemo.java 406B
Zi.java 307B
MyInteface.java 267B
AbstractClassDemo.java 227B
Fu.java 180B
qipan.jpg 73KB
pao1.png 2KB
pao0.png 2KB
boss1.png 2KB
xiang1.png 2KB
xiang0.png 2KB
che0.png 2KB
bing0.png 1KB
che1.png 1KB
boss0.png 1KB
共 110 条
- 1
- 2
资源评论
小码叔
- 粉丝: 4159
- 资源: 1181
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功