JAVA实现贪吃蛇
第一步
#初始化窗体
代码:
public class MainFrame extends JFrame {
//private Snake snake;//蛇
//private Timer timer;//定时器
private JPanel jPanel;//游戏棋盘
//private Node food;//食物
public MainFrame()throws HeadlessException{
//初始化窗体
initFrame();
}
//设置参数
private void initFrame(){
//设置窗体
setSize(610,640);
//设置窗体位置
setLocation(300,80);
//设置按钮作用(退出按钮)
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体大小不变
setResizable(false);
}
public static void main(String[] args){
//创建窗体单元,并显示
new MainFrame().setVisible(true);
}
效果
第二步
#绘制棋盘
代码:
private void initGamePanel(){
jPanel=new JPanel(){
//绘制游戏棋盘中的内容
@Override
public void paint(Graphics g) {
//Graphics g 中有好多方法,可以画直线、矩形
//绘制40条横线
g.clearRect(0,0,600,600);
for (int i = 0; i <= 40; i++) {
g.drawLine(0,i*15,600,i*15);
}
//绘制40条竖线
for (int i= 0; i<=40; i++) {
g.drawLine(i*15,0,i*15,600);
}
第三步
#绘制蛇
代码:
LinkedList<Node> body = snake.getBody();
for (Node node : body) {
g.fillRect(node.getX()*15,node.getY()*15,15,15);
}
第四步
#控制蛇在棋盘的移动
代码
public void move() {
if (isLiving) {
//获取蛇头
Node head = body.getFirst();
switch (direction) {
case UP:
body.addFirst(new Node(head.getX(), head.getY() - 1));
break;
case DOWN:
body.addFirst(new Node(head.getX(), head.getY() + 1));
break;
case LEFT:
body.addFirst(new Node(head.getX() - 1, head.getY()));
break;
case RIGHT:
body.addFirst(new Node(head.getX() + 1, head.getY()));
break;
}
第五步
#控制蛇的移动
private void setKeyListener(){
addKeyListener(new KeyAdapter() {
@Override
//键盘按下时会自动调用此方法
public void keyPressed(KeyEvent e) {
//键盘中每个键都有一个编号
switch (e.getKeyCode()){
case KeyEvent.VK_UP:
if(snake.getDirection()!=Direction.DOWN){
snake.setDirection(Direction.UP);}
break;
case KeyEvent.VK_DOWN:
if(snake.getDirection()!=Direction.UP){
snake.setDirection(Direction.DOWN);}
break;
case KeyEvent.VK_LEFT:
if(snake.getDirection()!=Direction.RIGHT){
snake.setDirection(Direction.LEFT);}
break;
case KeyEvent.VK_RIGHT:
if(snake.getDirection()!=Direction.LEFT){
snake.setDirection(Direction.RIGHT);}
break;
}
}
});
}
第六步
#判断蛇是否撞墙和碰到自己
代码:
head = body.getFirst();
if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40){
isLiving=false;
}
//判断蛇是否碰到自己
for (int i = 1; i < body.size(); i++) {
Node node = body.get(i);
if(head.getX()== node.getX()&&head.getY()==node.getY()){
isLiving=false;
}
第七步
#绘制食物和吃食物
代码:
//绘制食物
g.fillRect(food.getX()*15,food.getY()*15,15,15);
吃食物
//蛇吃食物,沿着蛇头的移动方向增加一个节点
public void eat(Node food) {
Node head = body.getFirst();
switch (direction) {
case UP:
body.addFirst(new Node(head.getX(), head.getY() - 1));
break;
case DOWN:
body.addFirst(new Node(head.getX(), head.getY() + 1));
break;
case LEFT:
body.addFirst(new Node(head.getX() - 1, head.getY()));
break;
case RIGHT:
body.addFirst(new Node(head.getX() + 1, head.getY()));
break;
}
}
最终的效果