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

来源:互联网 发布:新手做淘宝店详细步骤 编辑:程序博客网 时间:2024/05/01 06:50



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();


}




}




}

0 0
原创粉丝点击