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

毕业设计 贪吃蛇 注释+源代码 我的java学习之路

2015-12-03 18:05 337 查看


package eatSnake;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Insets;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JSpinner;

import javax.swing.JTextField;

import javax.swing.Timer;

public class EatSnake extends JFrame implements ActionListener {

private SnakeJFrame snakeAll;

private JSpinner spinner;

private JButton btnUp,btnDown,btnLeft,btnRight,btnStart,btnInterrupt,btnReStart;

private JTextField textState,textScore;

private String next=null;

public EatSnake() {

super("贪吃蛇");

Dimension dim=getToolkit().getScreenSize();//获得屏幕尺寸

this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置退出

this.setResizable(false);

this.setBounds(dim.width/4, dim.height/4, dim.width/2, dim.height/2);//设置大小尺寸

snakeAll=new SnakeJFrame(500);

MyPanel();

this.getContentPane().add(snakeAll);

this.setVisible(true);

}

private void MyPanel() {

Icon iconUp=new ImageIcon("up.png");//设置上下左右按钮

btnUp=new JButton(iconUp);

btnUp.setBounds(600, 100, 30, 30);

btnUp.addActionListener(this);

this.getContentPane().add(btnUp);

Icon iconLeft=new ImageIcon("left.png");

btnLeft=new JButton(iconLeft);

btnLeft.setBounds(570, 130, 30, 30);

btnLeft.addActionListener(this);

this.getContentPane().add(btnLeft);

Icon iconRight=new ImageIcon("right.png");

btnRight=new JButton(iconRight);

btnRight.setBounds(630, 130, 30, 30);

btnRight.addActionListener(this);

this.getContentPane().add(btnRight);

Icon iconDown=new ImageIcon("down.png");

btnDown=new JButton(iconDown);

btnDown.setBounds(600, 160, 30, 30);

btnDown.addActionListener(this);

this.getContentPane().add(btnDown);

textState=new JTextField("3");//当前状态

textState.setBounds(610, 50, 30, 20);

textState.setEditable(false);

JLabel lb1=new JLabel("长度:");

lb1.setBounds(580, 50, 60, 20);

this.getContentPane().add(lb1);

this.getContentPane().add(textState);

textScore=new JTextField("0");//当前得分

textScore.setBounds(610, 300, 30, 20);

textScore.setEditable(false);

JLabel lb2=new JLabel("得分:");

lb2.setBounds(580, 300, 60, 20);

textState.setForeground(Color.red);

this.getContentPane().add(lb2);

this.getContentPane().add(textScore);

btnStart=new JButton("开始");//开始

btnStart.setMargin(new Insets(0,0,0,0));

btnStart.setBounds(585, 200, 60, 40);

btnStart.addActionListener(this);

this.getContentPane().add(btnStart);

btnInterrupt=new JButton("暂停");//暂停

btnInterrupt.setMargin(new Insets(0,0,0,0));

btnInterrupt.setBounds(585, 250, 60, 40);

btnInterrupt.addActionListener(this);

btnInterrupt.setEnabled(false);//设置没按开始时不能用

this.getContentPane().add(btnInterrupt);

}

public void renewEatSnake(){

this.dispose();//注销当前的对象 ,新建贪吃蛇

new EatSnake();

}

public static void main(String[] args) {

new EatSnake();

}

@Override

public void actionPerformed(ActionEvent e) {

if(e.getSource()==btnUp){

btnUp.setEnabled(true);

btnDown.setEnabled(false);

btnLeft.setEnabled(true);

btnRight.setEnabled(true);

next="up";

snakeAll.setNext(next);

}if(e.getSource()==btnDown){

btnUp.setEnabled(false);

btnDown.setEnabled(true);

btnLeft.setEnabled(true);

btnRight.setEnabled(true);

next="down";

snakeAll.setNext(next);

btnUp.setEnabled(false);

}

if(e.getSource()==btnLeft){

btnUp.setEnabled(true);

btnDown.setEnabled(true);

btnLeft.setEnabled(true);

btnRight.setEnabled(false);

next="left";

snakeAll.setNext(next);

}

if(e.getSource()==btnRight){

btnUp.setEnabled(true);

btnDown.setEnabled(true);

btnLeft.setEnabled(false);

btnRight.setEnabled(true);

next="right";

snakeAll.setNext(next);

}

if(e.getSource()==btnStart){

btnUp.setEnabled(true);

btnDown.setEnabled(true);

btnLeft.setEnabled(true);

btnRight.setEnabled(true);

btnInterrupt.setEnabled(true);

if(btnStart.getText().equalsIgnoreCase("开始")){

snakeAll.timer.start();

btnStart.setText("重新开始");

}

else{//为了让读者更清晰,重新开始时

this.renewEatSnake();

//注销当前的对象 ,新建贪吃蛇

btnStart.setText("开始");

}

if(btnInterrupt.getText().equalsIgnoreCase("暂停")){

snakeAll.timer.restart();

}

}

if(e.getSource()==btnInterrupt){

if(btnInterrupt.getText().equalsIgnoreCase("继续")){

snakeAll.timer.restart();

btnInterrupt.setText("暂停");

}else{

snakeAll.timer.stop();

btnInterrupt.setText("继续");

//JOptionPane.showMessageDialog(this, "暂停");

}

}

}

class SnakeJFrame extends Canvas implements ActionListener{

private Snake snakes[];

Color c=Color.green;//设置初始颜色

Color color[]={Color.GRAY,Color.red,Color.orange,Color.yellow,Color.green,Color.cyan,Color.blue,Color.black};//设置变换的色

Timer timer;//不设置权限,让外面也可以用

private boolean foolPoint=true;//是否添加点

private JDialog dlg;//对话框

private Point p=new Point();

private String next="left";

int k=3,colorNum=0,delay;//k为蛇的长度,delay是速度

public SnakeJFrame(int delay) {

snakes=new Snake[3];

for(int i=0,x=340,y=40;i<snakes.length;i++,x+=10){

snakes[i]=new Snake(x, y);

}

this.delay=delay;

timer=new Timer(delay, this);

}

public void setNext(String next) {

this.next=next;

}

public void restart() {

//timer.stop();

timer.restart();

}

public void paint(Graphics g){

boolean Fiter=true;//设置标签,防止弹出窗口多次

if (foolPoint) {

int x= (int) (Math.random() * 550)/10*10;//随机获取一个点

int y= (int) (Math.random() * this.getHeight())/10*10;//随机获取一个点

p=new Point(x,y);

}

g.setColor(Color.black);

g.drawLine(550, 0, 550, this.getHeight());

g.setColor(Color.red);

g.fillRect(p.x, p.y, 10, 10);

foolPoint=false;

addLentfht();

for(int i=snakes.length-1;i>=0;i--){

if (i!=0) {//绞尽脑汁,在这里耗时3个小时,终于想到了很简单而又蛋疼的办法,倒过来赋值!!!!

snakes[i].x = snakes[i - 1].x;

snakes[i].y = snakes[i - 1].y;//注意:颜色不能进去

}else{

snakes[i]=oldRode(snakes[i], next);//头部为添加的位置

}

if(snakes[i].x>550||snakes[i].x<0||snakes[i].y>getHeight()||snakes[i].y<0&&Fiter==true){

timer.stop();

if(dlg!=null){

dlg.dispose();

}

dlg = new JDialog();//true为模式对话框。默认即不给布尔型参数则为无模式

dlg.setSize(300, 80);

dlg.setModal(true);

dlg.add(new JLabel("游戏结束,请重新开始!"));

dlg.setLocation(this.getWidth()/2+100, this.getHeight()/2+100);

dlg.setVisible(true);

Fiter=false;

}//碰壁游戏结束

g.setColor(c);//画出蛇的长度

if(i==0){

g.setColor(Color.red);

g.fillOval(snakes[i].x, snakes[i].y, 10, 10);

}else{

g.fillRect(snakes[i].x, snakes[i].y, 10, 10);

}

}

for(int i=snakes.length-1;i>=0;i--){//必须放在外面判断,因为是不断更新的

for(int j=snakes.length-2;j>0;j--){

if(snakes[i].x==snakes[j].x&&snakes[i].y==snakes[j].y&&i!=j&&Fiter){

timer.stop();

if(dlg!=null){

dlg.dispose();

}

dlg = new JDialog();//true为模式对话框。默认即不给布尔型参数则为无模式

dlg.setSize(300, 80);

dlg.setModal(true);

dlg.add(new JLabel("游戏结束,请重新开始!"));

dlg.setLocation(this.getWidth()/2+100, this.getHeight()/2+100);

dlg.setVisible(true);

Fiter=false;

break;//注意跳出循环

}

}//自己吃自己游戏结束

}

}

private void addLentfht() {

if(snakes[0].x==p.x&&snakes[0].y==p.y){//动态数据赋值,增加一节

Snake[] temp=new Snake[snakes.length+1];

for(int i=0;i<=temp.length-2;i++){

temp[i]=snakes[i];

}

snakes=null;

snakes=temp;

snakes[snakes.length-1]=new Snake();//不能直接赋值,因为是捆绑;

foolPoint=true;

colorNum++;

c=color[colorNum%color.length];//设置蛇的颜色,每吃一个,就变一种颜色

k++;//蛇的长度+1

if(delay>400){

delay-=50;

}else if(delay>300){

delay-=40;

}else if(delay>200){

delay-=20;

}else if(delay>100){

delay-=10;

}else{

delay-=5;

}

textState.setText(""+k);//蛇的长度

textScore.setText(""+(k-3)*10);//得分

timer.setDelay(delay);//速度

}

}

private Snake oldRode(Snake snakes, String oldnext) {

if(oldnext.equalsIgnoreCase("up")){

snakes.y-=10;

}else if(oldnext.equalsIgnoreCase("down")){

snakes.y+=10;

}else if(oldnext.equalsIgnoreCase("left")){

snakes.x-=10;

}else if(oldnext.equalsIgnoreCase("right")){

snakes.x+=10;

}

return snakes;

}

class Snake{

private int x,y;

public Snake(){

}

public Snake(int x, int y) {

super();

this.x = x;

this.y = y;

}

}

@Override

public void actionPerformed(ActionEvent e) {

repaint();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: