JAVA实现植物大战僵尸连连看

这篇博客详细介绍了使用JAVA实现连连看游戏的过程,包括需求分析、游戏功能演示、总体设计、类图以及核心的方块消除算法。博主对关键代码进行了注解,并提供了四种消除检测方法:水平、垂直、单拐角和双拐角。文章结尾提到代码可能存在BUG,仅供学习参考。
摘要由CSDN通过智能技术生成

说明:本篇博客主要讲述练练看游戏的设计与实现。前半部分为分析与类和属性的说明,后半部分为程序的实现与程序代码。第一次写小游戏,仍存在许多问题,也借鉴了CSDN前辈的代码想法,如有不妥,还望多批评指正。

(一)需求分析

已经实现的部分:

1.游戏开始界面
2.游戏方块消除功能
3.游戏时间限制功能
4.方块刷新重拍功能
5.在游戏胜利失败时提示并结束游戏
6.炸弹功能
7.游戏中鼠标移动和点击的动态效果
8.游戏分数记录功能

未实现部分:

1.游戏音效
2.游戏分数排行榜记录功能

(二)游戏功能演示

游戏开始界面
游戏主界面

(三)游戏总体设计和类图

游戏窗口总共分为四类,第一个是游戏初始窗口,提供了开始游戏选项和更多选项,第二是游戏主窗口,提供了游玩游戏的界面,第三类是结束窗口,在游戏胜利或者失败时弹出,第四个是更多信息窗口。这四类窗口都继承了JFrame,其中其初始窗口和主窗口实现了MouseListener的接口,为了对按键添加监听。
玩家通过点击开始游戏打开一个游戏主窗口,关闭当前初始窗口,或者点击更多打开更多信息窗口。游戏主窗口中通过对游戏结束的判定打开结束窗口。
在这里插入图片描述

(四)项目代码和注解

为了方便学习,我几乎对每一行关键代码进行了注解,有些代码,如刷新、炸弹功能代码,可更改性比较大,而且不是特别完美,所有我没有添加注解,关于最关键的方块消除算法,下文会有详细解答

游戏初始窗口类代码(MainWindow.java)

package myplantslink;

import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class MainWindow extends JFrame implements MouseListener {
   
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ImageIcon img,imgstart,imgstart2,imgmore,imgmore2;//背景图片 开始图片 更多图片
	private JButton b1,b2;//开始按钮  更多按钮
	private int w1,w2,w3,h1,h2,h3;//背景 开始 更多 图片的长宽
	private JLabel label;//用于装载按钮的控件
	MainWindow()
	{
   
		//图片初始化
		img=new ImageIcon("pic//bg1.jpg");
		imgstart=new ImageIcon("pic//start.jpg");
		imgstart2=new ImageIcon("pic//start 2.jpg");
		imgmore=new ImageIcon("pic//more.jpg");
		imgmore2=new ImageIcon("pic//more2.jpg");
		//获取长宽
		w1=img.getIconWidth();
		h1=img.getIconHeight();
		w2=imgstart.getIconWidth();
		h2=imgstart.getIconHeight();
		w3=imgmore.getIconWidth();
		h3=imgmore.getIconHeight();
		//开始 更多按钮初始化
		b1=new JButton();
		b1.setBounds(183,270,w2,h2);
		b1.setIcon(imgstart);
		b1.setBorderPainted(false);
		b1.addMouseListener(this);
		b1.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		b2=new JButton();
		b2.addMouseListener(this);
		b2.setIcon(imgmore);
		b2.setBounds(450,276,w3,h3);
		b2.setBorderPainted(false);
		b2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		//控件初始化
		label=new JLabel(img);
		label.add(b2);
		label.add(b1);
		label.setBounds(0,0,w1,h1);
		label.setLayout(null);
		//主窗口初始化
		this.add(label);
		this.setLayout(null);
		this.setBounds(300,160,w1+10,h1+30);
		this.setTitle("植物大战僵尸");
		this.setVisible(true);
	}
	public void mouseClicked(MouseEvent e) {
   
		// TODO Auto-generated method stub
		if(e.getSource()==b1) //点击开始  游戏开始  此窗口消失
		{
   
			new GameWindow();
			this.dispose();
		}
		else if(e.getSource()==b2)//点击更多 显示更多信息窗口
		{
   
			new MoreWindow();
		}
	}

	public void mousePressed(MouseEvent e) {
   
		// TODO Auto-generated method stub
		
	}

	public void mouseReleased(MouseEvent e) {
   
		// TODO Auto-generated method stub
		
	}

	//按钮鼠标移入的动画效果
	public void mouseEntered(MouseEvent e) {
   
		// TODO Auto-generated method stub
		if(e.getSource()==b1) b1.setIcon(imgstart2);
		else if(e.getSource()==b2) b2.setIcon(imgmore2);
	}

	public void mouseExited(MouseEvent e) {
   
		// TODO Auto-generated method stub
		if(e.getSource()==b1) b1.setIcon(imgstart);
		else if(e.getSource()==b2) b2.setIcon(imgmore);
	}
}

游戏主界面类代码(GameWindow.java)

package myplantslink;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.Timer;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/*练练看游戏界面*/
public class GameWindow extends JFrame implements MouseListener{
   

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ImageIcon [] Pics=new ImageIcon [8]; //植物未被鼠标选中时显示的图片
	private ImageIcon [] PaintedPics=new ImageIcon[8]; //植物被鼠标选中后的图片
	private ImageIcon Backgroundimg,Timeimg,Refreshimg,Bomimg,Scoreimg;//背景、时间图标、刷新图标、炸弹图标、分数图标
	private ImageIcon [] rn=new ImageIcon[4];//数字图标0 1 2 3
	private int [] nums={
   10,10,10,8,8,8,8,8};//每种方块的数量
	private int [] cnt=new int [9];//记录每种方块的数量  用于初始化  确保每种方块不超过规定数量
	private int Cols=10,Rows=7;//行和列的长度
	/*地图数组 用于后面的消除算法 长和宽要比实际方块的要多2*/
	private boolean [][] Map=new boolean [Rows+2][Cols+2];
	private int w1,h1,wp,hp;//背景图片长宽  植物图片长宽
	private JLabel label;//背景图片标签  用于装载背景图
	private JButton [][]Blocks=new JButton [Rows+2][Cols+2];//植物方块按钮
	private int [][] type=new int [Rows+2][Cols+2];//记录每个位置的植物类型
	private JPanel panel1,panel2;//装载植物方块的控件 用于装载刷新按钮 炸弹按钮的控件
	private JButton TimeButton,RefreshButton,RefreshNumsButton,BomButton,BomNumsButton,ScoreButton,ScoreNumsButton;//时间 刷新 炸弹 分数 按钮
	private final JProgressBar progressBar = n
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值