自学Java的新手,为了熟悉集合类(vector),线程,awt而做的练习。
一共四各类,分别附上代码:
1.GameStart,游戏入口,图形化界面,键盘监听,创建线程
package zcc_2;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class GameStart {
JFrame jf=null;
MyPanel mp=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
GameStart newGame=new GameStart();
}
public GameStart(){
jf=new JFrame();
mp=new MyPanel();
Thread PanelThr=new Thread(mp);
jf.addKeyListener(mp);
PanelThr.start();
mp.setBackground(Color.DARK_GRAY);
jf.add(mp);
jf.setSize(550, 450);
jf.setTitle("贪吃蛇");
jf.setLocation(350, 130);
jf.setResizable(false);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyPanel extends JPanel implements KeyListener,Runnable{
Snake snake=null;
Apple apple=null;
@Override
public void paint(Graphics g){
super.paint(g);
//画苹果
g.setColor(Color.red);
if(apple.getAlive()==true){
g.fillOval(apple.getX(), apple.getY(), snake.snakeBody.get(0).getSize(), snake.snakeBody.get(0).getSize());
}else if(snake.snakeBody.size()>=220176){
System.out.println("胜利!");
return;
}else{
boolean temp=true;
do {
apple = new Apple();
for (int i = 0; i < snake.snakeBody.size(); i++) {
if (apple.getX() == snake.snakeBody.get(i).getX()
&& apple.getY() == snake.snakeBody.get(i).getY()) {
temp = false;
break;
}
}
} while (temp==false);
}
//画蛇
g.setColor(Color.cyan);
for(int i=1;i<snake.snakeBody.size();i++){
g.fill3DRect(snake.snakeBody.get(i).getX(),
snake.snakeBody.get(i).getY(),
snake.snakeBody.get(i).getSize(), snake.snakeBody.get(i).getSize(), false);
}
g.setColor(Color.white);
g.fill3DRect(snake.snakeBody.get(0).getX(),
snake.snakeBody.get(0).getY(),
snake.snakeBody.get(0).getSize(), snake.snakeBody.get(0).getSize(), false);
}
public MyPanel(){
super();
snake=new Snake(12);
apple=new Apple();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_UP){
if(snake.getChaoxiang()!='D') snake.setChaoxiang('U');
}else if(e.getKeyCode()==KeyEvent.VK_DOWN){
if(snake.getChaoxiang()!='U') snake.setChaoxiang('D');
}else if(e.getKeyCode()==KeyEvent.VK_LEFT){
if(snake.getChaoxiang()!='R') snake.setChaoxiang('L');
}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
if(snake.getChaoxiang()!='L') snake.setChaoxiang('R');
}
//System.out.println(apple.getX()+","+apple.getY());
//System.out.println(snake.snakeBody.get(0).getX()+","+snake.snakeBody.get(0).getY());
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//移动
switch(snake.getChaoxiang()){
case 'U':
if (snake.moveUp()==-1) {
return;
}
break;
case 'D':
if (snake.moveDown()==-1) {
return;
}
break;
case 'L':
if (snake.moveLeft()==-1) {
return;
}
break;
case 'R':
if (snake.moveRight()==-1) {
return;
}
break;
}
//判定苹果是否被吃了
if (apple.getAlive()==true
&& apple.getX()== snake.snakeBody.get(01).getX()
&& apple.getY()== snake.snakeBody.get(0).getY()) {
snake.eat();
apple.eaten();
}
//重绘
this.repaint();
}
}
}
2.Body,蛇的每一节
package zcc_2;
public class Body {
int x;
int y;
int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Body(int x,int y){
this.x=x;
this.y=y;
this.size=10;
}
}
3.Snake,蛇
package zcc_2;
import java.util.*;
public class Snake {
Vector<Body> snakeBody=null;
char chaoxiang;
public char getChaoxiang() {
return chaoxiang;
}
public void setChaoxiang(char chaoxiang) {
this.chaoxiang = chaoxiang;
}
public Snake(int lenght){
snakeBody=new Vector<Body>();
for(int i=0;i<lenght;i++){
Body body=new Body(280+i*10,230);
snakeBody.add(body);
}
chaoxiang='L';
}
public int moveUp(){
if(snakeBody.get(0).getY()>0 && this.selfkillJudge()==0){
Body temp=new Body(snakeBody.get(0).getX(),snakeBody.get(0).getY()-snakeBody.get(0).getSize());
snakeBody.remove(snakeBody.size()-1);
snakeBody.add(0, temp);
this.chaoxiang='U';
}else{
System.out.println("Game Over!");
return -1;
}
return 0;
}
public int moveDown(){
if (snakeBody.get(0).getY()<410 && this.selfkillJudge()==0) {
Body temp = new Body(snakeBody.get(0).getX(), snakeBody.get(0)
.getY() + snakeBody.get(0).getSize());
snakeBody.remove(snakeBody.size() - 1);
snakeBody.add(0, temp);
this.chaoxiang = 'D';
}else{
System.out.println("Game Over!");
return -1;
}
return 0;
}
public int moveLeft(){
if (snakeBody.get(0).getX()>0 && this.selfkillJudge()==0) {
Body temp = new Body(snakeBody.get(0).getX()
- snakeBody.get(0).getSize(), snakeBody.get(0).getY());
snakeBody.remove(snakeBody.size() - 1);
snakeBody.add(0, temp);
this.chaoxiang = 'L';
}else{
System.out.println("Game Over!");
return -1;
}
return 0;
}
public int moveRight(){
if (snakeBody.get(0).getX()<530 && this.selfkillJudge()==0) {
Body temp = new Body(snakeBody.get(0).getX()
+ snakeBody.get(0).getSize(), snakeBody.get(0).getY());
snakeBody.remove(snakeBody.size() - 1);
snakeBody.add(0, temp);
this.chaoxiang = 'R';
}else{
System.out.println("Game Over!");
return -1;
}
return 0;
}
public void eat(){
Body newBody=new Body(snakeBody.get(snakeBody.size()-1).getX(),snakeBody.get(snakeBody.size()-1).getY());
snakeBody.add(newBody);
}
public int selfkillJudge(){
for(int i=1;i<this.snakeBody.size();i++){
if(this.snakeBody.get(i).getX()==this.snakeBody.get(0).getX()
&& this.snakeBody.get(i).getY()==this.snakeBody.get(0).getY()){
return 1;
}
}
return 0;
}
}
4.Apple,蛇吃的食物
package zcc_2;
import java.util.*;
public class Apple {
int x;
int y;
boolean alive;
static Random random=new Random();
public Apple(){
this.x=0;
this.y=0;
this.x=Math.abs(random.nextInt()%35+1)*10;
this.y=Math.abs(random.nextInt()%41+1)*10;
this.alive=true;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean getAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
public void eaten(){
this.alive=false;
}
}
为了方便今后可能的代码扩充(虽然我并不打算扩充),这次的代码对所有属性进行了封装。
希望我的代码能对新人有所帮助,欢迎指教。