这是本人写的第一个游戏 简单写下过程
开发环境:
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);
}
}