創建2個檔案夾,一個是放原始碼還有一個檔案夾是發圖片的,
package com.Bubbles.snake;
import javax.swing.*;
import java.net.URL;
public class Data {
//存放外部資料
//1.頭部的圖片 URL :定位圖片的地址 ImageIcon:圖片
public static URL headerURL = Data.class.getResource ("/statics/header.png");
public static ImageIcon header = new ImageIcon (headerURL);
//2.頭部
public static URL upUrl = Data.class.getResource ("/statics/up.png");
public static URL downUrl = Data.class.getResource ("/statics/down.png");
public static URL leftUrl = Data.class.getResource ("/statics/left.png");
public static URL rightUrl = Data.class.getResource ("/statics/right.png");
public static ImageIcon up = new ImageIcon (upUrl);
public static ImageIcon down = new ImageIcon (downUrl);
public static ImageIcon left = new ImageIcon(leftUrl);
public static ImageIcon right = new ImageIcon (rightUrl);
//3.身體
public static URL bodyUrl = Data.class.getResource ("/statics/body.png");
public static ImageIcon body = new ImageIcon (bodyUrl);
//4.食物
public static URL foduUrl = Data.class.getResource ("/statics/food.png");
public static ImageIcon food = new ImageIcon (foduUrl);
--------------------------------------------------------------------------------------------------------
package com.Bubbles.snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.security.Key;
import java.util.Random;
//1.繼承JPanel,才能實作面板效果
public class GamePamel extends JPanel implements KeyListener, ActionListener {
//7.畫蛇
int lenth; //蛇的長度
int [] snakex = new int[600]; //蛇的坐標x
int [] snakeY = new int[500]; //蛇的坐標Y
String fx ; //12.蛇的方向,R :右,L:左 U: 上 D:下
boolean isStrart = false; //游戲是否開始
//定義變數
Timer timer = new Timer (100,this);//定時器
//定義一個食物
int foodx;
int foody;
Random random = new Random ();
//死亡判斷
boolean isFall = false;
//積分系統
int score;
//10.構造器
public GamePamel(){
init ();
//14.獲取鍵盤的監聽事件
this.setFocusable (true);
this.addKeyListener (this);
timer.start ();//讓時間動起來
}
//8.初始化
public void init(){
lenth = 3;
snakex[0] = 100; snakeY[0] = 100; //頭部坐標
snakex[1] = 75; snakeY[1] = 100; //第一個身體坐標
snakex[2] = 50; snakeY[2] = 100; //第二個身體坐標
fx = "R";
foodx = 25 + 25 * random.nextInt (34);
foody = 75 + 25 * random.nextInt (24);
score = 0;
}
//2.畫板:畫界面,畫蛇
//3.重寫方法paintComponent
@Override
protected void paintComponent(Graphics g) { //Graphics =畫筆
super.paintComponent (g); //清屏
this.setBackground (Color.BLACK); //4.設定背景的顏色
//5.繪制頭部的公告欄
Data.header.paintIcon (this,g,25,11); //距離
g.fillRect (25,75,850,600); //6.繪制游戲區域
//9.畫一條靜態的小蛇
if(fx.equals ("R")){ //右走
Data.right.paintIcon (this,g,snakex[0],snakeY[0]); //腦袋
} else if (fx.equals ("L")){ //左走
Data.left.paintIcon (this,g,snakex[0],snakeY[0]); //腦袋
} else if (fx.equals ("U")){ //上走
Data.up.paintIcon (this,g,snakex[0],snakeY[0]); //腦袋
} else if (fx.equals ("D")){ //下走
Data.down.paintIcon (this,g,snakex[0],snakeY[0]); //腦袋
}
//11.一個一個寫的身體比較麻煩,所以要將他回圈
for (int i = 1; i < lenth; i++) {
Data.body.paintIcon (this,g,snakex[i],snakeY[i]); //蛇的身體長度通過lenth來控制
}
//畫積分
g.setColor (Color.white);
g.setFont (new Font ("微軟雅黑",Font.BOLD,18));
g.drawString ("長度:"+lenth,750,35);
g.drawString ("分數:"+score,750,50);
//畫食物
Data.food.paintIcon (this,g,foodx,foody);
//游戲提示:是否開始
if(isStrart==false){
//兩一個文字,String
g.setColor (Color.WHITE);//設定畫筆的顏色
g.setFont (new Font ("微軟雅黑",Font.BOLD,40)); //設定字體
g.drawString ("按下空格開始游戲",300,300);
}
//失敗提醒
if(isFall){
//兩一個文字,String
g.setColor (Color.RED);//設定畫筆的顏色
g.setFont (new Font ("微軟雅黑",Font.BOLD,40)); //設定字體
g.drawString ("游戲失敗,按下空格重新開始",200,300);
}
}
//13.接收鍵盤的輸入:監聽
@Override
public void keyPressed(KeyEvent e) {
//鍵盤按下,未釋放
//獲取按下的鍵盤是哪個鍵
int KeyCode = e.getKeyCode ();
//判斷
if (KeyCode==KeyEvent.VK_SPACE){ //如果按下的是空格鍵
if(isFall){ //失敗,游戲再來一遍
isFall = false;
init ();//重新初始化游戲
}else{ //暫停游戲
isStrart = !isStrart;
}
repaint ();//重繪界面
}
//鍵盤控制走向
if(KeyCode==KeyEvent.VK_LEFT){
fx="L";//左
}else if (KeyCode==KeyEvent.VK_RIGHT){
fx="R";
}else if (KeyCode==KeyEvent.VK_UP){
fx="U";
}else if (KeyCode==KeyEvent.VK_DOWN){
fx="D";
}
}
//定時器,監聽時間,幀 :執行定時操作
@Override
public void actionPerformed(ActionEvent e) {
//如果游戲處于開始狀態,并且游戲沒有結束
if(isStrart && isFall==false ){
//右移
for (int i = lenth-1; i >0 ; i--) {//除了腦袋,身體都向前移動
snakex[i] =snakex[i-1];
snakeY[i] =snakeY[i-1];
}
//通過控制方向讓頭部移動
if(fx.equals ("R")){
snakex[0]= snakex[0] + 25; //頭部移動
if(snakex[0]>850){ snakex[0] = 25; }
}else if (fx.equals ("L")){
snakex[0] =snakex[0] - 25; //頭部移動
if(snakex[0]<25){ snakex[0] = 850; }
}else if (fx.equals ("U")){
snakeY[0] =snakeY[0] - 25; //頭部移動
if(snakeY[0]<75){ snakex[0] = 650; }
}else if (fx.equals ("D")){
snakeY[0] =snakeY[0] + 25; //頭部移動
if(snakeY[0]>650){ snakeY[0] = 75; }
}
//如果小蛇的頭和咋們的食物重合了
if(snakex[0]==foodx && snakeY[0]==foody){
//長度+1
lenth++;
score = score +10;
//重新生成食物
foodx = 25 + 25 * random.nextInt (34);
foody = 75 + 25 * random.nextInt (24);
}
//結束判斷
for (int i = 1; i <lenth ; i++) {
if(snakex[0]==snakex[i] && snakeY[0] ==snakeY[i]){
isFall = true;
}
}
//重繪界面
repaint ();
}
timer.start ();//讓時間動起來
}
@Override
public void keyTyped(KeyEvent e) {
//鍵盤按下,彈起:敲擊
}
@Override
public void keyReleased(KeyEvent e) {
//釋放某個鍵
}
--------------------------------------------------------------------------------------------------
package com.Bubbles.snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args) {
//1.繪制一個靜態視窗 JFname
JFrame frame = new JFrame ("彬哥-貪吃蛇小游戲");
//2.設定界面的大小
frame.setBounds (10, 10, 900, 720);
frame.setResizable (false); //3.視窗大小則不可以改變
//4.設定關閉事件,游戲可以關閉了
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
//6.面板 JPanel,可以加入到Frame
frame.add (new GamePamel ());
frame.setVisible (true); //5.讓視窗能夠展現出來
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289701.html
標籤:其他
