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

📄 gamepanel.java

📁 俄罗斯方块,机器人,华容道破解,文件格式(PE,BMP),邮箱硬盘,日历图片
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				viewer.repaint();
			}
			drawBox(getGraphics());
			return false;
		}
		Box b=box.copy();
		b.setY(b.getY()+1);
		if(!canAdd(b)){
			setNoMove(box);
			Box next=box.willNext();
			next.setPoint(startPoint.x,startPoint.y-box.getBoxHeight());
			if(!canAdd(next)){//Game Over
				if(listener!=null)
					listener.doGameOver(new BoxEvent(box.copy(),0));
				clearBoxs(getGraphics());
				init();
				return false;
			}
			box.next();
			box.setPoint(startPoint.x,startPoint.y-box.getBoxHeight());
			if(listener!=null)
				listener.doNewBox(new BoxEvent(box.copy(),0));
			if(viewer!=null)viewer.repaint();
			drawBox(getGraphics());
			return false;
		}
		clearBox(getGraphics());
		box.setY(box.getY()+1);
		drawBox(getGraphics());
		return true;
	}
	/**
	 * 处理空格降到底部
	 */
	private void actionSPACE(){
		while(actionDOWN());
	}
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setLayout(new GridBagLayout());
		//this.addKeyListener(this);//添加事件处理器
	}
	//事件处理函数
	public void keyPressed(java.awt.event.KeyEvent e) {
		switch(e.getKeyCode()){
		case java.awt.event.KeyEvent.VK_UP:
			actionUP();
			break;
		case java.awt.event.KeyEvent.VK_LEFT:
			actionLEFT();
			break;
		case java.awt.event.KeyEvent.VK_RIGHT:
			actionRIGHT();
			break;
		case java.awt.event.KeyEvent.VK_DOWN:
			actionDOWN();
			break;
		case java.awt.event.KeyEvent.VK_SPACE:
			actionSPACE();
			break;
		}
	}
	public void keyTyped(java.awt.event.KeyEvent e) {
	}
	public void keyReleased(java.awt.event.KeyEvent e) {
	}
	/**
	 * 绘制网络
	 * @param g 图形
	 */
	private void drawLines(Graphics g){
		if(g==null)return;
		Color temp=g.getColor();//保存以前颜色
		g.setColor(lineColor);
		//将边框加粗 画两次
		g.draw3DRect(point.x-1,point.y-1,boxWidth*boxCol+2,boxHeight*boxRow+2,true);//画边框
		g.draw3DRect(point.x,point.y,boxWidth*boxCol,boxHeight*boxRow,true);//画边框
		for(int i=1;i<boxCol;i++)
			g.drawLine(point.x+i*boxWidth,point.y, point.x+i*boxWidth,point.y+boxRow*boxHeight);
		for(int i=1;i<boxRow;i++)
			g.drawLine(point.x,point.y+i*boxHeight,point.x+boxWidth*boxCol,point.y+i*boxHeight);
		g.setColor(temp);//还原以前颜色
	}
	/**
	 * @param g 绘制不能移动的方块
	 */
	private void drawBoxs(Graphics g){
		if(g==null)return;
		Color c=g.getColor();
		g.setColor(boxColor);
		for(int i=0;i<boxRow;i++){
			for(int j=0;j<boxCol;j++){
				if(!space[i][j])
					g.fill3DRect(point.x+j*boxWidth+1,point.y+i*boxHeight+1,boxWidth-1,boxHeight-1,true);
			}
		}
		g.setColor(c);
	}
	/**
	 * @param g 清除不能移动的方块图形
	 */
	private void clearBoxs(Graphics g){
		if(g==null)return;
		Color c=g.getColor();
		g.setColor(this.getBackground());
		for(int i=0;i<boxRow;i++){
			for(int j=0;j<boxCol;j++){
				if(!space[i][j]){
					g.clearRect(point.x+j*boxWidth+1,point.y+i*boxHeight+1,boxWidth-1,boxHeight-1);
				}
			}
		}
		g.setColor(c);
	}
	/**
	 * @param g 绘制当前移动的方块
	 */
	private void drawBox(Graphics g){
		if(g==null)return;
		if(view){//预览绘画
			Color c=g.getColor();
			g.setColor(boxColor);
			if(up!=null)
				clearBox(up,g);
			drawBox(box.willNext(),g);
			up=box.willNext();
			g.setColor(c);
			return;
		}
		Color c=g.getColor();
		g.setColor(boxColor);
		int[][] d=box.getPoints();
		for(int i=0;i<d.length;i++){
			if(box.getX()+d[i][0]<0||box.getY()+d[i][1]<0)continue;
			g.fill3DRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1,true);
		}
		g.setColor(c);
	}
	/**
	 * @param g 清除当前绘制的移动方块
	 */
	private void clearBox(Graphics g){
		if(g==null)return;
		int[][] d=box.getPoints();
		for(int i=0;i<d.length;i++){
			if(box.getX()+d[i][0]<0||box.getY()+d[i][1]<0)continue;
			g.clearRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1);
		}
	}
	public void repaint(){
		paint(getGraphics());
	}
	/**
	 * 消除当前绘制的移动方块
	 * @param box 需要清除的方块
	 * @param g 图形
	 */
	private void clearBox(Box box,Graphics g){
		if(g==null)return;
		int[][] d=box.getPoints();
		for(int i=0;i<d.length;i++)
			g.clearRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1);
	}
	/**
	 * 绘制指定的方块
	 * @param box 方块
	 * @param g 图形
	 */
	private void drawBox(Box box,Graphics g){
		if(g==null)return;
		Color c=g.getColor();
		g.setColor(boxColor);
		int[][] d=box.getPoints();
		for(int i=0;i<d.length;i++)
			g.fill3DRect(point.x+(box.getX()+d[i][0])*boxWidth+1,point.y+(box.getY()+d[i][1])*boxHeight+1,boxWidth-1,boxHeight-1,true);
		g.setColor(c);
	}
	//专为预览类面板定义的上一个方块变量
	Box up=null;
	//绘画
	public void paint(Graphics g){
		if(g==null)return;
		//初始化大小
		if((getWidth()-boxWidth*boxCol)<0){this.setSize(boxWidth*(boxCol+1),getHeight());}
		if((getHeight()-boxHeight*boxRow)<0){this.setSize(getWidth(),boxHeight*(boxRow+2));}
		//计算左上角的点
		point=new Point((getWidth()-boxWidth*boxCol)/2,(getHeight()-boxHeight*boxRow)/2);
		drawLines(g);
		drawBoxs(g);
		drawBox(g);
	}
	/**
	 * @param width 设置方块的宽度
	 */
	public void setBoxWidth(int width){
		boxWidth=width;
	}
	/**
	 * @return 取得方块的宽度
	 */
	public int getBoxWidth(){
		return boxWidth;
	}
	/**
	 * @param height 设置方块的高度
	 */
	public void setBoxHeight(int height){
		boxHeight=height;
	}
	/**
	 * @return 取得方块的高度
	 */
	public int getBoxHeight(){
		return boxHeight;
	}
	/**
	 * @param row 设置游戏中方块的行数
	 */
	public void setBoxRow(int row){
		boxRow=row;
	}
	/**
	 * @return 取得游戏方块的行数
	 */
	public int getBoxRow(){
		return boxRow;
	}
	/**
	 * @param col 设置游戏方块的列数
	 */
	public void setBoxCol(int col){
		boxCol=col;
	}
	/**
	 * @return 取得游戏中方块的列数
	 */
	public int getBoxCol(){
		return boxCol;
	}
	public void actionPerformed(ActionEvent e) {
		actionDOWN();
	}
	/**
	 * 启动游戏
	 */
	public void start(){
		if(!timer.isRunning())
			timer.start();
	}
	/**
	 * 停止游戏
	 */
	public void stop(){
		if(timer.isRunning())
			timer.stop();
	}
	/**
	 * 根据命令字符,完成指定动作
	 * 'U','D','L','R','S' 分别是上下左右底
	 * @param key 命令字符
	 */
	public void action(char key){
		switch(key){
		case 'U':
		case 'u':actionUP();break;
		case 'L':
		case 'l':actionLEFT();break;
		case 'R':
		case 'r':actionRIGHT();break;
		case 'D':
		case 'd':actionDOWN();break;
		case 'S':
		case 's':actionSPACE();break;
		}
	}
	/**
	 * 判断游戏中指定位置是否为空
	 * @param x X轴位置
	 * @param y Y轴位置
	 * @return 为空返回true,否则返回false
	 */
	public boolean isSpace(int x,int y){
		return space[y][x];
	}
	/**
	 * @return 复制游戏地图空间
	 */
	public static boolean[][] copyData(boolean [][]space){
		boolean[][] re=new boolean[space.length][space[0].length];
		for(int i=0;i<space.length;i++)
			System.arraycopy(space[i],0,re[i],0,space[0].length);
		return re;
	}
	public boolean[][] copyData(){
		return copyData(space);
	}
	public Box getBox() {
		return box;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -