📄 clientapplet.java
字号:
cell_x=chessBoard_x+j*cell_w;
cell_y=chessBoard_y+i*cell_w;
if((x>=cell_x-cell_w && x<cell_x) && (y>=cell_y-cell_w && y<cell_y)){
return 3*(i-1)+j-1;
}
}
}
return -1; //不在棋盘之内
}
public boolean isChessOnLine(){ //自己落下的棋子是否已在一条直线上(输嬴判断)
int i,j;
int chessCount=0; //落子数
//检查水平方向
for(i=1;i<=3;i++){ //自己在第i行上的落子是否在一条直线上
for(j=1;j<=3;j++){ //第i行的三个格子
if(chessOn[3*(i-1)+j-1]==1){ //1表示自己在该棋格上落子
chessCount++;
}
}
if(chessCount==3) return true; //该行已有3个棋子在线上,自己嬴了.
else chessCount=0; //清0,开始下一行检查.
}
//检查垂直方向
for(i=1;i<=3;i++){ //自己在第i列上的落子是否在一条直线上
for(j=1;j<=3;j++){
if(chessOn[i-1+3*(j-1)]==1){ //自己在该格上落了棋子
chessCount++;
}
}
if(chessCount==3) return true; //该列已有3个棋子,自己嬴了.
else chessCount=0; //清0,开始下一列检查.
}
//检查对角线方向(即0,4,8序号的格子)
for(i=1;i<=3;i++){
if(chessOn[4*(i-1)]==1) chessCount++;
}
if(chessCount==3) return true; //该对角方向上的自落棋子已有3个,自己嬴了.
else chessCount=0;
//检查另一对角线方向(即2,4,6序号的格子)
for(i=1;i<=3;i++){
if(chessOn[2*i]==1) chessCount++; //该方向的自落子计数
}
if(chessCount==3) return true; //线上已有3个棋子
else return false;
}
public boolean isChessFull(){ //检查棋盘是否已满(不可再下棋子)
for(int i=0;i<9;i++){
if(chessOn[i]==0) return false;
}
return true;
}
}
//消息滚动面板类
class MsgPane extends JScrollPane{ //用来提示聊天消息的面板
JTextArea msgTextArea=new JTextArea(); //滚动面板中的一个文本框
JScrollBar scrollBar; //滚动面板的滚动条
MsgPane(){
//设置滚动面板的水平、垂直滚动条
setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollBar=getVerticalScrollBar(); //取得JScrollPane的滚动条
//设置文本框属性
msgTextArea.setEditable(false); //只读
msgTextArea.setBackground(Color.lightGray); //背景为浅灰色
msgTextArea.setForeground(Color.black); //字体为黄色
//显示出消息文本框
getViewport().setView(msgTextArea);
}
}
class ControlPane extends JPanel implements ActionListener,KeyListener{ //游戏控制面板(一个编辑框和三个控制按钮)
JTextField msgEdit=new JTextField(23);
JButton sendButton=new JButton("发送");
JButton restartButton=new JButton("重新对弈");
JButton quitButton=new JButton("返回大厅");
ControlPane(){
restartButton.setEnabled(false);
add(msgEdit);
add(sendButton);
add(restartButton);
add(quitButton);
//
sendButton.addActionListener(this); //为"发送"按钮添加鼠标单击监听器
msgEdit.addKeyListener(this); //为"消息编辑框"添加键盘监听器
restartButton.addActionListener(this); //为"重新对弈"按钮添加鼠标单击监听器
quitButton.addActionListener(this); //为"离开"按钮添加鼠标单击监听器
}
public void actionPerformed(ActionEvent e){
Object srcObj=e.getSource();
if(srcObj==sendButton){ //发送聊天消息
String msg=msgEdit.getText();
writer.println("talk:"+msg); //发送聊天话本到服务器(转发对方)
msgEdit.setText(""); //清空文本编辑框
msgEdit.requestFocus();
}
if(srcObj==restartButton){ //重新开始游戏
if(restartButton.getText()=="重新对弈"){
writer.println("restart!"); //发送重新对弈请求到服务器
playPane.msgPane.msgTextArea.append("正等待对方答应重新开盘.....\n");
restartButton.setEnabled(false);
}
else{ //同意开盘(即认可重新开棋)
writer.println("agree!"); //发送同意再玩信息
playPane.chessPane.canGo=false; //被请求对弈者后下棋
for(int i=0;i<9;i++){
playPane.chessPane.chessOn[i]=0; //9个棋格没有落下棋子
}
playPane.chessPane.repaint(); //绘制初始棋盘
playPane.controlPane.restartButton.setText("重新对弈"); //修改为原来的按钮文字
playPane.controlPane.restartButton.setEnabled(false); //使按钮失效
playPane.msgPane.msgTextArea.append("已重新开局,对方先下.");
}
}
if(srcObj==quitButton){ //离开(返回游戏大厅)
writer.println("go back!"); //向服务器发送离开信息
remove(playPane);
setContentPane(jPane); //设置座位申请面板
validate();
loginPane[0].playButton.setEnabled(false);
loginPane[1].playButton.setEnabled(false);
currentTable=-1; //表明客户未坐下
currentChair=-1;
}
}
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER){ //按下回车键
if(e.getSource()==msgEdit){ //在消息文本编辑框中按下回车键
sendButton.doClick();
}
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
}
//读数据线程类
class ReadThread extends Thread{ //读数据线程
String receiveMsg;
StringTokenizer st;
int tableNum,chairNum,status;
int cellIndex; //落子所在的棋格
public void run(){
while(true){
try{
receiveMsg=reader.readLine();
}catch(IOException e){break;}
if(receiveMsg!=null){
if(receiveMsg.startsWith("seat:")){ //收到出入座更新信息
receiveMsg=receiveMsg.substring(5,receiveMsg.length()); //不包括最后的一个换行符
st=new StringTokenizer(receiveMsg,",");
try{
while(st.hasMoreTokens()){
tableNum=Integer.parseInt(st.nextToken());
chairNum=Integer.parseInt(st.nextToken());
status=Integer.parseInt(st.nextToken());
}
}catch(NumberFormatException e){}
if(status==0){ //该座位未占用
loginPane[tableNum].chairButton[chairNum].setVisible(true);
loginPane[tableNum].imageLabel[chairNum].setVisible(false);
}
else{ //该座位已占用
loginPane[tableNum].chairButton[chairNum].setVisible(false);
loginPane[tableNum].imageLabel[chairNum].setVisible(true);
if(tableNum==registerTable && chairNum==registerChair){
loginPane[tableNum].imageLabel[chairNum].setIcon(new ImageIcon(meImage));
loginPane[tableNum].playButton.setEnabled(true); //使"开始对弈"按钮可用
//用户选择了不同的台之后,必须设置前次占用台面的"开始对弈"按钮失效.
if(tableNum!=currentTable && currentTable>-1){
loginPane[currentTable].playButton.setEnabled(false); //设置"开始对弈"按钮失效
}
currentTable=tableNum; //记录当前入坐的台号
currentChair=chairNum; //记录当前入坐的椅子号
}
else{
loginPane[tableNum].imageLabel[chairNum].setIcon(new ImageIcon(manImage));
}
}
}
else if(receiveMsg.startsWith("no seat!")){ //接收到座位注册失败信息,该座位已被占用.
loginPane[registerTable].chairButton[registerChair].setVisible(false);
loginPane[registerTable].imageLabel[registerChair].setVisible(true);
loginPane[registerTable].imageLabel[registerChair].setIcon(new ImageIcon(manImage));
currentTable=-1; //恢复未入坐
currentChair=-1;
}
else if(receiveMsg.startsWith("start:")){ //收到允许对弈信息,换出棋盘面板.
remove(jPane);
playPane=new PlayPane();
setContentPane(playPane);
validate();
//取出椅子号,判断是否先下.
receiveMsg=receiveMsg.substring(6,receiveMsg.length());
try{
chairNum=Integer.parseInt(receiveMsg);
}catch(NumberFormatException e){}
if(currentChair==chairNum){ //发起对弈请求的机器先设置走棋标志,先走棋.
playPane.chessPane.canGo=true;
playPane.msgPane.msgTextArea.append("已开局,请您先走.\n");
}
else{
playPane.msgPane.msgTextArea.append("已开局,对方先走,您下后手棋.\n");
}
}
else if(receiveMsg.startsWith("chess:")){ //收到最新棋步
playPane.chessPane.canGo=true; //设置走棋标志
receiveMsg=receiveMsg.substring(6,receiveMsg.length()); //取出对方落子的棋格
try{
cellIndex=Integer.parseInt(receiveMsg);
}catch(NumberFormatException e){}
playPane.chessPane.chessOn[cellIndex]=2; //2表示对方下的棋
playPane.chessPane.repaint();
}
else if(receiveMsg.startsWith("defeat:")){ //自己的棋输了
receiveMsg=receiveMsg.substring(7,receiveMsg.length());
try{
cellIndex=Integer.parseInt(receiveMsg);
}catch(NumberFormatException e){}
playPane.chessPane.canGo=false; //使鼠标点击棋格不会显示棋子
playPane.chessPane.chessOn[cellIndex]=2; //2表示对方下的棋
JOptionPane.showMessageDialog(playPane,"很抱歉,您这盘棋输了.","系统提示",JOptionPane.INFORMATION_MESSAGE); //弹出提示对话框
playPane.controlPane.restartButton.setEnabled(true); //设置"重新对弈"按钮有效
}
else if(receiveMsg.startsWith("peace!")){ //收到对方发来的和局信息
playPane.chessPane.canGo=false; //,棋局结束,使鼠标点击棋格不会显示棋子.
JOptionPane.showMessageDialog(playPane,"这盘棋双方打和.","系统提示",JOptionPane.INFORMATION_MESSAGE); //弹出提示对话框
playPane.controlPane.restartButton.setEnabled(true); //设置"重新对弈"按钮有效
}
else if(receiveMsg.startsWith("message:")){ //收到对方的聊天信息
receiveMsg=receiveMsg.substring(8,receiveMsg.length())+"\n";
playPane.msgPane.msgTextArea.append(receiveMsg);
playPane.msgPane.scrollBar.setValue(playPane.msgPane.scrollBar.getMaximum()); //使滚动条自动移动
}
else if(receiveMsg.startsWith("again?")){ //收到对方重新对弈请求
playPane.msgPane.msgTextArea.append("还能和您再玩一局棋吗?\n");
playPane.msgPane.scrollBar.setValue(playPane.msgPane.scrollBar.getMaximum()); //使滚动条自动移动
playPane.controlPane.restartButton.setText("同意开盘"); //修改按钮文字串
}
else if(receiveMsg.startsWith("agree")){ //收到对方同意重新开局的信息
playPane.controlPane.restartButton.setEnabled(false); //使"重新对弈"按钮失效
playPane.chessPane.canGo=true; //自己先下棋
for(int i=0;i<9;i++){
playPane.chessPane.chessOn[i]=0; //9个棋格没有落下棋子
}
playPane.chessPane.repaint(); //绘制初始棋盘
playPane.msgPane.msgTextArea.append("请您先下棋\n"); //提示下棋信息
playPane.msgPane.scrollBar.setValue(playPane.msgPane.scrollBar.getMaximum()); //使滚动条自动移动
}
else if(receiveMsg.startsWith("go back!")){ //收到返回游戏大厅的信息
JOptionPane.showMessageDialog(playPane,"很抱歉,我已返回大厅,请您自便.","系统提示",JOptionPane.INFORMATION_MESSAGE); //弹出提示对话框
remove(playPane);
setContentPane(jPane);
validate();
loginPane[0].playButton.setEnabled(false);
loginPane[1].playButton.setEnabled(false);
currentTable=-1; //客户未选择座位坐下
currentChair=-1;
}
else if(receiveMsg.startsWith("she exit!")){ //收到对方退出游戏信息(例如关闭网页)
JOptionPane.showMessageDialog(playPane,"很抱歉,我已退出游戏,请您自便.","系统提示",JOptionPane.INFORMATION_MESSAGE); //弹出提示对话框
remove(playPane);
setContentPane(jPane);
validate();
loginPane[currentTable].playButton.setEnabled(true);
}
else if(receiveMsg.startsWith("refresh:")){ //收到刷新台面、椅子信息
receiveMsg=receiveMsg.substring(8,receiveMsg.length());
st=new StringTokenizer(receiveMsg,",");
try{
while(st.hasMoreTokens()){
tableNum=Integer.parseInt(st.nextToken());
chairNum=Integer.parseInt(st.nextToken());
status=Integer.parseInt(st.nextToken());
}
}catch(NumberFormatException e){}
if(currentTable==-1 && currentChair==-1){ //还未取得座位
if(status==0){ //空座位
loginPane[tableNum].chairButton[chairNum].setVisible(true);
loginPane[tableNum].imageLabel[chairNum].setVisible(false);
}
else{ //该座位被占用
loginPane[tableNum].chairButton[chairNum].setVisible(false);
loginPane[tableNum].imageLabel[chairNum].setVisible(true);
loginPane[tableNum].imageLabel[chairNum].setIcon(new ImageIcon(manImage));
}
}
}
}
}
}
}
//刷新台面线程类
class RefreshThread extends Thread{
boolean refreshStop=false;
public void run(){
while(!refreshStop){
try{
Thread.sleep(5000); //延时5秒
}catch(InterruptedException e){}
if(currentTable==-1 && currentChair==-1){
writer.println("refresh!"); //请求最新座位信息
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -