第十三天 前面的十二天如果你看完了,那么今天你就可以試試這一款屬于自己的小游戲啦
一步步寫的,小白可以看哦,思維簡單,eclipse開發,并且資源已經上傳,下面就是詳細步驟
貪吃蛇小游戲
- 創建java專案
1.1點擊file-new-java Project,記得不要選eclipse自帶的jdk
1.2匯入靜態圖片 - 繪制靜態視窗
public class StartGame {
public static void main(String[] args) {
//繪制一個界面 JFrame
JFrame frame=new JFrame("不辭樹貪吃蛇游戲");
//設定界面的大小 set bounds 設定界限
frame.setBounds(10,10,900,720);
//視窗大小不可改變 resizable可調整大小
frame.setResizable(false);
//設定關閉游戲,讓游戲界面關閉 DefaultCloseOperation默認關閉操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//讓視窗展現出來 setVisible可見
frame.setVisible(true);
}
}
- 繪制游戲的面板
//界面
public class GamePanel extends JPanel{
//Graphics:畫筆
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.BLACK);//設定我們的背景顏色
}
}
- 畫靜態的小蛇
4.1、繪制頭部區域和游戲區域
1、創建一個存盤外部資源的一個類:
public class Data {
//頭部圖片
public static URL headerUrl=Data.class.getResource("/statics/header.png");
public static ImageIcon head=new ImageIcon(headerUrl);
}
2、在畫板中繪制我們的頭部資訊和游戲區域
public class GamePanel extends JPanel{
//Graphics:畫筆
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);//設定我們的背景顏色
Data.head.paintIcon(this, g, 25,11); //繪制我們的頭部資訊
g.fillRect(25, 75, 850, 600);//繪制我們的游戲區
}
}
3、將我們的畫板添加到我們的靜態視窗中
public class StartGame {
public static void main(String[] args) {
//繪制一個界面 JFrame
JFrame frame=new JFrame("不辭樹貪吃蛇游戲");
//設定界面的大小
frame.setBounds(10,10,900,720);
//視窗大小不可改變
frame.setResizable(false);
//設定關閉游戲,讓游戲界面關閉
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//在界面添加我們的畫板
frame.add(new GamePanel());
//讓視窗展現出來
frame.setVisible(true);
}
}
4.2、在畫板中引入小蛇坐標
1、在GamePanel類中初始化蛇的坐標和長度
int length; //小蛇的長度
int[] snakeX=new int[600]; //蛇的x坐標
int[] snakeY=new int[500]; //蛇的y坐標
public GamePanel() { //構造方法初始化
init();
}
//初始化蛇的長度和坐標
public void init() {
length=3; //剛開始默認的長度為3
//初始化開始的蛇,給蛇定位,
snakeX[0] = 100; snakeY[0] = 100;
snakeX[1] = 75; snakeY[1] = 100;
snakeX[2] = 50; snakeY[2] = 100;
}
2、在Data類中引入蛇的靜態圖片
//頭部:上下左右 URL路徑 getResource 獲取資源 ImageIcon影像圖示
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);
//身體
public static URL bodyUrl = Data.class.getResource("/statics/body.png");
public static ImageIcon body = new ImageIcon(bodyUrl);
//食物
public static URL foodUrl = Data.class.getResource("/statics/food.png");
public static ImageIcon food = new ImageIcon(foodUrl);
3、在面板中繪制我們的靜態蛇
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//繪制我們的蛇頭
for (int i = 1; i < length; i++) {//繪制我們的蛇身
Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);

- 小蛇動起來
5.1初始化方向和定時器,修改構造方法
String fx="R"; //方向:上:U 下:D 左:L 有:R
Timer timer = new Timer(100, this); //定時器:第一個引數,就是定時執行時間
public GamePanel() {
init();
this.setFocusable(true); //獲取焦點事件
this.addKeyListener(this);//鍵盤監聽事件
timer.start();//讓時間動起來
}
5.2、實作兩個介面,并重寫里面的方法
KeyListener
ActionListener
5.3、在keyPressed方法中監聽鍵盤
int keyCode=e.getKeyCode(); //獲取按下的鍵
//鍵盤控制走向
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";
}
5.4、在actionPerformed方法中進行定時移動
//除了腦袋都往前移:身體移動
for (int i = length-1; i >0; i--) {
snakeX[i]=snakeX[i-1];//即第i節(后一節)的位置變為(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) {snakeY[0]=650;}
}else if (fx.equals("D")){
snakeY[0] = snakeY[0]+25;
if (snakeY[0]>650) snakeY[0] = 75;
}
repaint(); //需要不斷的更新頁面實作影片
timer.start(); //讓時間動起來
5.5、修改畫板畫小蛇的方式
修改畫板畫小蛇的方式
//把小蛇畫上去
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]);
}
for (int i = 1; i < length; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); //蛇的身體長度根據lenth來控制
}
- 設定我們的開始和結束
6.1、定義我們的結束或者開始的標志并初始化
Boolean isStart=false;// 設定我們的開始和暫停的標志
6.2、在畫板中判斷開始還是結束
// 判斷我們的游戲開始還是結束
if (isStart == false) {
g.setColor(Color.white);
g.setFont(new Font("微軟雅黑", Font.BOLD, 40));
g.drawString("按下空格開始游戲!", 300, 300);
}
6.3、監聽空格鍵
int keyCode = e.getKeyCode(); // 獲取按下的鍵
if (keyCode == KeyEvent.VK_SPACE) {
isStart = !isStart;
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";
}
6.3、定時執行操作
7. 吃食物
7.1、定義食物坐標
//食物
int foodx;
int foody;
Random random=new Random();//產生亂數
7.2、init方法中初始化
//初始化食物
foodx=25+25*random.nextInt(34);
foody=75+25*random.nextInt(24);
7.3、繪制小蛇
//畫食物
Data.food.paintIcon(this, g, foodx, foody);
7.4、在定時方法中讓小蛇吃食物
//小蛇吃食物
if(snakeX[0]==foodx&&snakeY[0]==foody) {
length++;
foodx=25+25*random.nextInt(34);
foody=75+25*random.nextInt(24);
}
- 分數和失敗的判定
8.1、分數和失敗判定標識的初始化
boolean isFail = false; //游戲是否結束
int score; //游戲分數!
8.2、init方法中分數的初始化(很重要),繪制我們的分數統計
//分數初始化
score=0;
//畫積分
g.setColor(Color.WHITE);
g.setFont(new Font("微軟雅黑", Font.BOLD, 18)); // 微軟雅黑,加粗 ,40號
g.drawString("長度:"+length, 750, 35);
g.drawString("分數:"+score, 750, 50);
8.3、畫板中判斷是否游戲失敗,
//失敗判斷
if (isFail){
g.setColor(Color.RED);
g.setFont(new Font("微軟雅黑",Font.BOLD,40));
g.drawString("失敗, 按下空格重新開始",300,300);
}
8.4、監聽空格鍵(修改)
if (keyCode == KeyEvent.VK_SPACE) {
if(isFail) {//如果游戲失敗,重新再來
isFail=false;
init();
}else {
isStart = !isStart;//否則,暫停游戲
}
repaint();
}
8.5、定時操作中失敗的判定
//小蛇吃食物
if(snakeX[0]==foodx&&snakeY[0]==foody) {
length++;
foodx=25+25*random.nextInt(34);
foody=75+25*random.nextInt(24);
score=score+10;//分數加10
}
//判斷是否蛇頭和蛇身碰撞
for (int i = 1; i < length; i++) {
if(snakeX[i]==snakeX[0]&&snakeY[i]==snakeY[0]) {
isFail=true;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226317.html
標籤:其他
上一篇:C語言 三子棋
