⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientapplet.java

📁 互联网多人联机对垒游戏-分服务端、客户端
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
					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 + -