private static Random r = new Random(); //利用random
this(r.nextInt(Yard.ROWS-2) + 2, r.nextInt(Yard.COLS));// nextInt(int a) 在0 到a 范围内产生随机数
贪吃蛇编写步骤:
面向过程思想: 首先利用SE桌面编程 画出Frame框 然后加载线程 每隔一段时间重绘 内部的图像 包括 线 背景 蛇 蛋等
蛇 利用双向链表来表示
蛇与Egg吃掉 利用区域重合原理
面向对象: Yard 就是背景框 主要属性 长 宽 背景颜色
主要方法 刷新 重绘 键盘检测等
键盘检测第一次用到:
private class KeyMonitor extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_F2) {
paintThread.reStart();
}
s.keyPressed(e);
}
Snake 蛇 因为要做成双向链表 属性为 头 尾
主要方法:1。 向头或尾添加Node节点
2. 尾部删除Node
3. 移动(在头部添加Node 尾部删除Node)
4. Eat Egg 判断方式是 头 Node 和 Egg矩形区域是否重合
if(this.getRect().intersects(e.getRect())) { //getRect 是自定义方法 intersects 是比较是否重复
e.reAppear();
5. 判断是否有死亡 经过我改编变成了只能撞到自己身子 死亡 判断头Node的横纵 和 其它身子的横纵是否相等
6. 将蛇画出来 就是遍历Node元素 调用node类的Darw
Node类 : 是双向链表的一个元素 包括Node的 1.横纵 坐标点
2.每个Node都有其自己的方向
3.其指向前一个的指针 和指向后一个元素的指针
Egg类: 就是随机出现Egg 包括 横纵坐标等
总结: 学习贪吃蛇游戏 并自己动手将其改编成了 撞到墙壁不死而是穿过墙壁 ,程序如下。
public void addToHead() {
Node node = null;
switch(head.dir) {
case L :
if(head.col==0){
node = new Node(head.row, Yard.COLS, head.dir);
}
else{
node = new Node(head.row, head.col - 1, head.dir);
}
break;
case U :
if(head.row==0){
node = new Node(Yard.ROWS, head.col, head.dir);
}
else {
node = new Node(head.row - 1, head.col, head.dir);
}
break;
case R :
if(head.col==Yard.COLS){
node = new Node(head.row, 0, head.dir);
}
else {
node = new Node(head.row, head.col + 1, head.dir);
}
break;
case D :
if(head.row==Yard.ROWS){
node = new Node(0, head.col, head.dir);
}
else {
node = new Node(head.row + 1, head.col, head.dir);
}
break;
}
node.next = head; // 双向链表 指针 新new出来的数 指向 开头
head.prev = node; //开头那那个node 向前指向 head
head = node;
size ++;
}
觉得写本游戏的收获:1.在实际出发 理解面向对象编程思想
2. Snake 分成 Node 来写 每个Node都有自己的方向 也是绝了 顺其自然的实现了拐弯之类的
3.蛇在增长 的时候是 改变指针指向下一个 移动的时候是将后一个放在前一个头
4.学会键盘检测