java贪吃蛇游戏代码,写一下贪吃蛇的代码
大家好,今天来为大家分享java贪吃蛇游戏代码的一些知识点,和写一下贪吃蛇的代码的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
哪位能告诉我贪吃蛇游戏的全部代码
//package main;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class TanChiShe implements KeyListener,ActionListener{
/**
*@param args
*/
int max= 300;//蛇长最大值
final int JianJu= 15;//设定蛇的运动网格间距(窗口最大32*28格)
byte fangXiang= 4;//控制蛇的运动方向,初始为右
int time= 500;//蛇的运动间隔时间
int jianTime= 2;//吃一个减少的时间
int x,y;//蛇的运动坐标,按网格来算
int x2,y2;//暂存蛇头的坐标
int jiFenQi= 0;//积分器
boolean isRuned= false;//没运行才可设级别
boolean out= false;//没开始运行?
boolean run= false;//暂停运行
String JiBie="中级";
JFrame f= new JFrame("贪吃蛇 V1.0");
JPanel show= new JPanel();
JLabel Message= new JLabel("级别:中级蛇长:5时间500ms分数:00");
// JButton play= new JButton("开始");
JLabel sheTou;
JLabel shiWu;
JLabel sheWei[]= new JLabel[max];
static int diJi= 4;//第几个下标的蛇尾要被加上
ImageIcon shang= new ImageIcon("tuPian\\isSheTouUp.png");//产生四个上下左右的蛇头图案
ImageIcon xia= new ImageIcon("tuPian\\isSheTouDown.png");
ImageIcon zhuo= new ImageIcon("tuPian\\isSheTouLeft.png");
ImageIcon you= new ImageIcon("tuPian\\isSheTouRight.png");
JMenuBar JMB= new JMenuBar();
JMenu file= new JMenu("开始游戏");
JMenuItem play= new JMenuItem("开始游戏");
JMenuItem pause= new JMenuItem("暂停游戏");
JMenu hard= new JMenu("游戏难度");
JMenuItem gao= new JMenuItem("高级");
JMenuItem zhong= new JMenuItem("中级");
JMenuItem di= new JMenuItem("低级");
JMenu about= new JMenu("关于");
JMenuItem GF= new JMenuItem("※高分榜");
JMenuItem ZZ= new JMenuItem("关于作者");
JMenuItem YX= new JMenuItem("关于游戏");
JMenuItem QK= new JMenuItem("清空记录");
static TanChiShe tcs= new TanChiShe();
public static void main(String[] args){
// TanChiShe tcs= new TanChiShe();
tcs.f();
}
public void f(){
f.setBounds(250,100,515,530);
f.setLayout(null);
f.setAlwaysOnTop(true);//窗口始终保持最前面
f.setBackground(new Color(0,0,0));
f.setDefaultCloseOperation(0);
f.setResizable(false);
f.setVisible(true);
// f.getContentPane().setBackground(Color.BLACK);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);//退出程序
}
});
f.setJMenuBar(JMB);
JMB.add(file);
file.add(play);
file.add(pause);
JMB.add(hard);
hard.add(gao);
hard.add(zhong);
hard.add(di);
JMB.add(about);
about.add(GF);
GF.setForeground(Color.blue);
about.add(ZZ);
about.add(YX);
about.add(QK);
QK.setForeground(Color.red);
f.add(show);
show.setBounds(0,f.getHeight()-92,f.getWidth(),35);
// show.setBackground(Color.green);
// f.add(play);
// play.setBounds(240,240,80,25);
play.addActionListener(this);
pause.addActionListener(this);
gao.addActionListener(this);
zhong.addActionListener(this);
di.addActionListener(this);
GF.addActionListener(this);
ZZ.addActionListener(this);
YX.addActionListener(this);
QK.addActionListener(this);
show.add(Message);
Message.setForeground(Color.blue);
f.addKeyListener(this);
// show.addKeyListener(this);
play.addKeyListener(this);
sheChuShi();
}
public void sheChuShi(){//蛇初始化
sheTou= new JLabel(you);//用向右的图来初始蛇头
f.add(sheTou);
sheTou.setBounds(JianJu*0,JianJu*0,JianJu,JianJu);
// System.out.println("ishere");
shiWu= new JLabel("■");
f.add(shiWu);
shiWu.setBounds(10*JianJu,10*JianJu,JianJu,JianJu);
for(int i=0;i<=diJi;i++){
sheWei[i]= new JLabel("■");
f.add(sheWei[i]);
sheWei[i].setBounds(-1*JianJu,0*JianJu,JianJu,JianJu);
}
while(true){
if(out== true){
yunXing();
break;
}
try{
Thread.sleep(200);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public void sheJiaChang(){//蛇的长度增加
if(diJi< max){
sheWei[++diJi]= new JLabel(new ImageIcon("tuPian\\isSheWei.jpg"));
f.add(sheWei[diJi]);
sheWei[diJi].setBounds(sheWei[diJi-1].getX(),sheWei[diJi-1].getY(),JianJu,JianJu);
// System.out.println("diJi"+diJi);
}
}
public void pengZhuanJianCe(){//检测蛇的碰撞情况
if(sheTou.getX()<0|| sheTou.getY()<0||
sheTou.getX()>f.getWidth()-15|| sheTou.getY()>f.getHeight()-105){
gameOver();
// System.out.println("GameOVER");
}
if(sheTou.getX()== shiWu.getX()&& sheTou.getY()== shiWu.getY()){
out: while(true){
shiWu.setLocation((int)(Math.random()*32)*JianJu,(int)(Math.random()*28)*JianJu);
for(int i=0;i<=diJi;i++){
if(shiWu.getX()!= sheWei[i].getX()&& shiWu.getY()!=sheWei[i].getY()
&& sheTou.getX()!=shiWu.getX()&& sheTou.getY()!= shiWu.getY()){//如果食物不在蛇身上则退出循环,产生食物成功
break out;
}
}
}
sheJiaChang();
// System.out.println("吃了一个");
if(time>100){
time-= jianTime;
}
else{}
Message.setText("级别:"+JiBie+"蛇长:"+(diJi+2)+"时间:"+time+"ms分数:"+(jiFenQi+=10)+"");
}
for(int i=0;i<=diJi;i++){
if(sheTou.getX()== sheWei[i].getX()&& sheTou.getY()== sheWei[i].getY()){
gameOver();
// System.out.println("吃到尾巴了");
}
}
}
public void yunXing(){
while(true){
while(run){
if(fangXiang== 1){//上
y-=1;
}
if(fangXiang== 2){//下
y+=1;
}
if(fangXiang== 3){//左
x-=1;
}
if(fangXiang== 4){//右
x+=1;
}
x2= sheTou.getX();
y2= sheTou.getY();
sheTou.setLocation(x*JianJu,y*JianJu);//设置蛇头的坐标网格数*间隔
for(int i=diJi;i>=0;i--){
if(i==0){
sheWei[i].setLocation(x2,y2);
// System.out.println(i+""+sheTou.getX()+""+sheTou.getY());
}
else{
sheWei[i].setLocation(sheWei[i-1].getX(),sheWei[i-1].getY());
// System.out.println(i+""+sheWei[i].getX()+""+sheWei[i].getY());
}
}
pengZhuanJianCe();
try{
Thread.sleep(time);
}catch(Exception e){
e.printStackTrace();
}
}
Message.setText("级别:"+JiBie+"蛇长:"+(diJi+2)+"时间:"+time+"ms分数:"+(jiFenQi+=10)+"");
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
}
}
public void gameOver(){//游戏结束时处理
int in= JOptionPane.showConfirmDialog(f,"游戏已经结束!\n是否要保存分数","提示",JOptionPane.YES_NO_OPTION);
if(in== JOptionPane.YES_OPTION){
// System.out.println("YES");
String s= JOptionPane.showInputDialog(f,"输入你的名字:");
try{
FileInputStream fis= new FileInputStream("GaoFen.ini");//先把以前的数据读出来加到写的数据前
InputStreamReader isr= new InputStreamReader(fis);
BufferedReader br= new BufferedReader(isr);
String s2,setOut="";
while((s2=br.readLine())!= null){
setOut=setOut+s2+"\n";
}
FileOutputStream fos= new FileOutputStream("GaoFen.ini");//输出到文件流
s= setOut+s+":"+jiFenQi+"\n";
fos.write(s.getBytes());
}catch(Exception e){}
}
System.exit(0);
}
public void keyTyped(KeyEvent arg0){
// TODO自动生成方法存根
}
public void keyPressed(KeyEvent arg0){
// System.out.println(arg0.getSource());
if(arg0.getKeyCode()== KeyEvent.VK_UP){//按上下时方向的值相应改变
if(fangXiang!= 2){
fangXiang= 1;
// sheTou.setIcon(shang);//设置蛇的方向
}
// System.out.println("UP");
}
if(arg0.getKeyCode()== KeyEvent.VK_DOWN){
if(fangXiang!= 1){
fangXiang= 2;
// sheTou.setIcon(xia);
}
// System.out.println("DOWN");
}
if(arg0.getKeyCode()== KeyEvent.VK_LEFT){//按左右时方向的值相应改变
if(fangXiang!= 4){
fangXiang= 3;
// sheTou.setIcon(zhuo);
}
// System.out.println("LEFT");
}
if(arg0.getKeyCode()== KeyEvent.VK_RIGHT){
if(fangXiang!= 3){
fangXiang= 4;
// sheTou.setIcon(you);
}
// System.out.println("RIGHT");
}
}
public void keyReleased(KeyEvent arg0){
// TODO自动生成方法存根
}
public void actionPerformed(ActionEvent arg0){
// TODO自动生成方法存根
JMenuItem JI=(JMenuItem)arg0.getSource();
if(JI== play){
out= true;
run= true;
isRuned= true;
gao.setEnabled(false);
zhong.setEnabled(false);
di.setEnabled(false);
}
if(JI== pause){
run= false;
}
if(isRuned== false){//如果游戏还没运行,才可以设置级别
if(JI== gao){
time= 200;
jianTime= 1;
JiBie="高级";
Message.setText("级别:"+JiBie+"蛇长:"+(diJi+2)+"时间:"+time+"ms分数:"+jiFenQi);
}
if(JI== zhong){
time= 400;
jianTime= 2;
JiBie="中级";
Message.setText("级别:"+JiBie+"蛇长:"+(diJi+2)+"时间:"+time+"ms分数:"+jiFenQi);
}
if(JI== di){
time= 500;
jianTime= 3;
JiBie="低级";
Message.setText("级别:"+JiBie+"蛇长:"+(diJi+2)+"时间:"+time+"ms分数:"+jiFenQi);
}
}
if(JI== GF){
try{
FileInputStream fis= new FileInputStream("GaoFen.ini");
InputStreamReader isr= new InputStreamReader(fis);
BufferedReader br= new BufferedReader(isr);
String s,setOut="";
while((s=br.readLine())!= null){
setOut=setOut+s+"\n";
}
if(setOut.equals("")){
JOptionPane.showMessageDialog(f,"暂无保存记录!","高分榜",JOptionPane.INFORMATION_MESSAGE);
}
else{
JOptionPane.showMessageDialog(f,setOut);
}
}catch(Exception e){
e.printStackTrace();
}
}
if(JI== ZZ){//关于作者
JOptionPane.showMessageDialog(f,"软件作者:申志飞\n地址:四川省绵阳市\nQQ:898513806\nE-mail:shenzhifeiok@126.com","关于作者",JOptionPane.INFORMATION_MESSAGE);
}
if(JI== YX){//关于游戏
JOptionPane.showMessageDialog(f,"贪吃蛇游戏\n游戏版本 V1.0","关于游戏",JOptionPane.INFORMATION_MESSAGE);
}
if(JI== QK){
try{
int select= JOptionPane.showConfirmDialog(f,"确实要清空记录吗?","清空记录",JOptionPane.YES_OPTION);
if(select== JOptionPane.YES_OPTION){
String setOut="";
FileOutputStream fos= new FileOutputStream("GaoFen.ini");//输出到文件流
fos.write(setOut.getBytes());
}
}catch(Exception ex){}
}
}
}
//是我自己写的,本来里面有图片的,但无法上传,所以把图片去掉了,里面的ImageIcon等语句可以去掉。能正常运行。
求贪吃蛇java程序代码(要能运行的,有完整注释的)
三个文件,楼主看好:
运行可以,但是并不能鼓吹是一个具有好的风格的代码,。
//文件一
package greedysnake_cx;
public class Node{
int x=0;
int y=0;
int nodewidth;
int nodeheight;
Node(int x,int y){
this.x=x;
this.y=y;
}
}
//文件二
package greedysnake_cx;
/**
*实现一个greedysnake的模型,具有功能:
* 1)移动,moveOn()----从director参数中获取方向信息,如果方向定义的下一个点的逻辑值是true,检查是不是food,是则将food添加到
*列表的头部,snake继续移动,不是则停止移动(撞到蛇尾巴了)
* 2)加速,speedUp()----将现成的停滞时间间隔interval按照一定的比率 speedRate进行扩大
* 3)减速,speedDown()----....
*
*该类实现Runnable接口,
**/
//定义snake的模型
import java.util.*;
import javax.swing.*;
public class SnakeModel implements Runnable{
private GreedSnake gs;
//给每一个矩阵点确立一个boolean值
boolean[][] matrix;
private int maxX;
private int maxY;
//设置一个节点的列表;
LinkedList nodeArray= new LinkedList();
Node food=null;
int direction=UP;
int score=0;
//定义方向
public final static int LEFT=1;
public final static int UP=2;
public final static int RIGHT=3;
public final static int DOWN=4;
private int interval=200;//停顿时间的间隔
boolean pause=false;//定义暂停
private double speedRate=0.5;//定义速度的变更幅度
//constructor
public SnakeModel(GreedSnake gs,int maxx,int maxy){
this.gs=gs;
this.maxX=maxx;
this.maxY=maxy;
//this.matrix=null;
////////////////////////////////////////////////////////////////////
//init matrix[][];
matrix=new boolean[maxX][];//***********************不初始化是不行滴
for(int i=0;i<maxX;i++){
matrix[i]=new boolean[maxY];//将矩阵的每一行定义成列的集合
Arrays.fill(matrix[i], false);///使用java.util.Arrays的static方法fill,将matrix[]数组里面的元素全部定义成false
//至此,矩阵里面所有的点的boolean值都是flase
//for(int j=0;j<maxY;j++){
//matrix[i][j]=false;
//}
}
////////////////////////////////////////////////////////////////////
//init nodeArray
int initlength=10;
for(int i=0;i<initlength;i++){
//确保snake出现在屏幕的中央 assure that the greedy snake appears in the center of the model
//snake的长度由maxX来确定
int x=maxX/2+i;
int y=maxY/2;
nodeArray.addFirst(new Node(x,y));
matrix[x][y]=true;
}
//////////////////////////////////////////////////////////////////////
//创建食物
food=createFood();
System.out.println("some test!");
matrix[food.x][food.y]=true;
}//end constructor
//snake动起
public boolean moveOn(){
Node head=(Node)nodeArray.getFirst();
int x=head.x;
int y=head.y;
switch(direction){
case LEFT:
x--;break;
case UP:
y--;break;
case RIGHT:
x++;break;
case DOWN:
y++;break;
default:
}
if((x>= 0&& x< maxX)&&(y>= 0&& y< maxY)){
if(matrix[x][y]){//当蛇头转至一个bool值为true的点时
if(x==food.x&&y==food.y){//该点是食物
nodeArray.addFirst(food);
//吃掉补上
food=createFood();
matrix[food.x][food.y]=true;
score+=10;
return true;
}
else//该点不是食物,(蛇尾巴)
return false;
}
else{
nodeArray.addFirst(new Node(x,y));
matrix[x][y]=true;
Node nn=(Node)nodeArray.removeLast();//移除并且返回列表中的最后一个元素
matrix[nn.x][nn.y]=false;
return true;
}
}
return false;
}//end moveOn
public void run(){
boolean running=true;
while(running){
try{
Thread.sleep(interval);
}
catch(InterruptedException e){
e.printStackTrace();
}
if(!pause){
if(moveOn()){
gs.repaint();
}
else{
JOptionPane.showMessageDialog(null,"sorry myboy,GAME OVER!","message", JOptionPane.INFORMATION_MESSAGE);
running=false;
}
}
}
/*boolean running=true;
while(running){
try{
Thread.sleep(interval);
}
catch(InterruptedException e){
e.printStackTrace();
}
if(!pause){
if(moveOn()){
gs.repaint();
}
else{
JOptionPane.showMessageDialog(null,"i am sorry,you failed!","message",JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}//end while
running=false;//当且仅当失败退出的时候;
*/
}
//获取当前游戏得分
public int getScore(){
return this.score;
}
//加速
public void speedUp(){
interval*=speedRate;
}
//减速
public void speedDown(){
interval/=speedRate;
}
//设置暂停
public void chagePause(){
pause=!pause;
}
//设置方向
public void chageDirection(int newdirection){
if(direction% 2!= newdirection% 2){
direction=newdirection;
}
}
//生成食物
private Node createFood(){
/*
*创建一个随机数的生成器,这个是java.util.Random类
*与java.lang.Math类中的random()方法有不一样的地方,彼方法返回一个0-1之间的随机数
**/
Random random=new Random();
int foodx=random.nextInt(maxX);
int foody=random.nextInt(maxY);
Node food=new Node(foodx,foody);
return food;
}
}
//文件三
package greedysnake_cx;
/**
*在repaint()方法中,绘画上下文对象是从canvas对象使用getContentPane()获取的!!
**/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class GreedSnake implements KeyListener{
Canvas canvas;
private JLabel jlabel;
private JPanel jpanel;
private JFrame jframe;
SnakeModel snakemodel;
private final static int canvaswidth=400;
private final static int canvasheight=300;
private final static int nodewidth=10;
private final static int nodeheight=10;
//construction
GreedSnake(){
jframe=new JFrame("The Greed Sanke!");
jframe.setLayout(new BorderLayout());
Container cp=jframe.getContentPane();
//在jframe面板中添加各种组件
jlabel=new JLabel("welcome");
jlabel.setText("Welcome my friend! Enjoy your self!");
cp.add(jlabel,BorderLayout.NORTH);
canvas=new Canvas();
canvas.setSize(canvaswidth,canvasheight);
canvas.addKeyListener(this);//给空白面板添加键盘时间监听器!
cp.add(canvas,BorderLayout.CENTER);
jpanel=new JPanel();
jpanel.setLayout(new BorderLayout());
JLabel label=new JLabel("Pass enter or'r' or's' to start",JLabel.CENTER);
jpanel.add(label,BorderLayout.NORTH);
JLabel label2=new JLabel("Pass space to pause this game!",JLabel.CENTER);
jpanel.add(label2,BorderLayout.CENTER);
JLabel label3=new JLabel("Pass pageUp or pageDown to up or down the speed of the snake!",JLabel.CENTER);
jpanel.add(label3,BorderLayout.SOUTH);
cp.add(jpanel,BorderLayout.SOUTH);
//给顶层容器设置时间监听、可视化、关闭按钮的设定
jframe.addKeyListener(this);
jframe.pack();
jframe.setVisible(true);
jframe.setResizable(false);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
begin();
}//end construction
public void begin(){
//开启一个SnakeModel的进程,并且开始改进程
snakemodel=new SnakeModel(this,canvaswidth/nodewidth,canvasheight/nodeheight);
(new Thread(snakemodel)).start();
}
void repaint(){
int score=snakemodel.getScore();
jlabel.setText("您的得分是:"+score);
Graphics g=canvas.getGraphics();///pay attention!
g.setColor(Color.white);
g.fillRect(0, 0, canvaswidth, canvasheight);
g.setColor(Color.blue);
LinkedList list=snakemodel.nodeArray;
for(int i=0;i<list.size();i++){
Node nn=(Node)list.get(i);
paintingNode(g,nn);
}
//绘制food
g.setColor(Color.green);
Node foodnode=new Node(snakemodel.food.x,snakemodel.food.y);
paintingNode(g,foodnode);
}
public void paintingNode(Graphics gg,Node n){
/*
*使用Graphics的fillRect方法,填充一个矩形,
*矩形的起点需要乘以一个NODE的长宽,以避免重叠
**/
gg.fillRect(n.x*nodewidth, n.y*nodeheight,nodewidth-1,nodeheight-1);
}
public void keyPressed(KeyEvent e){//按下某一个键时,调用此方法
int keycode=e.getKeyCode();
/* if(keycode==KeyEvent.VK_ENTER||keycode==KeyEvent.VK_R){
begin();
}*/
switch(keycode){
case KeyEvent.VK_LEFT:
snakemodel.chageDirection(SnakeModel.LEFT);
break;
case KeyEvent.VK_UP:
snakemodel.chageDirection(SnakeModel.UP);
break;
case KeyEvent.VK_RIGHT:
snakemodel.chageDirection(SnakeModel.RIGHT);
break;
case KeyEvent.VK_DOWN:
snakemodel.chageDirection(SnakeModel.DOWN);
break;
case KeyEvent.VK_PAGE_DOWN:
snakemodel.speedDown();
break;
case KeyEvent.VK_PAGE_UP:
snakemodel.speedUp();
break;
case KeyEvent.VK_ENTER:
case KeyEvent.VK_R:
begin();
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
snakemodel.chagePause();
default:
}//end switch
}//end keyPressed
public void keyReleased(KeyEvent e){//释放某一个键时,调用此方法
}
public void keyTyped(KeyEvent e){//键入某一个键时,调用此方法!
}
//main
public static void main(String[] args){
GreedSnake gs=new GreedSnake();
}
}
如何用java实现一个贪吃蛇小游戏
1、设计游戏,首先就要设计界面。首先看一下我设计的一个界面。界面分为左边的游戏区与右边的控制区。游戏区包含“得分信息”和贪吃蛇的游戏区,右边控制区有“开始”“暂停”“停止”按钮,等级选择单选框以及游戏排行榜。
2、所以我们需要定义swing组件,并在类初始化时初始化这些组件,添加组件。因为后面设计游戏的时候,我们要确切知道游戏区的大小,所以这里设置游戏区固定大小值。本来想用布局来更好的管理,但作者对布局也掌握不够,所以就先设置固定大小吧。
3、定义我们的游戏。贪吃蛇游戏其实就是包含很多细小网格,然后蛇在网格中移动。蛇由一连串的网格组成,为了视觉效果,蛇身用蓝色标记,食物用红色标记,背景白色。如第一张图片所示。所以,我们需要定义二维数组,保存网格信息,保存蛇身和食物的位置信息等。初始化时,还需要添加键盘事件控制上下左右移动。
4、食物的位置信息是二维的,所以我简单定义了一个类用来保存二维信息。
5、接着就是实现游戏的功能了。开始,暂停,停止按钮添加事件控制游戏开始。等级按钮定义游戏难度等。
6、开始游戏后,我们定义一个定时器。蛇身按照指定的方向移动,方向是通过初始化时添加的键盘事件,键盘的上下左右按钮来控制。蛇身是连续的位置信息,保存到队列中,所以蛇身的移动就是队首增加一个位置,队尾减少位置,然后重新绘画游戏区就可以了。
关于java贪吃蛇游戏代码到此分享完毕,希望能帮助到您。