JAVA版贪吃蛇小游戏
生活随笔
收集整理的這篇文章主要介紹了
JAVA版贪吃蛇小游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這是一篇關于JAVA的貪吃蛇游戲,源代碼的部分在下面正文中介紹,圖片和音頻的部分都放在百度云盤,需要的自行下載。
文章目錄
- 開發環境
- 一、下載方法
- 二、運行效果展示
- 三、項目結構以及主程序入口
- 1.項目結構
- 2.主程序入口
- 四、代碼部分
- 1.代碼如下
- 總結
開發環境
開發工具:eclipse2021-12
JDK版本:JDK15.0.1
一、下載方法
百度云盤
鏈接:https://pan.baidu.com/s/1P9bwYgXkoRVaKdOOuWvUng
提取碼:fcfj
編碼格式:GBK
二、運行效果展示
運行代碼以后,進入登錄頁面,點擊“進入游戲”。
進入游戲的畫面。此時小蛇還沒有移動。
游戲運行時的畫面
游戲運行時:
點擊屏幕上方區域,小蛇轉向上方
點擊屏幕下方區域,小蛇轉向下方
點擊屏幕左方區域,小蛇轉向左方
點擊屏幕右方區域,小蛇轉向右方
三、項目結構以及主程序入口
1.項目結構
2.主程序入口
入口程序在Start.java類中。
四、代碼部分
1.代碼如下
代碼如下(示例):
Start.java類
SnakeNode.java類
package snakeGame; /** 定義一個類,用來描述貪吃蛇游戲中的蛇,蛇身上的每一個點,通過建立snakeNode的對象,指定不同的X軸和Y軸的值,就能組成一個蛇身。* 同時可以獲得蛇身上的x和y點坐標,和顏色*/ import java.awt.Color;public class SnakeNode { //定義蛇身集合中的各個元素點,x,y。以及顏色三個蛇的關鍵組成private int x;private int y;private Color color;public int setX=20;public int setY=20;public SnakeNode() {super();}public SnakeNode(int x, int y, Color color) {super();this.x = x;this.y = y;this.color = color;}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 Color getColor() {return color;}public void setColor(Color color) {this.color = color;} }SnakeGame.java類
package snakeGame;/** SnakeGame類來設計貪吃蛇小游戲的運行界面,運行界面是貪吃蛇游戲的主體部分, 界面主要包括兩個方面的內容,* 一方面是運行界面的內容,貪吃蛇長度顯示,游戲說明,速度控制,游戲開始,暫停退出等按鈕。* 另一方面,主要包括貪吃蛇的形狀和移動,貪吃蛇移動區域,隨機點的定義* 運行界面的過程是這樣的:在開始姐愛你點擊進入游戲按鈕以后,程序運行到運行界面,開始播放背景音樂。* 點擊游戲說明按鈕,彈出一個對話框,說明游戲運行的操作過程。點擊開始按鈕以后,* 貪吃蛇開始向上移動,鼠標在向上區域點擊,貪吃蛇向上,向左區域點擊,貪吃蛇向左,依次賴推。* 當貪吃蛇碰到草莓時,吃掉它,蛇身變長,并有背景音樂顯示,長度顯示加一,* 點擊暫停按鈕游戲暫停,點擊退出按鈕后,退出游戲。* 當貪吃蛇撞到自己或者墻體的時候,貪吃蛇會死亡,然后彈出一個界面,重啟界面,用來決定游戲繼續進行或者退出游戲。* 貪吃蛇的形狀和移動通過數組的形式實現,在界面中,定義一個x軸和y軸定義的坐標系,定義一個數組,數組的移動就是貪吃蛇的移動,* 移動方式是貪吃蛇坐標的改變,可以通過鼠標控制或鍵盤控制來實現貪吃蛇的移動,* 隨機點產生是在坐標系中產生隨機數來實現,*/ import java.applet.AudioClip; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Random;import javax.swing.JApplet; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.Timer;public class SnakeGame extends JPanel implements ActionListener { private final int length = 15;//定義活動范圍private final int width = 25;//定義活動范圍private final int unit = 45;//定義單位長度private final int GameLOCX=40;private final int GameLOCY=40;private final int GameWidth=width*unit;private final int GameLength=length*unit;//隨機點坐標 int newY1 =0 ; int newX1 = 0 ; int mousex=1;int mousey=1;//播放背景音樂AudioClip christmas = loadSound("src/Music/backgroundMusic.wav");int direction = 1;//定義一個按下按鈕后要去的方向 private ArrayList<SnakeNode> snake = new ArrayList<SnakeNode>();//定義蛇身的數組集合private int Direction;//定義蛇頭的方向private int Length ;//定義蛇身的長度private SnakeNode newNode = new SnakeNode(1,1,Color.BLACK);//定義隨機點boolean startFlag =false;//定義按鈕,速度控制,開始暫停退出按鈕等RButton SspeedButton , TspeedButton,FspeedButton,THspeedButton ,ShowButton; RButton startButton , stopButton , quitButton ,reStartButton,closeButton;//定義標簽,長度顯示,方向顯示,按鈕提示等 JLabel snakeScore, label1, label3,label4;//初始速度控制private static int Difficult_Degree=1;//蛇的移動控制,利用線程來實現用鼠標控制,利用計時器來實現用鍵盤控制。Thread tr= new Thread(new ThingsListener());Timer time = new Timer(1000, new ThingsListener1());//定義一個定時器對象,這里我們還要創建一個ThingsListener事件public SnakeGame() {//初始化區域//循環播放背景音樂christmas.loop ();// time.start(); tr.start(); //定義按鍵//在容器中添加按鈕標簽等的時候,需要說明布局管理為空,不然的話,加進去的按鈕會按照一定的布局來實現,this.setLayout (null);//定義按鈕startButton = new RButton("開始游戲"); stopButton =new RButton("暫停游戲");quitButton =new RButton("退出游戲");FspeedButton =new RButton("速度一"); SspeedButton =new RButton("速度二");TspeedButton=new RButton("速度三");THspeedButton=new RButton("速度四"); ShowButton =new RButton("游戲指南");//定義標簽snakeScore =new JLabel("3");label1 =new JLabel("當前長度");label3 =new JLabel("速度設置");label4 =new JLabel( );//設置字體startButton.setFont(new Font("華文行楷", Font.BOLD, 35));stopButton.setFont(new Font("華文行楷", Font.BOLD, 35));quitButton.setFont(new Font("華文行楷", Font.BOLD, 35));FspeedButton.setFont(new Font("華文行楷", Font.BOLD, 15));TspeedButton.setFont(new Font("華文行楷", Font.BOLD, 15));SspeedButton.setFont(new Font("華文行楷", Font.BOLD, 15));THspeedButton.setFont(new Font("華文行楷", Font.BOLD, 15));ShowButton.setFont(new Font("華文行楷", Font.BOLD, 30));label1.setFont(new Font("華文行楷", Font.BOLD, 35));snakeScore.setFont(new Font("華文行楷", Font.BOLD, 50));label3.setFont(new Font("華文行楷", Font.BOLD, 30));label4.setFont(new Font("華文行楷", Font.BOLD, 35));//定義按鈕標簽位置startButton.setBounds (1390, 500 , 190, 90);stopButton.setBounds (1390, 600 , 190, 90);quitButton.setBounds (1390, 700 , 190, 90);snakeScore.setBounds(1450, 70, 150, 90);label1.setBounds(1390, 10, 190, 90);ShowButton.setBounds(1390, 170, 190, 90);label3.setBounds(1390, 270, 190, 90);label4.setBounds(0, 0, 190, 90);FspeedButton.setBounds (1390, 350 , 85, 60);SspeedButton.setBounds (1500,350 , 85, 60);TspeedButton.setBounds (1390, 420 , 85, 60);THspeedButton.setBounds (1500, 420 , 85, 60);THspeedButton.setBackground(Color.green);SspeedButton.setBackground(Color.blue);TspeedButton.setBackground(Color.red);FspeedButton.setBackground(Color.red);// 添加 按鈕和標簽,用this關鍵字指向當前容器this.add(startButton);this.add(stopButton);this.add(quitButton);this.add(FspeedButton);this.add(SspeedButton);this.add(TspeedButton);this.add(THspeedButton);this.add(label1);this.add(snakeScore); this.add( ShowButton);this.add(label3);this.add(label4);// 添加三個按鍵的監聽事件startButton.addActionListener(this);stopButton.addActionListener(this);quitButton.addActionListener(this);THspeedButton.addActionListener(this);SspeedButton.addActionListener(this);TspeedButton.addActionListener(this);FspeedButton.addActionListener(this);ShowButton.addActionListener(this);snake.add(new SnakeNode(width/2,length/2 ,Color.red));snake.add(new SnakeNode(width/2,length/2+1 ,Color.blue));snake.add(new SnakeNode(width/2,length/2+2 ,Color.green));Direction = 1;//定義初始方向為向上Length = 3;//蛇身長度為3CreateNode1();//產生隨機點// CreateNode2();/*//采用鍵盤控制的控制模式,利用鍵盤的上下左右鍵,來實現讓·direction的變化,從而使貪吃蛇能夠按照鍵盤的控制來實現移動this.addKeyListener(new KeyAdapter() {//捕捉鍵盤的按鍵事件 設置監聽器public void keyPressed(KeyEvent e) {switch(e.getKeyCode()) {case KeyEvent.VK_UP://按下向上,返回1direction = 1;break;case KeyEvent.VK_DOWN://按下向下,返回-1direction = -1;break;case KeyEvent.VK_LEFT://按下相左,返回2direction = 2;break;case KeyEvent.VK_RIGHT://按下向右,返回-2direction = -2;break;default:break;}if(direction + Direction !=0) {//不能反向運動Direction = direction;Move(direction);repaint();}}});*///采用 鼠標控制的控制模式 通過監聽鼠標在容器中的位置,點擊上下左右區域,改變direction的值,即可實現貪吃蛇的移動,this.addMouseListener(new MouseAdapter(){ //匿名內部類,鼠標事件public void mousePressed(MouseEvent e){ int a=0;//鼠標完成點擊事件//e.getButton就會返回點鼠標的那個鍵,左鍵還是右健,3代表右鍵mousex = e.getX(); //得到鼠標x坐標mousey = e.getY(); //得到鼠標y坐標double k=0.6; //直線斜率double Y1=0.6*mousex;double Y2=-0.6*mousex+810;double X1=1.6*mousey;double X2=-1.6*mousey+1350;if(mousex > X1&&mousex<X2&&mousey>0&&mousey<405) { //第一象限 向上label4.setText( "向上" );a=1; }if(mousex>X2&&mousex<X1&&mousey>405&&mousey<810) { // 第二象限 向下label4.setText( " 向下" );a=2;}if(mousex>0&&mousex<675&&mousey>Y1&&mousey<Y2) { //第三象限 向左label4.setText( " 向左" );a=3;} if(mousex>675&&mousex<1350&&mousey>Y2&&mousey<Y1) { //第四象限 向右label4.setText( " 向右" );a=4;} switch( a) {case 1://按下向上,返回1direction = 1;break;case 2://按下向下,返回-1direction = -1;break;case 3://按下相左,返回2direction = 2;break;case 4://按下向右,返回-2direction = -2;break;default:break;}if(direction + Direction !=0) {//不能反向運動Direction = direction;Move(direction);repaint();}}}); } /*定義蛇移動的方法 * 貪吃蛇的移動方法主要包括方向控制,碰到隨機點,碰到自己,碰到邊界以及設計貪吃蛇從前向后的移動* */public void Move(int direction) { int FirstX = snake.get(0).getX(); //獲取蛇第一個點的橫坐標int FirstY = snake.get(0).getY(); //獲取蛇第一個點的縱坐標 if(!startFlag) return ; //方向控制switch(direction) {case 1:FirstY--;break;case -1:FirstY++;break;case 2: FirstX--;break;case -2:FirstX++;break;default:break;}//當碰到隨機點時if(FirstX == newNode.getX()&&FirstY == newNode.getY()) { new eatFoodMusic();getNode();return;}//當碰到蛇身自己時for(int x = 0; x < Length; x++) { if((FirstX==snake.get(x).getX())&&(FirstY == snake.get(x).getY())) {startFlag=false;new DeadMusic();new Restart(); christmas.stop ();}}//當貪吃蛇撞到邊界if(FirstX < 1 || FirstX >29 || FirstY < 1 || FirstY >18) { startFlag=false;new DeadMusic();new Restart();christmas.stop ();// new Test();} //定義循環,使得貪吃蛇從前向后移動for(int x = Length - 1; x > 0; x--) {snake.get(x).setX(snake.get(x-1).getX());snake.get(x).setY(snake.get(x-1).getY());}snake.get(0).setX(FirstX);snake.get(0).setY(FirstY);repaint();} //獲取隨機點public void getNode() { snake.add(new SnakeNode());Length++;for(int x = Length-1; x >0; x--) {snake.get(x).setX(snake.get(x-1).getX());snake.get(x).setY(snake.get(x-1).getY());snake.get(x).setColor(snake.get(x-1).getColor());}snakeScore.setText( ""+( Length )); //定義蛇的長度snake.get(0).setX(newNode.getX());snake.get(0).setY(newNode.getY());snake.get(0).setColor(newNode.getColor());CreateNode1();//產生隨機點// CreateNode2();repaint();//當長度超過10的時候,產生鼓掌聲if(Length==10) {new applauseMusic();}}public void CreateNode1() { //創造隨機點的方法 Boolean flag = true;while(flag) {newY1 = new Random().nextInt(15)+1; newX1= new Random().nextInt(25)+1; for(int x = 0; x < Length; x++) {if(snake.get(x).getX() == newX1 && snake.get(x).getY() == newY1) {flag = true;break;}flag = false; }//隨機點不能超出面板,并且不能出現在蛇身上for(int i = 0; i < Length; i++) {if(snake.get(i).getX()> 5&& snake.get(i).getX()<newX1 &&snake.get(i).getY() > 5&& snake.get(i).getY()<newY1) { flag = true;break;}flag= false;}}Color color = new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255));newNode.setColor(color);newNode.setX(newX1); newNode.setY(newY1); }/** 這里是自己新建一個事件處理,每隔Timer的時間間隔,就開始移動Directon的位置,* 由因為Direction的位置是構造方法中定義好的,所以就會自動地移動方向。而每當玩家使用鍵盤時,Direction的值變化,之后每次自動移動的方向也隨之變化。* * *///定義內部類,貪吃蛇不斷移動public class ThingsListener1 implements ActionListener {public void actionPerformed(ActionEvent e) {Move(direction);}}// public AudioClip loadSound ( String filename ){URL url = null;try{url = new URL ("file:" + filename);}catch (MalformedURLException e){}return JApplet.newAudioClip (url);}/** 當startflag為真的時候,貪吃蛇在線程時間的脈沖下繼續移動,這個過程包含在if語句塊中,當程序啟動時,每隔1.2s就有一個響應, *上一個方法采用Timer, Timer的構造方法是Timer(int delay, ActionListner listener)通俗的說就是創建一個每 delay秒觸發一次動作的計時器,* 每隔特定的時間就會觸發特定的事件。可以使用start方法啟動計時器。* 優點在于形式簡單,缺點在于當采用速度控制的時候不易控制,而同樣作為時間觸發作用的線程控制可以實現這個目的,即通過控制時間來控制貪吃蛇的移動速度* 之所以之前的設計有錯誤,在于while后面沒有用if進行startflag的檢驗,即startflag只有在真的條件下才可以移動,時間脈沖觸發下才可以移動。* * *///定義線程類,使得貪吃蛇能夠在線程的控制下不斷移動class ThingsListener implements Runnable {@Overridepublic void run() {// TODO 自動生成的方法存根while( true) {if(startFlag) { Move(Direction);repaint();}try { Thread.sleep(1200/Difficult_Degree);}catch(InterruptedException e){e.printStackTrace();}} }//設置一個監聽器事件,用來控制蛇的不斷移動 }//定義圖像類,畫出貪吃蛇移動的運行界面,如貪吃蛇的形狀,背景圖片,蛇頭蛇尾等 //描述蛇函數的主體形狀,隨機點的形狀和蛇的形狀 protected void paintComponent(Graphics g) {super.paintComponent(g);//加背景Image im=Toolkit.getDefaultToolkit().getImage("src/image/background1.jpg");g.drawImage(im, 0, 0, this.getWidth(), this.getHeight(), this);//畫出蛇頭if(direction ==1||Direction==1){ Toolkit toolup = this.getToolkit();Image headup = toolup.getImage( "src/image/up.png");g.drawImage(headup,snake.get(0).getX()*unit, snake.get(0).getY()*unit, unit, unit,this); }else if(direction ==-1){Toolkit tooldown = this.getToolkit();Image headdown = tooldown.getImage( "src/image/down.png");g.drawImage(headdown,snake.get(0).getX()*unit, snake.get(0).getY()*unit, unit, unit,this);}else if(direction ==2){Toolkit toolleft = this.getToolkit();Image headleft = toolleft.getImage( "src/image/left.png");g.drawImage(headleft,snake.get(0).getX()*unit, snake.get(0).getY()*unit, unit, unit,this); }else if(direction ==-2){ Toolkit toolright = this.getToolkit();Image headright = toolright.getImage( "src/image/right.png");g.drawImage(headright,snake.get(0).getX()*unit, snake.get(0).getY()*unit, unit, unit,this);} //畫出食物的形狀 Toolkit tool1 = this.getToolkit();Image food= tool1.getImage( "src/image/food.png");g.drawImage(food,newNode.getX()*unit, newNode.getY()*unit, unit, unit,this); Toolkit tool2 = this.getToolkit();Image food1= tool2.getImage( "src/image/food.png");g.drawImage(food1,newNode.getX()*unit, newNode.getY()*unit, unit, unit,this); //繪制指定矩形的邊框。矩形的左邊和右邊位于 x 和 x + width。頂邊和底邊位于 y 和 y + height。使用圖形上下文的當前顏色繪制該矩形。g.drawRect(40, 30, 1350, 810 ); for(int x = 1; x < Length-1; x++) { //利用循環,來繪制蛇的形狀g.setColor(snake.get(x).getColor());g.fillOval(snake.get(x).getX()*unit, snake.get(x).getY()*unit, unit, unit); //給蛇的每一個節點畫橢圓 } for(int x = Length-1; x < Length; x++) { Toolkit toolright = this.getToolkit();Image headright = toolright.getImage( "src/image/body.png");g.drawImage(headright,snake.get(x).getX()*unit, snake.get(x).getY()*unit, unit,unit,this);//利用循環,來繪制蛇的形狀 }} //設置按鈕的監聽器事件@Overridepublic void actionPerformed(ActionEvent e) {// TODO 自動生成的方法存根//按開始鍵if(e.getSource() == startButton) {new pushButtonMusic ();startFlag = true;startButton.setEnabled(false);stopButton.setEnabled(true); }//按暫停鍵if(e.getSource() == stopButton) {new pushButtonMusic ();startFlag = false;startButton.setEnabled(true);stopButton.setEnabled(false); }// 退出程序if(e.getSource() == quitButton) {System.exit(0);}//按游戲指南建if(e.getSource() == ShowButton) {new pushButtonMusic ();JDialog frame = new JDialog();//構造一個新的JFrame,作為新窗口。frame.setBounds( 600,300,815,515 ); JTextArea Myarea=new JTextArea(3,10);Myarea.setText("嗨,你好,歡迎體驗貪吃蛇小游戲!\n "+"這個小游戲點擊開始按鈕后貪吃蛇開始移動,你身體的前后左右移動\n"+"會使貪吃蛇也前后左右移動。\n"+ "你的任務是通過控制蛇的移動來吃掉小草莓,這樣貪吃蛇就長大了。\n"+"點擊暫停游戲按鈕可以使得貪吃蛇停止移動,"+"點擊退出游戲按鈕自然游\n"+"戲就結束啦!\n"+ "點擊速度一,速度二等按鈕就可以控制貪吃蛇的移動速度,以提高\n"+"康復效率!\n"+"此游戲素材部分來源于網絡,如果有侵犯到您的利益 \n"+"請立刻聯系我們,任何單位或個人不準用于商業用途。"); frame.setLayout(null); Myarea.setBounds( 10,10,815,350); Myarea.setFont(new Font("華文行楷",Font.BOLD,25)); frame.add(Myarea); frame.setModalityType(JDialog.ModalityType.APPLICATION_MODAL); // 設置模式類型。frame.setVisible(true); }//按速度一鍵if(e.getSource() == FspeedButton) {new speedButtonMusic ();Difficult_Degree= 2; }//按速度二鍵if(e.getSource() == SspeedButton) {new speedButtonMusic ();Difficult_Degree= 3; }//按速度三鍵if(e.getSource() == TspeedButton) {new speedButtonMusic ();Difficult_Degree= 4; }//按速度四鍵if(e.getSource() == THspeedButton) {new speedButtonMusic ();Difficult_Degree= 5; }this.requestFocus();}}Restart.java類
package snakeGame; /** ReStart類的功能和start相類似,設計程序運行后的界面,包括程序重啟界面和游戲運行界面。運行界面和start類運行的一樣,* 重啟界面包括包括兩個按鈕和一個背景圖片,點擊重啟游戲按鈕游戲進入運行界面,點擊退出按鈕后結束游戲。*/import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel;class Restart extends JFrame implements ActionListener{public static void main(String [] args) {new Restart(); }JFrame frame2=new JFrame(); JButton reStartButton=new JButton("重新開始");JButton closeButton =new JButton("結束游戲");//定義界面按鈕等內容。 public Restart() {frame2.setUndecorated(true); //用于取消邊框背景 frame2.setSize(800,480);frame2.setLocation(600,300);//frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame2.setVisible(true);frame2.setLayout(null); //設置按鈕顏色Color color2=new Color(124,252,0);reStartButton.setBackground(color2); Color color1 = new Color(124,252,0 );closeButton.setBackground(color1 );//設置按鈕大小和位置 reStartButton.setBounds(140, 364, 120, 110);closeButton.setBounds(280,270,120,110);//設置按鈕顏色和字體reStartButton.setFont(new Font("華文行楷", Font.BOLD, 20));closeButton.setFont(new Font("華文行楷", Font.BOLD, 20));//在容器中加入按鈕frame2.add(reStartButton);frame2.add(closeButton);addPicture();reStartButton.addActionListener(this);closeButton.addActionListener(this);}//設置背景圖片public void addPicture() { //游戲結束時彈出的界面的背景ImageIcon deadPicture = new ImageIcon("src/image/restartPicture.jpg");JLabel pictureLabel =new JLabel(deadPicture);pictureLabel.setBounds(0, 0,deadPicture.getIconWidth(), deadPicture.getIconHeight());frame2.getLayeredPane().add(pictureLabel,new Integer(Integer.MIN_VALUE));JPanel jp1=(JPanel)frame2.getContentPane();jp1.setOpaque(false);}//按鈕加入監聽器事件@Overridepublic void actionPerformed(ActionEvent e) {// TODO 自動生成的方法存根if(e.getSource()==reStartButton) {closeThis();new Frame3(); } if(e.getSource()==closeButton) {System.exit(0);} }private void closeThis() {// TODO 自動生成的方法存根frame2.dispose();}// 游戲運行界面,實例化SnakeGame類,并加入到運行界面中 class Frame3 extends JFrame { JFrame frame1 = new JFrame(); //游戲圖形界面 public Frame3(){ frame1.setUndecorated(true); //用于取消邊框背景frame1.setBounds(200,70,1600,900); /// frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame1.setVisible(true); SnakeGame sn =new SnakeGame(); frame1.add(sn);sn.requestFocus();//布局的中間 } } }RButton.java類
package snakeGame; /*在Java swing中的button無法設置圓角按鈕,為了一定程度上完善游戲界面,故而設置了圓角按鈕。* 定義圓角按鈕;*/ import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.RoundRectangle2D;import javax.swing.JButton;public class RButton extends JButton {private static final long serialVersionUID = 39082560987930759L;public static final Color BUTTON_COLOR1 = new Color(205, 255, 205); //設置按鈕的第一種顏色public static final Color BUTTON_COLOR2 = new Color(51, 55, 47); //設置按鈕的第二種顏色// public static final Color BUTTON_COLOR1 = new Color(125, 161, 237);// public static final Color BUTTON_COLOR2 = new Color(91, 118, 173);public static final Color BUTTON_FOREGROUND_COLOR = Color.WHITE;private boolean hover;public RButton(String name) {this.setText(name); //添加名字setFont(new Font("system", Font.PLAIN, 12)); //設置字體setBorderPainted(false); //設置邊界可見否setForeground(BUTTON_COLOR2); //設置前景色setFocusPainted(false); setContentAreaFilled(false); //定義鼠標事件,即當鼠標進入到按鈕界面時,按鈕顏色會發生變化,鼠標離開按鈕區域時也會發生變化addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {setForeground(BUTTON_FOREGROUND_COLOR);hover = true;repaint();}@Overridepublic void mouseExited(MouseEvent e) {setForeground(BUTTON_COLOR2);hover = false;repaint();}});}//設置按鈕圓角@Overrideprotected void paintComponent(Graphics g) {Graphics2D g2d = (Graphics2D) g.create();int h = getHeight();int w = getWidth();float tran = 1F;if (!hover) {tran = 0.3F;}g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);GradientPaint p1;GradientPaint p2;//當點擊按鈕之后,按鈕顏色和字體會發生變化if (getModel().isPressed()) {p1 = new GradientPaint(0, 0, new Color(0, 0, 0), 0, h - 1,new Color(100, 100, 100));p2 = new GradientPaint(0, 1, new Color(0, 0, 0, 50), 0, h - 3,new Color(255, 255, 255, 100));} else {p1 = new GradientPaint(0, 0, new Color(100, 100, 100), 0, h - 1,new Color(0, 0, 0));p2 = new GradientPaint(0, 1, new Color(255, 255, 255, 100), 0,h - 3, new Color(0, 0, 0, 50));}g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,tran));RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0, w - 1,h - 1, 20, 20);Shape clip = g2d.getClip();g2d.clip(r2d);GradientPaint gp = new GradientPaint(0.0F, 0.0F, BUTTON_COLOR1, 0.0F,h, BUTTON_COLOR2, true);g2d.setPaint(gp);g2d.fillRect(0, 0, w, h);g2d.setClip(clip);g2d.setPaint(p1);g2d.drawRoundRect(0, 0, w - 1, h - 1, 20, 20);g2d.setPaint(p2);g2d.drawRoundRect(1, 1, w - 3, h - 3, 18, 18);g2d.dispose();super.paintComponent(g);} }applauseMusic.java類
package snakeGame; /** 設置程序運行背景音樂,包括 點擊按鈕音樂,鼓勵音,撞墻音樂,吃食物音樂等等,* 音樂類的設置可以在snakeGame類中實現,由于音樂太多,故而集中到一起,可以在需要添加的地方實例化即可。*/ import java.applet.AudioClip; import java.net.MalformedURLException; import java.net.URL;import javax.swing.JApplet; //添加鼓勵音 class applauseMusic { AudioClip christmas = loadSound("src/music/applauseMusic.wav");public applauseMusic (){ christmas.play ();}public AudioClip loadSound ( String filename ){URL url = null;try{url = new URL ("file:" + filename);}catch (MalformedURLException e){}return JApplet.newAudioClip (url);}} //添加吃到食物的音樂 class eatFoodMusic { AudioClip christmas = loadSound("src/music/eatFoodMusic.wav");public eatFoodMusic (){ christmas.play ();}public AudioClip loadSound ( String filename ){URL url = null;try{url = new URL ("file:" + filename);}catch (MalformedURLException e){}return JApplet.newAudioClip (url);}}//添加撞墻音樂 class DeadMusic { AudioClip christmas = loadSound("src/music/DeadMusic.wav");public DeadMusic (){ christmas.play ();}public AudioClip loadSound ( String filename ){URL url = null;try{url = new URL ("file:" + filename);}catch (MalformedURLException e){}return JApplet.newAudioClip (url);}}//添加 按鍵音樂 class pushButtonMusic { AudioClip christmas = loadSound("src/music/pushButtonMusic.wav");public pushButtonMusic (){ christmas.play ();}public AudioClip loadSound ( String filename ){URL url = null;try{url = new URL ("file:" + filename);}catch (MalformedURLException e){}return JApplet.newAudioClip (url);}} // 添加速度控制音樂 class speedButtonMusic{ AudioClip christmas = loadSound("src/music/encouragMusic.wav");public speedButtonMusic(){ christmas.play ();}public AudioClip loadSound ( String filename ){URL url = null;try{url = new URL ("file:" + filename);}catch (MalformedURLException e){}return JApplet.newAudioClip (url);}}總結
游戲有聲音,就是音頻有點嚇人,其他都還好,如果不喜歡,可以換成自己喜歡的音頻。
附上百度云盤下載連接地址:
鏈接:https://pan.baidu.com/s/1P9bwYgXkoRVaKdOOuWvUng
提取碼:fcfj
歡迎交流,共同進步。
總結
以上是生活随笔為你收集整理的JAVA版贪吃蛇小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【工商管理论文】S船舶监理公司协同营销方
- 下一篇: FPGA学习笔记2-Quartus2简介