Day16 GUI编程:贪吃蛇
生活随笔
收集整理的這篇文章主要介紹了
Day16 GUI编程:贪吃蛇
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
貪吃蛇
幀:如果時(shí)間片足夠小,就是動(dòng)畫。一秒30幀。連起來是動(dòng)畫,拆開是圖片。
鍵盤監(jiān)聽
Thread 定時(shí)器
處理過程
啟動(dòng)類
public class StartGame {public static void main(String[] args) {JFrame frame = new JFrame("jyw");frame.setResizable(false);//窗口大小不可變frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setBounds(10, 10, 900, 720);//正常游戲界面都應(yīng)該在面板上frame.add(new GamePanel());frame.setVisible(true);} }面板類
public class GamePanel extends JPanel implements KeyListener, ActionListener {//定義蛇的數(shù)據(jù)結(jié)構(gòu)int length;//蛇的長度int[] snakeX = new int[600];//蛇的X坐標(biāo)25,25int[] snakeY = new int[600];//蛇的Y坐標(biāo)25,25String fx = "";//方向//食物坐標(biāo)int foodx;int foody;Random random = new Random();int score=0;//分?jǐn)?shù)//游戲當(dāng)前狀態(tài):開始,停止boolean isStart = false;//默認(rèn)是不開始boolean isFail = false;//游戲狀態(tài)失敗//定時(shí)器 以毫秒為單位Timer timer = new Timer(100, this);//100毫秒執(zhí)行一次//構(gòu)造器public GamePanel() {init();//獲得鍵盤和焦點(diǎn)事件this.setFocusable(true);//獲得焦點(diǎn)事件this.addKeyListener(this);//獲得鍵盤監(jiān)聽事件timer.start();//游戲開始定時(shí)啟動(dòng)//把食物隨機(jī)分配foodx = 25 + 25 * random.nextInt(34);foody = 75 + 25 * random.nextInt(24);}//初始化方法public void init() {length = 3;snakeX[0] = 100;snakeY[0] = 100;//腦袋的坐標(biāo)snakeX[1] = 75;snakeY[1] = 100;//第一個(gè)身體坐標(biāo)snakeX[2] = 50;snakeY[2] = 100;//第二個(gè)身體坐標(biāo)fx = "R";score=0;//初始化積分}//繪制面板,游戲中所有東西,都使用畫筆@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);//清屏this.setBackground(Color.WHITE);//繪制靜態(tài)面板Data.header.paintIcon(this, g, 25, 11);//頭部廣告欄g.fillRect(25, 75, 850, 600);//下面長方形//畫積分g.setColor(Color.white);g.setFont(new Font("微軟雅黑", Font.BOLD, 18));//字體g.drawString("長度:"+length, 750, 32);g.drawString("積分:"+score, 750, 53);//畫食物Data.food.paintIcon(this, g, foodx, foody);//把小蛇放上去,通過方向判斷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]);}//游戲狀態(tài)if (isStart == false) {g.setColor(Color.white);g.setFont(new Font("微軟雅黑", Font.BOLD, 40));//字體g.drawString("按下空格開始游戲", 300, 300);}//游戲失敗了if (isFail) {g.setColor(Color.RED);g.setFont(new Font("微軟雅黑", Font.BOLD, 40));//字體g.drawString("游戲失敗,按下空格重新開始", 200, 300);}}//鍵盤監(jiān)聽器@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//獲得鍵盤按鍵是哪一個(gè)if (keyCode == KeyEvent.VK_SPACE) {if (isFail) {//重新開始isFail = false;init();} else {isStart = (!isStart);//取反}repaint();}//小蛇移動(dòng),上下左右if (keyCode == KeyEvent.VK_UP) {fx = "U";} else if (keyCode == KeyEvent.VK_DOWN) {fx = "D";} else if (keyCode == KeyEvent.VK_LEFT) {fx = "L";} else if (keyCode == KeyEvent.VK_RIGHT) {fx = "R";}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}//事件監(jiān)聽---需要通過固定時(shí)間來刷新。比如1s=10次。@Overridepublic void actionPerformed(ActionEvent e) {if (isStart && isFail == false) {//如果游戲是開始狀態(tài),就讓小蛇動(dòng)起來//吃食物if (snakeX[0] == foodx && snakeY[0] == foody) {length++;//長度加1score+=10;//積分加10//重新生成食物坐標(biāo)foodx = 25 + 25 * random.nextInt(34);foody = 75 + 25 * random.nextInt(24);}//身體移動(dòng)到前一節(jié)的位置for (int i = length - 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) {snakeY[0] = 650;}} else if (fx.equals("D")) {snakeY[0] = snakeY[0] + 25;//邊界判斷if (snakeY[0] > 650) {snakeY[0] = 75;}}//失敗判定,撞到自己就失敗for (int i = 1; i < length; i++) {if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {isFail = true;}}repaint();//重畫頁面}//this.timer.start();//定時(shí)開啟} }數(shù)據(jù)資源類
//數(shù)據(jù)中心 public class Data {//相對路徑tx.jpg//絕對路徑 / 相當(dāng)于當(dāng)前目錄//上標(biāo)題private static URL headerURL = Data.class.getResource("/statics/header.png");public static ImageIcon header = new ImageIcon(headerURL);//頭部:上下左右private static URL upURL = Data.class.getResource("/statics/up.png");private static URL downURL = Data.class.getResource("/statics/down.png");private static URL leftURL = Data.class.getResource("/statics/left.png");private 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);//身體private static URL bodyURL = Data.class.getResource("/statics/body.png");public static ImageIcon body = new ImageIcon(bodyURL);//食物private static URL foodURL = Data.class.getResource("/statics/food.png");public static ImageIcon food = new ImageIcon(foodURL); }素材地址:
https://gitee.com/kuangstudy/openclass/blob/master/%E3%80%90%E9%81%87%E8%A7%81%E7%8B%82%E7%A5%9E%E8%AF%B4%E3%80%91%E8%B4%AA%E5%90%83%E8%9B%87%E4%BB%A3%E7%A0%81/%E3%80%90%E7%8B%82%E7%A5%9E%E8%AF%B4%E3%80%91%E8%B4%AA%E5%90%83%E8%9B%87%E6%B8%B8%E6%88%8F%E4%BB%A3%E7%A0%81.rar
總結(jié)
以上是生活随笔為你收集整理的Day16 GUI编程:贪吃蛇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解联通无线上网资费:
- 下一篇: 第一篇 使用numpy创建数组(一维