游戏界面窗口:
- 通过继承JFram来实现
在JFram里创建一个继承JPanel的内部类设置为JFram的默认面板 - 利用
setContentPane(new 继承JPanel的内部类)
设置默认面板 - 利用
setLocationRelativeTo(null)
设置窗口居中 - 在内部类里添加按钮监听实现窗口跳转·游戏说明和退出
- 利用
dispose();
释放当前窗口资源 -
System。exit(0)
退出窗口,关闭程序
注:(1)为非正常退出 -
:: 双冒号具有引用功能,方法引用不是调用方法
对象名::实例方法名
类名::静态方法名
类名::实例方法名
类名::new
游戏窗口:
- 通过继承JFram来实现
- 在JFram里创建一个继承JPanel的内部类设置为JFram的默认面板
- 在内部类里添加按钮监听实现窗口跳转·游戏说明和退出
- 在构造方法里添加窗口监听匿名类实现窗口关闭
this.addWindowListener(new WindowAdapter()
- 用Runnable接口创建线程来实现方块的下落
接口只有一个 run() 方法,用 start() 方法启用线程
当某一线程调用 join() 方法,其他线程会在这一线程执行完后才开始执行。 - 在窗口类里创建按键监听内部类实现方块的移动
- 通过继承适配器KeyAdapter来实现要用到的方法
- 按钮监听和按键监听会发生冲突,导致按键无法使用,通过重新获得面板焦点来解决冲突
this.setFocusable(true);
TetGame.this.requestFocus();
- 利用迭代器Iterator 遍历容器
hasNext() 判断是否还有后续元素
next() 下一个元素
remove()移除容器内容 -
@Override
注解,必须覆盖父类的方法,覆盖是多态的技巧之一。
- 使用Random创建随机对象。
- 使用 repaint() 方法重画图形。
-
字体类Font
可改变字体大小·外观
单元块
- 使用重载的构造方法
重载是多态的一种方法,同一个类里具有相同名称的多个方法,但参数的列表必须不同
在构造方法里利用this();调用另一个构造方法,this();必须写在方法的第一行
构造方法是在对象被创建时初始对象成员的方法,没有返回值,不能用viod修饰,方法名与类名相同。 - 利用setter和getter 方法保护变量,不容易和其他类的变量混合
形状组合
- 通过数组改变方块颜色和形状
- 利用容器List存储方块
LinkedList:不具有随机存取特性,任意位置插入·删除元素时不需要移动其他元素,链表 的大小是可以动态增大或减小。
ArrayList:具有随机存取特性,插入·删除元素时需要移动其他元素,容量会自动增大,不能自动减小。
问题收集
- 代码整体较乱
- 封装性不算太强
- 变量保护程度低,该私有化的地方没做到
- 个别地方命名不规范
- 基础知识不牢固
- 异常处理使用不熟练
知识归纳
直接在窗口里画东西需要去闪烁,在JPanel里画不用
利用 JOptionPane.showConfirmDialog 弹出提示框
-
居中有多种方法
this.setLocationRelativeTo(null);
// 用 Toolkit 窗口居中 Toolkit tankWinPlace=Toolkit.getDefaultToolkit(); Dimension screen=tankWinPlace.getScreenSize(); int x=(screen.width-this.getWidth())/2; int y=(screen.height-this.getHeight())/2; this.setLocation(x,y);
静态static ,可被所有对象共享,是把内容直接放到内存中,使用时直接类名.对象
实现多重继承可以用接口或用B继承A ,C继承B来实现
-
跳转语句:
break:跳出循环体。
continue:结束本轮循环。 return:返回到主程序。
-
注释:
// 单行注释。
/* */ 单行或多行注释。
/ ** */ 文件注释。 数据类型转换优先级 :(低)byte→short→char→int→long→float→double(高)。
异常处理:try_cath_finally语句 ,throws语句:把异常送往上一层调用机构处理。
try_cath使用过会拖慢程序运行速度成员变量存在于堆内存里。
局部变量存在于栈内存,会随着方法调用的结束而消失。对于非字符串 “==”运算符和equals()方法是比较两个对象变量所指向的是否为同一个对 象。
-
配置文件
约定俗成后缀用 .properties
配置文件的使用public TankGame(){ Properties pros=new Properties(); try{ pros.load(this.getClass().getResourceAsStream(tank.properties)); }catch (IOException e){ e.printStackTrace(); } int intiTankCount=Integer.parseInt(pros.getProperty("initTankCount"));
还可以单独建一个类写静态方法
public class Property { static Properties pros=new Properties(); static { try { pros.load(Property.class.getClassLoader().getResourceAsStream("tank.properties")); } catch (IOException e) { e.printStackTrace(); } } public static String getProperty(String key){ return pros.getProperty(key); } }
然后用类名调用配置文件里的内容
int initTankCount=Integer.parseInt(Property.getProperty("initTankCount"));
-
简单的碰撞检测
辅助类Rectangle 获取矩形return new Rectangle(x,y,WIDTH,HEIGTH); } this.getRect().intersects(t.getRect())
foreach语句:
for(type element:array){ }
-
修饰符:
public公共:可以被任意对象访问。
private私有:只允许自己的类访问。
protected保护:只允许自己的类及其子类或同一包中的其他类访问。
缺省:同一包中其他类可以访问,其他包中的类不能访问。
final最终:制定此变量的值不能改变。 封装:常见是用方法,类
-
图片获取:
Toolkit类一般用于做 Java不适合做,系统适合做的事情private static Toolkit tk=Toolkit.getDefaultToolkit(); private static Image[] imgs={ tk.getImage(Explosion.class.getClassLoader().getResource("images/0.png") 图片数组 };
private static Map<String,Image> imgs=new HashMap<String, Image>(); private static Toolkit tk=Toolkit.getDefaultToolkit(); private static Image[] tankImgs=null; static { 静态初始器,直接放到内存里,不用在硬盘里读 ,提高效率。 tankImgs=new Image[]{ tk.getImage(Explosion.class.getClassLoader().getResource("images/0.png")), tk.getImage(Explosion.class.getClassLoader().getResource("images/0.png")), }; imgs.put("L",tankImgs[0]); imgs.put("R",tankImgs[1]); imgs.put("W",tankImgs[2]); imgs.put("S",tankImgs[3]); }
-
loop:
java中break和continue可以跳出指定循环,break和continue之后不加任何循环名则默认跳出其所在的循环,在其后加指定循环名,则可以跳出该指定循环(指定循环一般为循环嵌套的外循环)。
break跳出指定循环示例代码:
loop1:for(int x = 0; x < 4; x++) { loop2:for (int y = 0; y < 5 ; y++ ) { System.out.println("x="+x+",y="+y); if (y==2) { break loop1; } } }
continue跳出指定循环示例代码:
loop1:for(int x = 0; x < 4; x++) { loop2:for (int y = 0; y < 5 ; y++ ) { if (x==2) { continue loop1; } System.out.println("x="+x+",y="+y); } }
-
传值和传址的区别
public class Text{ int a=1; int b=2; private int text(int x int y){ //只传数值1,2进行交换啊a,b值不会互换 int tamp; 如果把a,b地址传给x,y进行交换,值会改变 tamp=x; x=y; y=temp; } System.out.println(a+" "+b); }
三目运算
条件语句?表达式1(表达式只能写一条):表达式2(表达式只能写一条);
goto,const为保留字
随机种子(Random Seed)是计算机专业术语,一种以随机数作为对象的以真随机数(种子)为 初始条件的随机数。一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条 件,然后用一定的算法不停迭代产生随机数。
-
异或运算
A B A⨁B 1 0 1 1 1 0 0 0 0 0 1 1 void swap(int &a,int &b) { a=a^b; b=b^a; a=a^b; } a1=a^b b=b^a1=b^a^b=a //此时a1=a^b b=a a=a1^b=a^b^a=b
a=11,b=9; 进行异或计算前会把数值都转换为二进制: a=a^b=1011^1001=0010; b=b^a=1001^0010=1011; a=a^b=0010^1011=1001; a=9,b=13;
- 字符串转换
任意类型+字符串=字符串
* 整形转换
> Integer.parseInt();
Integer.valueOf();
- 字符串转换
未完