/*

学习javaSE一个月的时间,通过自己学习的知识制作了一个贪吃蛇的小游戏。体验一下学习的过程


控制台贪吃蛇  

--------------------------------

|                                        |

|                           @         |

|        #                              |

|        #                              |

|        ###                         |

|            #                          |

|            #                          |

|                                        |

--------------------------------

至少吃掉一个@,并产生新的@

*/

package EX_0729_容器;


import java.util.ArrayList;

import java.util.EmptyStackException;

import java.util.Random;


class Sneak {

int x;

int y;

//重写构造方法

public Sneak(int x, int y) {

super();

this.x = x;

this.y = y;

}

//重写hashCode   equals

@Override 

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + x;

result = prime * result + y;

return result;

}


@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Sneak other = (Sneak) obj;

if (x != other.x)

return false;

if (y != other.y)

return false;

return true;

}


}


public class EngorgeSnake {


public static void main(String[] args) throws InterruptedException {

// TODO Auto-generated method stub

                //学习容器的时候要记住一些常用的类和方法,这边用到的容器是用来画出蛇

                //开始位置。

ArrayList<Sneak> array = new ArrayList<Sneak>();

array.add(new Sneak(3, 4));     //定义刚开始蛇的位置

array.add(new Sneak(4, 4));

array.add(new Sneak(5, 4));

array.add(new Sneak(5, 5));

array.add(new Sneak(5, 6));

array.add(new Sneak(5, 7));

array.add(new Sneak(6, 7));

array.add(new Sneak(7, 7));

Sneak p = new Sneak(3, 20);

Random random = new Random();

                //这边的用到线程和异常处理,培训中老师还没有交到,自己自学过程中有点了解。

for (int i = 0; i < 100; i++) {

//异常处理

try {

Thread.sleep(500); //延迟500毫秒

} catch (EmptyStackException e) {

// TODO: handle exception

e.getCause();

}

//判断蛇移动有规律,后面一个都是以前面一个相等,

//所以只要删除第最后一个,,更改第一个就可以。后面都是相等的,

array.remove(array.size() - 1);

array.add(0, new Sneak(array.get(0).x, array.get(0).y + 1));

print(array, p);

if (p.equals(array.get(array.size() - 1))) {

array.add(p);

p = new Sneak(random.nextInt(10) + 1, random.nextInt(37) + 1);


}

}

}

        //定义方法,通过不断的在控制台上不断是输出,从而引起的贪吃蛇的移动。

private static void print(ArrayList<Sneak> array, Sneak p) {

for (int i = 0; i < 12; i++) {


for (int j = 0; j < 40; j++) {

if (i == 0 || i == 11) {

System.out.print("-");

} else if (j == 0 | j == 39) {

System.out.print("|");

} else {

Sneak pr = new Sneak(i, j);

if (array.contains(pr)) {

System.out.print("#");


} else if (pr.equals(p)) {

System.out.print("@");


} else {


System.out.print(" ");

}

}

}

System.out.println();

}

}


}