第一次写博客,有点紧张,哈哈。我是在校大学生,计算机专业,喜欢敲代码·······话不多说,进入正题。
个人对java还是比较感兴趣的,在学余之力,做了一个贪吃蛇小游戏,大家可以参考参考。由于学习java不久,该游戏还做的不是很完整,没有加入一个计分器,在后续有时间一定逐步完善这个小游戏,整合再发,希望大家支持。
package Game;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class game01 extends JFrame{
/**
* @诚哥
* 简单易懂的贪吃蛇
*/
//获得图片
Image wall=GameUtil.getImage("images/墙.png");
Image food=GameUtil.getImage("images/食物2.png");
Image head=GameUtil.getImage("images/head.png");
//这两个坐标为蛇运动的下一个坐标
int X;
int Y;
//该参数为蛇是否死亡
boolean life=true;
//该参数在这里可暂时不用管
boolean flag=true;
//设置两个存储蛇的位置的容器
ArrayList listx=new ArrayList<>();
ArrayList listy=new ArrayList<>();
//因为食物要随机出现,所以这里运用了随机类,以便产生随机数
Random random=new Random();
int foodx=random.nextInt(11);
int foody=random.nextInt(11);
//方向参数,0为上,1为下,2为左,3为右
int direction=1;
//该参数为蛇的长度,初始时为1
int count=1;
int score=0;
//该函数主要运用于画图,即画背景和蛇身、食物
public void paint(Graphics g) {
//画背景和食物
g.drawImage(wall,0,50,null);
g.drawImage(food,foodx*50,(foody+1)*50,null);
if(life) {
if(direction==0) {
//求出蛇要运动的下一个坐标
X=listx.get(0);
Y=listy.get(0)-50;
//画蛇的下一个位置
g.drawImage(head,X,Y,null);
//如果蛇的下一个位置刚好有食物
if(X==foodx*50&&Y==(foody+1)*50) {
/*因为蛇吃到了食物,要增长一节,而前面已经画好了蛇的一节,所以这里只需再画蛇
* 吃到食物之前的全部蛇身即可
*/
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
//蛇身加1
count++;
//吃到食物之后,要再随机产生一个食物
foodx=random.nextInt(11);
foody=random.nextInt(11);
//考虑到如果食物与蛇身重合,则重新产生一个食物
while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
foodx=random.nextInt(11);
foody=random.nextInt(11);
}
//如果蛇的下一个位置没有食物
}else {
/*由于前面已经打印了蛇的下一步,并且这里蛇没有吃到食物,
* 蛇并没有增长,所以这里只需画蛇的前count-1节
*/
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
}
//无论蛇有没有吃到食物,都需要把储存蛇的坐标的集合更新,因为蛇在不断移动
listx.set(0, X);
listy.set(0, Y);
//当蛇向下移动,道理是一样的
}else if(direction==1) {
X=listx.get(0);
Y=listy.get(0)+50;
g.drawImage(head,X,Y,null);
//当下一步有食物
if(X==foodx*50&&Y==(foody+1)*50) {
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
count++;
foodx=random.nextInt(11);
foody=random.nextInt(11);
while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
foodx=random.nextInt(11);
foody=random.nextInt(11);
}
//下一步没有食物
}else {
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
}
listx.set(0, X);
listy.set(0, Y);
//当蛇向左移动
}else if(direction==2) {
X=listx.get(0)-50;
Y=listy.get(0);
g.drawImage(head,X,Y,null);
//下一步有食物
if(X==foodx*50&&Y==(foody+1)*50) {
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
count++;
foodx=random.nextInt(11);
foody=random.nextInt(11);
while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
foodx=random.nextInt(11);
foody=random.nextInt(11);
}
//下一步没有食物
}else {
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
}
listx.set(0, X);
listy.set(0, Y);
//当蛇向右移动时
}else{
X=listx.get(0)+50;
Y=listy.get(0);
g.drawImage(head,X,Y,null);
//下一步有食物
if(X==foodx*50&&Y==(foody+1)*50) {
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
count++;
foodx=random.nextInt(11);
foody=random.nextInt(11);
while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
foodx=random.nextInt(11);
foody=random.nextInt(11);
}
//下一步没有食物
}else {
for(int i=0;i=0;i--) {
listx.set(i+1, listx.get(i));
listy.set(i+1, listy.get(i));
}
}
listx.set(0, X);
listy.set(0, Y);
}
}
//下面四个if判断语句判断游戏是否结束
if(Y==50) {
life=false;
if(flag){
//为了不一直打开对话框,这里设置了一个标志位,只打开一次对话框,下同
flag=false;
JDialog d=new JDialog(this,true);
TextField f=new TextField();
f.setEditable(false);
f.setText("游戏结束");
d.add(f);
d.setLocation(150, 200);
d.setSize(300, 100);
d.setVisible(true);
}
}
if(X==0) {
life=false;
if(flag){
flag=false;
JDialog d=new JDialog(this,true);
TextField f=new TextField();
f.setText("游戏结束");
f.setEditable(false);
d.add(f);
d.setLocation(150, 200);
d.setSize(300, 100);
d.setVisible(true);
}
}
if(Y==600) {
life=false;
if(flag){
flag=false;
JDialog d=new JDialog(this,true);
TextField f=new TextField();
f.setEditable(false);
f.setText("游戏结束");
d.add(f);
d.setLocation(150, 200);
d.setSize(300, 100);
d.setVisible(true);
}
}
if(X==550) {
life=false;
if(flag){
flag=false;
JDialog d=new JDialog(this,true);
TextField f=new TextField();
f.setEditable(false);
f.setText("游戏结束");
d.add(f);
d.setLocation(150, 200);
d.setSize(300, 100);
d.setVisible(true);
}
}
}
//打印界面线程
class PaintThread extends Thread{
public void run() {
while(true) {
repaint();
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//键盘监听器
class KeyThread implements KeyListener{
public void keyTyped(KeyEvent e) {
}
//控制蛇运动的方向
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP) {
if(direction!=1) {
direction=0;
}
}
if(e.getKeyCode()==KeyEvent.VK_DOWN) {
if(direction!=0) {
direction=1;
}
}
if(e.getKeyCode()==KeyEvent.VK_LEFT) {
if(direction!=3){
direction=2;
}
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
if(direction!=2) {
direction=3;
}
}
}
public void keyReleased(KeyEvent e) {
}
}
public void CreatWindows() {
this.setSize(1200, 800);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//初始化蛇身
listx.add(250);
listy.add(200);
/**
*个人在这里觉得键盘监听类似一个线程,就不用增加线程,直接可以使用,JVM虚
*拟机会自动扫描键盘监听器。
*/
this.addKeyListener(new KeyThread());
new PaintThread().start();
}
public static void main(String[] args) {
game01 g1=new game01();
g1.CreatWindows();
}
}