700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java开发贪吃蛇小游戏

Java开发贪吃蛇小游戏

时间:2022-03-12 02:34:29

相关推荐

Java开发贪吃蛇小游戏

Java开发贪吃蛇小游戏

文章目录

Java开发贪吃蛇小游戏一、开发思路二、具体开发过程1.绘制静态游戏窗口2.导入素材图标3.绘制游戏面板4.绘制一条静态的小蛇5.让小蛇动起来①监听键盘输入实现Keylistener接口,重写KeyPressed()方法(键盘按下)②构造定时器监听时间③实现ActionListener接口(事件监听) 6.使用户能通过键盘控制蛇的方向7.加入食物和积分系统8.失败判定 三、效果截图四、源码

一、开发思路

设定一个一定大小的且大小不可变的游戏窗口

在创建的窗口上绘制游戏的基本面板样式

使用提前保存的素材图标绘制一条静态的小蛇

使小蛇能够移动;实际只需蛇头坐标移动,每节身体覆盖前一节身体坐标,设置定时器Timer timer =new Timer();监听时间让小蛇能移动

监听键盘操作,使用户能通过键盘控制蛇的方向

定义一个食物坐标,用random随机数类实现食物随机生成

小蛇吃到食物时身体长度+1,实际是蛇头坐标与食物坐标重合时

boolean定义游戏失败的判断,当蛇头与任何身体部位坐标重合(或撞到边界)则游戏失败,可再设置积分系统,每吃到一次食物加一定分数

二、具体开发过程

1.绘制静态游戏窗口

JFrame jFrame = new JFrame("Greedy Snake");//绘制一个静态窗口jFrame.setBounds(10,10,900,720);//设置界面大小jFrame.setResizable(false);//窗口大小不可改变jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置窗口关闭事件jFrame.setVisible(true);//窗口显示 jFrame.add(new GamePanel());//面板添加到窗口

2.导入素材图标

public class Data {public static URL headerUrl = Data.class.getResource("/statics/header.png");//定位图片地址public static ImageIcon header =new ImageIcon(headerUrl);//通过图片地址绘制图片}

3.绘制游戏面板

@Overrideprotected void paintComponent(Graphics g) {//Graphics:画笔super.paintComponent(g);//清屏this.setBackground(Color.darkGray);//设置背景颜色Data.header.paintIcon(this,g,25,11);//绘制头部广告栏g.fillRect(25,75,850,600);//绘制游戏区域

4.绘制一条静态的小蛇

定义

int length;//蛇的长度int[] snakeX=new int[600];int[] snakeY=new int[500];//蛇的坐标String dir;//脑袋方向boolean isStart=false;boolean isFail for (int j = 1; j < length; j++) {if (snakeX[j]==snakeX[0]&&snakeY[j]==snakeY[0]){isFail=true;}}repaint();=false;

绘制

if (dir.equals("R")) {Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);} else if (dir.equals("L")){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("U")){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("D")){Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);}//脑袋(上下左右4个方向)for (int i = 1; i < length; i++) {Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);}//通过循环绘制身体长度

5.让小蛇动起来

①监听键盘输入
实现Keylistener接口,重写KeyPressed()方法(键盘按下)

public void keyPressed(KeyEvent e) {//键盘按下未释放int keyCode = e.getKeyCode();if(keyCode==KeyEvent.VK_SPACE){//空格键if (isFail){isFail=false;init();//重新初始化}else {//暂停游戏isStart=!isStart;}repaint();//刷新界面}}

②构造定时器监听时间

Timer timer =new Timer(50,this);//定时器

③实现ActionListener接口(事件监听)

重写actionPerformed(ActionEvent e)方法

@Overridepublic void actionPerformed(ActionEvent e) {if(isStart && isFail==false){//游戏处于开始状态并且游戏没有失败for (int i = length-1; i >0; i--) {snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];//身体移动}if (dir.equals("R")) {snakeX[0]=snakeX[0]+25;//脑袋移动} else if (dir.equals("L")){snakeX[0]=snakeX[0]-25;} else if (dir.equals("U")){snakeY[0]=snakeY[0]-25;} else if (dir.equals("D")){snakeY[0]=snakeY[0]+25;}repaint();//刷新页面}timer.start();//令时间开始动起来}

6.使用户能通过键盘控制蛇的方向

@Overridepublic void keyPressed(KeyEvent e) {if (keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){if (!dir.equals("D")){//使小蛇不能直接回头dir="U";}}else if (keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){if (!dir.equals("U")){dir="D";}}else if (keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){if (!dir.equals("R")){dir="L";}}else if (keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D) {if (!dir.equals("L")) {dir = "R";}}}

7.加入食物和积分系统

int foodX;int foodY;//定义食物坐标Random random=new Random();//随机数类//绘制食物Data.food.paintIcon(this,g,foodX,foodY);if (snakeX[0]==foodX&&snakeY[0]==foodY){//脑袋和食物坐标重合length++;//长度+1score+=10;//分数+10foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);//重新生成食物}

8.失败判定

for (int j = 1; j < length; j++) {if (snakeX[j]==snakeX[0]&&snakeY[j]==snakeY[0]){isFail=true;}//蛇头坐标与身体重合}if (snakeX[0]>=850||snakeX[0]<=25||snakeY[0]<=75||snakeY[0]>=650){isFail=true;}//设定撞墙失败

三、效果截图

开始

失败

四、源码

StartGames.Java

package com.wx.snake;import javax.swing.*;public class StartGames {public static void main(String[] args) {JFrame jFrame = new JFrame("Greedy Snake");//绘制一个静态窗口jFrame.setBounds(10,10,900,720);//设置界面大小jFrame.setResizable(false);//窗口大小不可改变jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置窗口关闭事件jFrame.setVisible(true);//窗口显示 jFrame.add(new GamePanel());//面板添加到窗口}}

GamePanel.java

package com.wx.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.util.Random;public class GamePanel extends JPanel implements KeyListener, ActionListener {//JPanel:面板容器类,可以加入到JFrameint length;//蛇的长度int[] snakeX=new int[600];int[] snakeY=new int[500];//蛇的坐标String dir;//脑袋方向boolean isStart=false;Timer timer =new Timer(50,this);//定时器int foodX;int foodY;//定义食物坐标Random random=new Random();//随机数类boolean isFail=false;//死亡判断int score;//积分系统//构造器public GamePanel(){init();//获取键盘的监听事件this.setFocusable(true);//聚集键盘焦点在游戏界面this.addKeyListener(this);//添加监听timer.start();//令时间开始动起来}//初始化public void init(){length=3;snakeX[0]=100;snakeY[0]=100;//头部坐标snakeX[1]=snakeX[0]-25;snakeY[1]=snakeY[0];//第一节身体坐标snakeX[2]=snakeX[0]-50;snakeY[2]=snakeY[0];//第二节身体坐标dir="R";foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);//食物随机坐标score=0;}//画板(画界面、画蛇)@Overrideprotected void paintComponent(Graphics g) {//Graphics:画笔super.paintComponent(g);//清屏this.setBackground(Color.darkGray);//设置背景颜色Data.header.paintIcon(this,g,25,11);//绘制头部广告栏g.fillRect(25,75,850,600);//绘制游戏区域//绘制静态小蛇if (dir.equals("R")) {Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);} else if (dir.equals("L")){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("U")){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);}else if (dir.equals("D")){Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);}//脑袋(上下左右4个方向)for (int i = 1; i < length; i++) {Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);}//通过循环绘制身体长度if(isStart==false){//游戏提示:是否开始g.setColor(Color.ORANGE); //设置画笔颜色g.setFont(new Font("黑体",Font.BOLD,40));//设置字体g.drawString("按下空格开始游戏",300,300); //画一个文字}//绘制食物Data.food.paintIcon(this,g,foodX,foodY);//失败提醒if (isFail){g.setColor(Color.red); //设置画笔颜色g.setFont(new Font("楷体",Font.BOLD,40));//设置字体g.drawString(" 游戏失败",335,300); //画一个文字g.drawString("你的分数 "+score,333,350);g.drawString("按空格重新开始",310,400);}//积分g.setColor(Color.CYAN); //设置画笔颜色g.setFont(new Font("方正粗黑宋简体",Font.BOLD,20));//设置字体g.drawString("长度:"+length,750,34); //画一个文字g.drawString("分数:"+score,750,59);}//接收键盘输入:监听@Overridepublic void keyPressed(KeyEvent e) {//键盘按下未释放int keyCode = e.getKeyCode();if(keyCode==KeyEvent.VK_SPACE){//空格键if (isFail){isFail=false;init();//重新初始化}else {//暂停游戏isStart=!isStart;}repaint();//刷新界面}if (keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){if (!dir.equals("D")){dir="U";}}else if (keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){if (!dir.equals("U")){dir="D";}}else if (keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){if (!dir.equals("R")){dir="L";}}else if (keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D) {if (!dir.equals("L")) {dir = "R";}}}//定时器,监听时间,帧:执行定时操作@Overridepublic void actionPerformed(ActionEvent e) {if(isStart && isFail==false){//游戏处于开始状态并且游戏没有失败for (int i = length-1; i >0; i--) {snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];//身体移动}if (dir.equals("R")) {snakeX[0]=snakeX[0]+25;//脑袋移动//if (snakeX[0]>850){snakeX[0]=25;}//边界判断} else if (dir.equals("L")){snakeX[0]=snakeX[0]-25;//if (snakeX[0]<25){snakeX[0]=850;}//边界判断} else if (dir.equals("U")){snakeY[0]=snakeY[0]-25;// if (snakeY[0]<75){snakeY[0]=650;}//边界判断} else if (dir.equals("D")){snakeY[0]=snakeY[0]+25;//if (snakeY[0]>650){snakeY[0]=75;}//边界判断}if (snakeX[0]>=850||snakeX[0]<=25||snakeY[0]<=75||snakeY[0]>=650){isFail=true;}//设定撞墙失败if (snakeX[0]==foodX&&snakeY[0]==foodY){//脑袋和食物坐标重合length++;//长度+1score+=10;foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);//重新生成食物}//失败判断for (int j = 1; j < length; j++) {if (snakeX[j]==snakeX[0]&&snakeY[j]==snakeY[0]){isFail=true;}}repaint();}timer.start();//令时间开始动起来}@Overridepublic void keyTyped(KeyEvent e) {}//键盘按下弹起@Overridepublic void keyReleased(KeyEvent e) {}//键盘释放}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。