Java学习笔记之连连看游戏的原理和代码实现(二)

这是我分析连连看的java学习笔记第二部分,下面主要来分析连连看游戏的原理和代码实现。

功能区域

一般的连连看游戏界面主要分游戏区和功能区2块组成(我这主要指单机版)。

  • 游戏区

功能:按一定排列显示所要消除的所有图片,当我们选择到两张相同的图片时,通过一定的规则对这两张图片进行消除,并显示连接和消除的效果。

  • 功能区

功能:显示程序的各个功能,如显示倒计时、分数、声音控制、游戏控制(开始和退出)等。

游戏区的实现

游戏区其实就是一个棋盘,我们可以把游戏区的最左上角的那一点看做坐标(0.0),游戏区的最上面的边就是X轴,游戏区最左面的边就是Y轴。这样我们就可以把游戏区看做一个二维数组,它的一维值是X,二维值是Y。当我们在游戏区选择了某一点时,我们就可以根据坐标定位到该数组,确定该点的值,再去判断这个值并执行操作。

图片方块对象类

按照上面所说,游戏区就是一个棋盘,是有一些图片方块组成的,这些图片方块我们可以看做一个个具体的对象。现在我们创建一个Piece类表示图片方块。Piece类代码如下所示,类中定义了7个属性,beginX,beginY,endX,endY为图片方块在游戏区的坐标;indexX,indexY为图片方块在棋盘数组中的位置;image为图片方块所代表的图片。我们可以用一个图片工具类ImageUtil把图片读入到图片方块对象中。

Piece类代码:
package cn.song.linkgame.commons;
import java.awt.image.BufferedImage;
/**
*方块对象
*/
public class Piece {
//方块对应图片
private BufferedImage image;
//方块开始x坐标
private int beginX;
//方块开始y坐标
private int beginY;
//方块结束x坐标
private int endX;
//方块结束y坐标
private int endY;
//方块在数组一维位置
private int indexX;
//方块在数组二维位置
private int indexY;

public Piece(int indexX,int indexY){
this.indexX = indexX;
this.indexY = indexY;
}
public Piece(int beginX,int beginY,int indexX,int indexY,BufferedImage image){
this.beginX = beginX;
this.beginY = beginY;
this.indexX = indexX;
this.indexY = indexY;
this.image = image;
this.endX = beginX + image.getWidth();
this.endY = beginY + image.getHeight();
}
/*********************************************
***以下省略所有geter方法
***另可以不用提供seter,我们直接通过构造方法构造对象
***一但构造这个对象,它的属性不能改变
**********************************************/
//图片是否相同
public boolean isSameImage(Piece piece){
if(this.image.equals(piece.getImage())){
return true;
}
return false;
}
}

作者:song   转载请注明出处:http://mtoou.info/java-lianliankan-daima/

Java学习笔记之连连看游戏类图(一)

来从来没写过学习笔记,这是第一次写(java学习笔记)。原因有两个:一、是受CSDN的影响,它提倡大家为每次学习到的新知识做一个总结,同时把自己所学的知识分享给大家,互联网最重要的功能就是分享;二、确实发现自己原来学习的很多知识都有点忘记了,很多知识没有很好的总结、整理和融会贯通,导致下次遇到类似问题又要重新学习和研究,浪费了大量的时间和重复了劳力。
好了,不说体外话了,进入正题。最近我做了一个连连看游戏,连连看大家都知道应该都玩过,QQ游戏里面就有。它是一种在一个区域内分布着许多不同的图片,通过选择两张相同的图片来按照一定规则消除的一种游戏。以下是连连看的游戏界面:

以下是我设计的类图:
+[cn]
|___+[song]
|   |_____+[linkgame]
|   |     |_________ LinkGame//游戏窗口
|   |     |_________+[commons]
|   |     |         |__________ GameConfiguration//游戏配置对象
|   |     |         |__________ GameException//异常处理类
|   |     |         |__________ LinkInfo//连接对象
|   |     |         |__________ Piece//图片方块对象
|   |     |         |__________ Point//连接点对象
|   |     |         |__________ SquareBoard//棋盘对象
|   |     |_________+[listener]
|   |     |         |________ BeginListener//功能区监听
|   |     |         |________ GameListener//游戏区监听
|   |     |_________+[service]
|   |     |         |________ GameService//游戏逻辑接口
|   |     |         |________+[impl]
|   |     |                  |_____ GameServiceImpl//接口实现类
|   |     |_________+[timer]
|   |     |         |______ TimerTask//定时任务对象
|   |     |_________+[utils]
|   |     |         |_____ ImageUtil//图片工具类
|   |     |_________+[view]
|   |     |         |_____ GamePanel//游戏区面板
|   |     |         |_____ SoundPanel//声音面板
|___|_____|_________|_____ TimeLabel//时间显示面板

本文作者:song  转载请注明出处:http://mtoou.info/java-lianliankan-leitu/

Java学习笔记《Head First Java》

java中,创建对象时,它会被存放在称为堆的内存区域内,此区域是可回收垃圾的堆,非普通堆

在任何类中的任何程序都可以存取public static的方法,若如此定义变量public static final val;(val 类似全局变量)

变量必须有类型,必须要有名称。java中变量只有两种类型:primitive主数据类型(boolean,char,integer,byte,short,int,long,float,double)和对象引用。32.5f除非加上f,否则所有带小数点的值都会被java当做double处理

命名规则:名称必须以字母、下划线(_)或$符号开头,避开保留字。

事实没有对象变量这样的东西存在,只有引用(reference)到对象的变量。对象引用变量保存的是存取对象的方法,它不是容器,而是类似指向对象的指针(或者地址),所有对象引用(object Reference)都具有相同的大小。对象只会存在于可回收垃圾的堆上。对象引用可以引用相同对象的不同实例,但声明为final则不可变。java中数组也是对象int[] nums = new int[7];Dog[] pets = new Dog[7]只是创建了对Dog的引用,但缺少实际的Dog对象。

 java是通过值传递的(拷贝传递),方法无法改变调用方所传入的参数。

类的实例变量永远都会有默认值,而类方法内的局部变量没有默认值。

使用==来比较两个primitive主数据类型,或者判断两个引用是否引用同一个对象。使用equals()来判断两个对象是否在意义上相等。

本java学习笔记仅供我个人学习参考之用。文/HUBO

Java学习笔记:多重继承,类名,内部类与外部类

自己的java学习笔记:java中不允许多重继承,一个完整的类名是包装名与类名的组合,在java中不要将源文件和类文件放在一起,在内部类中可以随意使用外部类的成员变量以及成员方法等,仅作个人学习只用。

java中不允许多重继承
但是使用接口就可以实现多重继承,一个类可以同时implements多个接口,每当继承一个接口就要实现一个接口的所有方法。
在定义一个接口时使该接口继承另一个接口
interface intf1{}
interface intf2{} extends intf1{}
一个完整的类名是包装名与类名的组合。java采用包机制方便开发人员管理庞大的应用程序组件,方便软件复用。
同一个package中的class可以不放在同一个文件夹下,,只要在CLASSPATH中分别指定这两个位置即可。
java中package全部用小写字母表示,使用创建者Internet域名的反序。
不同package之间的class可以重名。
在java中不要将源文件和类文件放在一起
import关键字除了可以导入package之外还可以导入静态成员(成员方法/成员变量)。
final关键字声明的变量不可以修改,一般用来定义变量为常量包括数组,必须在声明时对其进行赋值操作,变量名用大写字母表示,中间用下划线,定义为final的对象引用只能指向唯一的对象,但是对象的值是可以更改的,加上static后可以使一个对象的值做到真正不能更改。
定义全局变量:public static final char a=’a’;
定义为final的方法执行效率高于非final方法。
final方法不能被重写,final类不能被继承。
在内部类中可以随意使用外部类的成员变量以及成员方法,尽管这些类成员被修饰为private。
内部类的对象实例化操作必须在外部类或外部类中的非静态方法中实现。除非使用内部类对象引用调用,内部类成员是不能被外部类使用。
如果遇到内部类与外部类成员变量重名的情况可以用this关键字处理。
在类的局部位置定义局部内部类,如定义在方法的内部,在此方法的外部不能访问该内部类,但是该内部类可以当前代码块的常量以及此外部类的所有成员。
静态内部类不能使用非静态外部类的非静态成员。
java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。出现异常用try-catch语句进行处理,当try代码中的语句发生异常,程序就会调转到catch代码块中执行,不会执行try代码块中发生异常语句后面的代码.
swing程序设计(这是个重头戏,还需要仔细学习)
java关于窗口和组建的编写都与Component与Container有关。
Swing中常用JFrame和JDialog窗体。
JDialo窗体在使用时也需要调用getContaintPane()方法将窗体转换为容器,然后在容器中设置窗体的属性。/root@linux

Java学习笔记:布局,类和对象,抽象类,接口,继承,正则表达式等

此java学习笔记谨为个人学习用处,主要内容为布局组件布局管理器、类和对象、抽象类和接口、继承、正则表达式、数组等内容其中难免有不少错误,敬请纠正。

布局组件 布局管理器

FlowLayout是最简单的布局管理器,将组件从左到右,从上到下顺序布局

GridLayout将组件按行列分格来布局,要指定行列数目

BorderLayout框架的上下两部分只在水平方向拉伸,而在垂直方向不变。

类和对象笔记

1.因为主方法是静态的,所以要想在主方法中直接调用其他,则其他方法也必须是静态的。

2.mainline中的(String[] args)行参实际上为数组。args[0]~args[n],分别代表第一个到第n个参数,可以使用args.length获取参数的个数。

3.包装类

调用BigInteger时,BigInteger instance=BigInteger(“2″);其中的省略号不能省略。

4.引用对象

有两种方法,使用运算符“==”或equals()方法,两者有着本质的不同.

5.类的可见性

private只有在本类中可见

protected只有在本包中可见

public在本包和其他包里都可见

6.基本数据类型的对象处理

java可以把基本数据类型作为对象来处理,在java中一切皆为对象,int型有Integer对象,boolean型有Boolean对象等。

抽象类和接口笔记

将父类定义为抽象类,使用父类进行继承和多态处理。

public abstract class Test{

abstract void testAbstract();//定义抽象方法

}

抽象类除了被继承外没有任何意义。

抽象类不可以实例化对象。

只要类中有一个抽象方法就被定义为抽象类。

接口是抽象类的延伸,是纯粹的抽象类,接口中的所有方法都没有方法体。

public interface drawTest{

void draw();//接口内的方法省略abstract关键字

}

接口中的方法必须被定义为public或abstract。

一个类实现一个接口使用implements关键字。
继承笔记

重构时权限只能由低到高,如父类中是protected在重构中只能是pubic

实例化子类对象时首先实例化父类对象,然后再实例化子类对象。

java.lang.Object类是java中的最高层类,java中任何一个类都是它的子类。Object类主要包括clone(),finalize(),euqals(),toString()等方法。final类型不能被重写。

对象类型转换包括向上转型和向下转型。将父类对象强制转换为某个子类对象的方式叫做显示类型转换,用于向下类型转换中。在向下类型转换中要先判断子类对象是否是父类对象的一个实例,由instanceof操作符来完成。

定义不定长参数的方法: public static int add(int …a)相当于(int[]a)

正则表达式

A?  A出现0或一次

A*  A出现0或多次

A+  A出现一次或多次

A{2} A正好出现2次

A{2,} A至少出现2次

A{2,4}A出现2到4次

[abc]2:a2或b2或c2

[^abc]:除了abc

[a-r]:代表a到r的任意一个

[a-zA-Z]:可表示任意一个英文字母

[a-c[e-g]]:a到c或e到g任意一个字母

[a-o&&[def]]:a到o交def
数组

初始化:

int arr[]=new int[]={1,22};

排序:

Arrays.sorts(arr);

填充:

Arrays.fill(arr); Arrays.fill(arr,from,end,number);

复制:

Arrays.copyOf(arr,5); 5是复制之后的新数组的长度。

Arrays.copyOfRange(arr,from,end);

查询:

Arrays.binarySearch(arr,from,end,index)index是查查询变量,返回值是index所在的索引值(若不存在,则返回第一个大于index的元素索引)(二分查找)

Arrays.binarySearch(arr,key); arr所查找的数组,key关键字
文:root@linux 转载注明出处:http://mtoou.info/java-biji-1/