package org.crazyit.gamehall.fivechess.client.ui.game;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JPanel;
import org.crazyit.gamehall.commons.Request;
import org.crazyit.gamehall.fivechess.client.ui.UIContext;
import org.crazyit.gamehall.fivechess.client.util.ImageUtil;
import org.crazyit.gamehall.fivechess.commons.Chess;
import org.crazyit.gamehall.fivechess.commons.ChessUser;
import org.crazyit.gamehall.fivechess.commons.Seat;
import org.crazyit.gamehall.fivechess.commons.Table;
import org.crazyit.gamehall.util.XStreamUtil;
/**
* 五子棋游戏区域
*
* @author yangenxiong yangenxiong2009@gmail.com
* @version 1.0
* <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
* <br>Copyright (C), 2009-2010, yangenxiong
* <br>This program is protected by copyright laws.
*/
public class GamePanel extends JPanel {
//棋盘中的二维数组
private Chess[][] chessArray;
private Table table;
private ChessUser user;
//棋盘图片
private static Image chessboard = ImageUtil.getImage("images/fivechess/fiveStoneBoard.jpg");
//背景图片
private static Image background = ImageUtil.getImage("images/fivechess/background.gif");
//准备
private static Image ready = ImageUtil.getImage("images/fivechess/ready.gif");
//开始
private static Image tool_begin = ImageUtil.getImage("images/fivechess/tool-begin.gif");
//求和与认输
private static Image tool_drawAndLost = ImageUtil.getImage("images/fivechess/tool-draw-lost.gif");
//准备游戏工具条
private static Image tool_ready = ImageUtil.getImage("images/fivechess/tool-ready.gif");
//当前的工具图片
private Image currentToolImage;
//手形的鼠标指针
private final static Cursor HAND_CURSOR = new Cursor(Cursor.HAND_CURSOR);
//默认的鼠标指针
private final static Cursor DEFAULT_CURSOR = Cursor.getDefaultCursor();
//开始菜单的区域
private Rectangle startRange = new Rectangle(318, 630, 73, 40);
//求和菜单的区域
private Rectangle drawRange = new Rectangle(185, 630, 73, 40);
//认输菜单的区域
private Rectangle lostRange = new Rectangle(460, 630, 73, 40);
//工具栏图片的区域
private Rectangle toolRange = new Rectangle(160, 630, 400, 40);
//桌子左边的玩家
private Image leftUserHead;
//桌子右边的玩家
private Image rightUserHead;
//是否正在进行游戏
private boolean gaming;
private static Image BLACK_DISK = ImageUtil.getImage("images/fivechess/blackDisk.gif");
private static Image WHITE_DISK = ImageUtil.getImage("images/fivechess/whiteDisk.gif");
//黑棋图片
public final static Image BLACK_CHESS = ImageUtil.getImage("images/fivechess/black.gif");
//白棋图片
public final static Image WHITE_CHESS = ImageUtil.getImage("images/fivechess/white.gif");
//开始游戏的时候提示图片
private Image gameStartImage;
//开始游戏时显示开始图片的定时器
private StartGameTask startGameTask;
private Timer timer;
//棋盘边缘X坐标
public final static int CHESS_BOARD_X = 85 + 23;
//棋盘边缘Y坐标
public final static int CHESS_BOARD_Y = 80 + 23;
public Rectangle chessBoardRange = new Rectangle(85, 80, 535, 536);
//棋盘单元格的宽
public final static int CHESS_BOARD_CELL_WIDTH = 35;
//棋盘单元格的高
public final static int CHESS_BOARD_CELL_HEIGHT = 35;
//是否轮到当前玩家下棋
private boolean myTurn = false;
//下棋前的黑色棋选择图片
private final static Image BLACK_SELECT_PLAY_IMAGE = ImageUtil.getImage("images/fivechess/black-play-select.png");
//下棋前的白色棋选择图片
private final static Image WHITE_SELECT_PLAY_IMAGE = ImageUtil.getImage("images/fivechess/white-play-select.png");
//当前下棋前的选择图片
private Image selectImage;
//选中图片的X坐标
private int selectImageX = 0;
//选中图片的Y坐标
private int selectImageY = 0;
public GamePanel(Table table, ChessUser user) {
this.table = table;
this.user = user;
this.setMaximumSize(new Dimension(710, 700));
this.setMinimumSize(new Dimension(710, 700));
this.currentToolImage = tool_begin;
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
mouseMove(e);
}
});
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
mouseClick(e);
}
});
}
//鼠标移动
private void mouseMove(MouseEvent e) {
int x = e.getX();
int y = e.getY();
//判断是否游戏状态
if (this.gaming) {
setCursor(this.drawRange.contains(x, y) || this.lostRange.contains(x, y));
//判断是否轮到自己下棋
if (this.myTurn) {
//判断鼠标指针是否在棋盘上
if (this.chessBoardRange.contains(x, y)) {
this.selectImageX = x - Chess.IMAGE_WIDTH / 2;
this.selectImageY = y - Chess.IMAGE_HEIGHT / 2;
this.repaint();
}
}
} else {
//游戏没有开始, 判断玩家是否已经准备
if (!this.user.isReady()) setCursor(this.startRange.contains(x, y));
else setCursor(false);
}
}
//获得当前x, y坐标对应的Chess对象
private Chess getSelectChess(int x, int y) {
for (int i = 0; i < this.chessArray.length; i++) {
for (int j = 0; j < this.chessArray[i].length; j++) {
Chess c = this.chessArray[i][j];
if (c.getRange().contains(x, y)) {
return c;
}
}
}
return null;
}
//根据状态设置鼠标指针
private void setCursor(boolean state) {
if (state) setCursor(HAND_CURSOR);
else setCursor(DEFAULT_CURSOR);
}
private void mouseClick(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (this.toolRange.contains(x, y)) {
if (this.gaming) {
//游戏已经开始
//判断是否点击了求和
if (this.drawRange.contains(x, y)) requestDraw();
//判断是否点击了认输
if (this.lostRange.contains(x, y)) requestLost();
} else {
//游戏没有开始
//判断点击位置
if (this.startRange.contains(x, y)) ready();
}
}
if (this.gaming) {
//判断是否轮到自己下棋
if (this.myTurn) {
//判断是否鼠标点击了棋盘
if (this.chessBoardRange.contains(x, y)) takeChess(x, y);
}
}
}
//下棋的方法
private void takeChess(int x, int y) {
Chess chess = getSelectChess(x, y);
if (chess != null) {
//当前位置有棋子
if (chess.getColor() != null) {
UIContext.showMessage("该位置已经有棋子");
} else {
chess.setColor(getChessColor());
this.myTurn = false;
this.selectImage = null;
requestTakeChess(chess);
this.repaint();
}
}
}
//告诉服务器自己下棋了
private void requestTakeChess(Chess chess) {
Request request = new Request(
"org.crazyit.gamehall.fivechess.server.action.TakeChessAction",
"org.crazyit.gamehall.fivechess.client.action.game.TakeChessAction");
request.setParameter("i", chess.getI());
request.setParameter("j", chess.getJ());
request.setParameter("userId", this.user.getId());
request.setParameter("tableNumber", this.table.getTableNumber());
request.setParameter("color", chess.getColor());
//设置处理胜利的Action
request.setParameter("winAction",
"org.crazyit.gamehall.fivechess.client.action.game.WinAction");
//设置处理输的Action
request.setParameter("lostAction",
"org.crazyit.gamehall.fivechess.client.action.game.LostAction");
this.user.getPrintStream().println(XStreamUtil.toXML(request));
}
//胜利调用的方法
public void win() {
endGame();
UIContext.showMessage("你赢了");
}
//失败调用的方法
public void lost() {
endGame();
UIContext.showMessage("你输了");
}
//结束游戏
private void endGame() {
this.selectImage = null;
this.gaming = false;
this.myTurn = false;
this.user.setReady(false);
this.currentToolImage =
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
fivechess-client.rar_Java代码五子棋_java 五子棋_java五子棋_五子棋java (110个子文件)
GamePanel.class 14KB
HallPanel.class 9KB
ChessFrame.class 7KB
GameHallFrame.class 6KB
UserTable.class 4KB
ChatPanel.class 4KB
EnterGameAction.class 3KB
ClientInAction.class 3KB
ChessGame.class 2KB
LeaveGameAction.class 2KB
ReceiveInAction.class 2KB
ReceiveUserSitDownAction.class 2KB
OpponentEnterAction.class 2KB
OpponentExitAction.class 2KB
ChessFrame$1.class 1KB
TakeChessAction.class 1KB
StartGameAction.class 1KB
UIContext.class 1KB
GameHallInfo.class 1KB
OpponentReadyAction.class 1KB
ReceiveMessageAction.class 1KB
ReceiveMessageAction.class 1KB
RefuseDrawAction.class 1KB
DrawAction.class 1KB
UserTableCellRenderer.class 1KB
GamePanel$1.class 1021B
HallPanel$1.class 1020B
GamePanel$2.class 1017B
HallPanel$2.class 1016B
OpponentLostAction.class 970B
AgreeDrawAction.class 953B
LostAction.class 938B
WinAction.class 934B
ChatPanel$1.class 934B
ImageUtil.class 794B
StartGameTask.class 693B
ChessClientContext.class 428B
.classpath 399B
blackDisk.gif 2KB
whiteDisk.gif 2KB
tool-draw-lost.gif 2KB
104.gif 2KB
selected.gif 2KB
1.gif 2KB
139.gif 2KB
159.gif 2KB
349.gif 2KB
379.gif 2KB
3.gif 2KB
219.gif 2KB
359.gif 2KB
119.gif 2KB
389.gif 2KB
2.gif 2KB
209.gif 1KB
4.gif 1KB
383.gif 1KB
109.gif 1KB
419.gif 1KB
393.gif 1KB
339.gif 1KB
399.gif 1KB
129.gif 1KB
149.gif 1KB
169.gif 1KB
tool-begin.gif 1KB
black.gif 1KB
white.gif 1012B
start-game-opponent-first.gif 978B
start-game-you-first.gif 946B
tool-ready.gif 753B
ready.gif 262B
background.gif 75B
GamePanel.java 16KB
HallPanel.java 8KB
ChessFrame.java 6KB
GameHallFrame.java 5KB
ChatPanel.java 4KB
UserTable.java 3KB
ClientInAction.java 2KB
EnterGameAction.java 2KB
UIContext.java 2KB
ChessGame.java 2KB
OpponentEnterAction.java 1KB
StartGameAction.java 1KB
ReceiveUserSitDownAction.java 1KB
GameHallInfo.java 1KB
ReceiveInAction.java 1KB
OpponentExitAction.java 1KB
LeaveGameAction.java 1KB
UserTableCellRenderer.java 1KB
TakeChessAction.java 998B
OpponentReadyAction.java 983B
ReceiveMessageAction.java 903B
DrawAction.java 900B
ReceiveMessageAction.java 899B
RefuseDrawAction.java 855B
WinAction.java 806B
OpponentLostAction.java 784B
LostAction.java 782B
共 110 条
- 1
- 2
资源评论
Kinonoyomeo
- 粉丝: 75
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 电子万年历软件仿真(经过多次修改,保证正确性)
- Unity XR 手势射击控制脚本(适用于任何可手势识别的设备)
- 机械设计全自动电表(NB和IC卡表)控制和上壳装配线sw16可编辑非常好的设计图纸100%好用.zip
- 基于matlab的EAN-13条形码识别系统GUI界面.zip代码53
- matlab基于bp神经网络交通信号标志识别GUI界面13个标志.zip代码54
- 电子万年历答辩实物展示视频mp4格式
- 基于python实现的程序,包括哈希感知算法cvHash,图像切割cvsplit,固定目标检测cvRec(附文档ppt)等
- 计算0-10000之间所有偶数的和
- multiled.zip
- 基于php实现的哈希算法的人脸检索
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功