您的位置:首页 > 编程语言 > Java开发

Java版贪吃蛇制作过程分享

2014-07-07 16:00 197 查看
这是本人写的第一个游戏  简单写下过程

开发环境:

Java SE 8  Ecplice

思路:蛇的可以看成是由一个一个正方形组成,用Arraylist来记录下每一个正方体的坐标位置,先把前一个方块的坐标替换下一个方块的坐标,再通过move方法移动蛇头,最后repaint,如此循环。

需要掌握:

1.JFrame和JPanel的使用方法

2.Arraylist的使用方法

3.线程的创建

4.KeyListener的使用

5.双缓冲



共有两个类:

Test:

<pre name="code" class="java">import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;

public class Test {
public static void main(String args[]){
JFrame frame = new JFrame();
Mypanel mp = new Mypanel();
mp.setBackground(Color.WHITE);//设置JPanel背景色
mp.addKeyListener(mp);
frame.addKeyListener(mp);//绑定监听器
frame.add(mp,BorderLayout.CENTER);//把JPanel放到JFrame中央
frame.setSize(1920,1080);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Thread t = new Thread(mp);
t.start();//启动线程
}
}




Mypanel:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JPanel;

public class Mypanel extends JPanel implements Runnable, KeyListener{

int p,o,q,w;
//食物随机出现
int x_food = (int)(Math.random()*60)*30+100;
int y_food = (int)(Math.random()*30)*30+100;
int x[] = new int[10];
int y[] = new int[10];
int x_c[];
int y_c[];
int x_1 = 30;
int y_1 = 0;
int check_food = 0;
int check_self = 0;

ArrayList list_x = new ArrayList();
ArrayList list_y = new ArrayList();

Image ImageBuffer = null;
Graphics GraImage = null;

String direction = "right";

//构造函数 初始化蛇的位置
public Mypanel(){
for(int i = 0; i < 10; i++){
x[i] = 100 + 30*i;
y[i] = 400;
list_x.add(new Integer(x[i]));
list_y.add(new Integer(y[i]));
}
}
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.BLACK);
g.fillRect(x_food, y_food, 30, 30);
if(check_self == 1){
g.setColor(Color.BLACK);
g.fillRect(0, 0, 1920, 1080);
}
for(int i = 0; i < list_x.size(); i++){
g.fillRect(((Integer) list_x.get(i)).intValue(), ((Integer) list_y.get(i)).intValue(), 30, 30);
}
}
public void run(){
while(true){
for(int i = 0; i < list_x.size()-1; i++){
list_x.set(i,list_x.get(i + 1));
list_y.set(i,list_y.get(i + 1));
}
move(direction);
stay();
food();
carshcheck();
}
}

//重画
public void stay(){
try{
Thread.sleep(200);
}catch(Exception e){}
repaint();
}

public void move(String d){
if(d == "right"){
p = 1;
o = 0;
}
if(d =="left"){
p = -1;
o = 0;
}
if(d =="up"){
p = 0;
o = -1;
}
if(d =="down"){
p = 0;
o = 1;
}

q = ((Integer) list_x.get(list_x.size()-1)).intValue();
w = ((Integer) list_y.get(list_y.size()-1)).intValue();
q += 30*p;
w += 30*o;
list_x.set(list_x.size()-1,new Integer(q)) ;
list_y.set(list_y.size()-1,new Integer(w)) ;//代码检查要细心
}

public void food(){
check_food = 0;
if(direction == "left"){
x_1 = 30;
y_1 = 0;
}
if(direction == "right"){
x_1 = -30;
y_1 = 0;
}
if(direction == "up"){
x_1 = 0;
y_1 = 30;
}
if(direction == "down"){
x_1 = 0;
y_1 = -30;
}
if(q == x_food + x_1 && w == y_food + y_1){
list_x.add(new Integer(x_food));
list_y.add(new Integer(y_food));
check_food = 1;
repaint();
x_food = (int)(Math.random()*60)*30+100;
y_food = (int)(Math.random()*30)*30+100;
}
}

//自身碰撞检测
public void carshcheck(){
for(int i = 0; i < list_x.size(); i++){
for(int j = i + 1; j < list_x.size(); j++){
if(list_x.get(i).equals(list_x.get(j)) && list_y.get(i).equals(list_y.get(j)) && check_food == 0){
check_self = 1;
}
}
}
}

//按键处理
public void keyPressed(KeyEvent arg0) {
if(arg0.getKeyCode()==37 && direction!="right"){
direction = "left";
}
if(arg0.getKeyCode()==38 && direction!="down"){
direction = "up";
}
if(arg0.getKeyCode()==39 && direction!="left"){
direction = "right";
}
if(arg0.getKeyCode()==40 && direction!="up"){
direction = "down";
}
}
public void keyReleased(KeyEvent arg0) {
}
public void keyTyped(KeyEvent arg0) {
}

//双缓冲
public void update(Graphics g){
ImageBuffer = createImage(this.getWidth(), this.getHeight());
GraImage = ImageBuffer.getGraphics();
paint(GraImage);
GraImage.dispose();
g.drawImage(ImageBuffer, 0, 0, this);
}
}


写得不是很详细  有问题微博  @-Mr-湯- 非常乐意为你解答
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息