版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/int1282951082/article/details/78297843
花了两天时间,终于让我的蛇跑起来了,第一次自己独立做成功一个小游戏,感觉很有成就感。嘻嘻嘻嘻嘻嘻~~~
附上实现后的图,可以玩,但还有些细节需要改进,比如记分,暂停,重玩等功能暂时还没实现,以后会改进的
我说一下思路和步骤
第一步:JFrame画出窗口
第二步:重写paint方法,用来画出地图界限、球和蛇
第三步:初始化 init() 设置球和蛇的初始位置坐标
第四部:写内部类move,实现线程。让蛇跑起来
第五步:游戏规则,蛇不能撞墙,不能缠着自己。否则游戏结束GG。蛇吃到球变长,同时会在随机位置产生新的球。
第六步:switch实现键盘操作 addKeyListenner()
这里最重要的一个核心思想就是 线程
写一个死循环while(true),然后把画的操作都放在循环里面,这样游戏就可以一直玩。
但是每循环一次,要让线程歇一会再继续跑,这里就用到了Thread.sleep(time);
这样就实现了让蛇以稳定速度前行。
package com.java1997;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Snake extends JFrame{
private Point point=new Point();
private LinkedList<Point> list=new LinkedList<Point>();
private int time;
private int key;
//初始化
private void init(){
//食物初始位置
point.setLocation(100, 100);
//蛇初始位置
list.add(new Point(300,300));
list.add(new Point(310,300));
list.add(new Point(320,300));
list.add(new Point(330,300));
list.add(new Point(340,300));
list.add(new Point(350,300));
list.add(new Point(360,300));
list.add(new Point(370,300));
list.add(new Point(380,300));
time=100;
key=37;
}
@Override
public void paint(Graphics g) {
Image img = createImage(500, 500);
Graphics g1=img.getGraphics();
//画背景
g1.setColor(Color.BLACK);
g1.fillRect(0, 0, 500, 500);
//线框
g1.translate(50, 50);
g1.setColor(Color.WHITE);
g1.drawRect(0, 0, 400, 400); //线条用draw,填满用fill
//食物
g1.setColor(Color.CYAN);
g1.fillOval(point.x, point.y, 10, 10);
//蛇
g1.setColor(Color.PINK);
for(Point p:list){
g1.fillRect(p.x, p.y, 10, 10);
}
g.drawImage(img, 0, 0, 500, 500, this);
}
public Snake(){
this.setTitle("玩蛇骚年"); //标题
this.setSize(500,500); //大小
this.setVisible(true); //可见
this.setLocationRelativeTo(null); //居中
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
if(e.getKeyCode()>=37 && e.getKeyCode()<=40){
if(Math.abs(e.getKeyCode()-key)!=2){
key=e.getKeyCode();
}
}
}
});
init();
new Thread(new Move()).start();
}
//实现线程
class Move implements Runnable{
public void run() {
int i=0;//记步数
while(true){
try {
System.out.println(i+"~~~");
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取蛇头
Point p = list.getFirst().getLocation();
switch (key) {
case 37:
p.x=p.x-10;
break;
case 38:
p.y=p.y-10;
break;
case 39:
p.x=p.x+10;
break;
case 40:
p.y=p.y+10;
break;
}
//蛇不能撞墙,不能撞自己
System.out.println(p.x+","+p.y);
if(p.x<0||p.x>390||p.y<0||p.y>390||list.contains(p)){
JOptionPane.showMessageDialog(null, "游戏结束 GG");
break;
}
list.addFirst(p);
//吃球,更新球坐标
if(p.equals(point)){
int x=(int)(Math.random()*40)*10;
int y=(int)(Math.random()*40)*10;
point.setLocation(x, y);
}else{
list.removeLast();
}
Snake.this.repaint();
i++;
}
}
}
public static void main(String[] args) {
new Snake();
}
}