失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 如何用java语言编写小游戏?(贪吃蛇)

如何用java语言编写小游戏?(贪吃蛇)

时间:2024-05-09 04:51:56

相关推荐

如何用java语言编写小游戏?(贪吃蛇)

自己做了个贪吃蛇,效果图如下”

素材和图片是网上找的,在做这游戏的过程中其实最麻烦的是像素的调整,需要一点点去试。。。。所以大家做的时候像素方面自己试就行了,根据自己的实际情况判断。

先说一下思路:

java中导入图片的方法好像既可以用io流,也可以使用GUI编程的方式,这里我选择的是后者了。然后就是基本的创建窗体,窗体大小根据自己的电脑大小来判断。

图片类代码如下,注意,读取图片路径时,斜杠“/”表示的路径是当前模块下的src目录,这点要搞清楚。

public class imges {//将图片的路径封装为一个对象public static URL bodyURL =imges.class.getResource("/body.png");//将图片封装为程序中一个对象public static ImageIcon bodyImg =new ImageIcon(bodyURL);//将图片的路径封装为一个对象public static URL downURL =imges.class.getResource("/down.png");//将图片封装为程序中一个对象public static ImageIcon downImg =new ImageIcon(downURL);//将图片的路径封装为一个对象public static URL foodURL =imges.class.getResource("/food.png");//将图片封装为程序中一个对象public static ImageIcon foodImg =new ImageIcon(foodURL);//将图片的路径封装为一个对象public static URL headerURL =imges.class.getResource("/header.png");//将图片封装为程序中一个对象public static ImageIcon headerImg =new ImageIcon(headerURL);//将图片的路径封装为一个对象public static URL leftURL =imges.class.getResource("/left.png");//将图片封装为程序中一个对象public static ImageIcon leftImg =new ImageIcon(leftURL);//将图片的路径封装为一个对象public static URL rightURL =imges.class.getResource("/right.png");//将图片封装为程序中一个对象public static ImageIcon rightImg =new ImageIcon(rightURL);//将图片的路径封装为一个对象public static URL upURL =imges.class.getResource("/up.png");//将图片封装为程序中一个对象public static ImageIcon upImg =new ImageIcon(upURL);}

这个是窗体类:

package 月夜空之星;import javax.swing.*;import java.awt.*;/*月夜空之星月夜空之星/2/13 9:22*/public class startGames {private JFrame jFrame;private drawJpanel drawJpanel;public startGames(){//实例化窗体jFrame=new JFrame();//实例化面板drawJpanel=new drawJpanel();init();}//初始化窗体private void init() {jFrame.setTitle("我的贪吃蛇");jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//计算窗体大小int width= Toolkit.getDefaultToolkit().getScreenSize().width;int height=Toolkit.getDefaultToolkit().getScreenSize().height;jFrame.setBounds((width-800)/2,(height-800)/2,800,800);//固定窗体jFrame.setResizable(false);//将面板压入窗体内jFrame.add(drawJpanel);//设置窗体可见jFrame.setVisible(true);}public static void main(String[] args) {new startGames();}}

注意窗体大小的计算方式

当能够获取图片,窗体类加载好以后,就可以开始写面板类,即容器了。画好面板以后,思考如何开始画小蛇。这里建议可以以Excel为背景,了解小蛇在面板中会是怎样的,会怎样运动。

3:按下空格时游戏暂停,小蛇撞到自身或者往返走时,死亡,这种功能如何实现?小蛇吃掉食物后,食物出现的新位置如何确定?

面板类代码如下:

package 月夜空之星;import javax.swing.*;import javax.swing.plaf.ColorUIResource;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;/*月夜空之星月夜空之星/2/13 9:31 面板类*/public class drawJpanel extends JPanel {//设置数组表示小蛇每节身子的位置int[] snakeX=new int[300];int[] snakeY=new int[300];//设置小蛇头的方向String direction;//设置小蛇长度int length;//设置变量,判断游戏是否开始boolean isStart=false;//默认暂停//定义一个定时器Timer timer;//设置食物的变量,设置其坐标int foodX;int foodY;//设置积分int score=0;//判断小蛇死亡的方法boolean isDie=false;//初始化面板的方法public drawJpanel(){init1();//将当前焦点定位在面板上this.setFocusable(true);//设置键盘监听事件this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {super.keyPressed(e);//对应键盘上的每一个键,要用到ASCII码表//设置一个变量用来记录对应的数int keyCode =e.getKeyCode();System.out.println(keyCode);if (keyCode==KeyEvent.VK_SPACE){if (isDie){//小蛇死亡了//恢复初始化init1();isDie=!isDie;score=0;}else{//小蛇没死亡isStart=!isStart;repaint();}}//监听按下的方向键,对应小蛇头的运动//向上运动if (keyCode==KeyEvent.VK_UP){direction="up";}//向下运动if (keyCode==KeyEvent.VK_DOWN){direction="down";}//向左运动if (keyCode==KeyEvent.VK_LEFT){direction="left";}//向右运动if (keyCode==KeyEvent.VK_RIGHT){direction="right";}}});timer=new Timer(300, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//小蛇身子的动作if (isStart==true&&isDie==false){for (int i=length-1;i>0;i--){snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];}//小蛇头的动作if (direction=="up"){snakeY[0]-=25;}if (direction=="down"){snakeY[0]+=25;}if (direction=="right"){snakeX[0]+=25;}if (direction=="left"){snakeX[0]-=25;}//设置小蛇超出边界后的行为//从左到右超出边界if(snakeX[0] > 750){snakeX[0] = 25;}if(snakeX[0] <25){snakeX[0] = 750;}if(snakeY[0] < 100){snakeY[0] = 725;}if(snakeY[0] > 725){snakeY[0] = 100;}//当小蛇吃到食物时的行为,即蛇头和食物碰撞if (snakeX[0]==foodX&&snakeY[0]==foodY){length++;//小蛇长度增加/*食物的横坐标纵坐标发生改变矩形面积为 770,685。由于图片的像素,所以必须是25的倍数[25,725]之间被25整除的数横坐标[25,725]/25 = [1,29]*25 = [25,725][1,29]:Math.random - [0.0,1.0)Math.random*29 - [0.0,29.0)(int)(Math.random*29) - [0,28](int)(Math.random*29) + 1 - [1,29]((int)(Math.random*29) + 1)*25 - [25,725]*/foodX = ((int)(Math.random()*29) + 1)*25;foodY = ((int)(Math.random()*26) + 4)*25; //[100,725]/25 = [4,29]*25 -- ([1,26]+3)*25score+=10;}for (int i=1;i<length;i++){if (snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){isDie=true;}}repaint();}}});timer.start();}//初始化小蛇的方法private void init1() {//初始化小蛇长度length=3;//初始化小蛇头的坐标snakeX[0]=175;snakeY[0]=275;// 初始化小蛇第一节身子的长度snakeX[1]=150;snakeY[1]=275;// 初始化小蛇第二节身子的长度snakeX[2]=125;snakeY[2]=275;//初始化小蛇头的方向direction="right";//初始化食物的坐标foodX=275;foodY=125;}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//设置面板的背景颜色:this.setBackground(new Color(209, 237, 239));//插入一个头部图片:imges.headerImg.paintIcon(this,g,10,10);//画一个矩形区域://将画笔的颜色改变一下:g.setColor(new Color(239, 219, 218));g.fillRect(5,60,770,685);//画小蛇头if (direction=="right"){imges.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if (direction=="left"){imges.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if (direction=="up"){imges.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if (direction=="down"){imges.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);}//画小蛇身子for (int i=1;i<length;i++){imges.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);}//画游戏暂停时的提示if (isStart==false){g.setColor(new Color(39, 185, 255));g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("按下空格键开始游戏",250,250);}//画食物imges.foodImg.paintIcon(this,g,foodX,foodY);//画积分g.setColor(new ColorUIResource(255, 255, 255));g.setFont(new Font("微软雅黑",Font.BOLD,20));g.drawString("积分"+score,620,40);//小蛇死亡时的判定if (isDie){g.setColor(new Color(39, 185, 255));g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("小蛇死亡,按下空格键开始游戏",250,250);}}}

总共也不多,三百多行代码吧。了解清楚如何实现后,还是很简单了。

我把我自己做的分享如下,包括使用到的素材等。

提取码:koz8

如果觉得《如何用java语言编写小游戏?(贪吃蛇)》对你有帮助,请点赞、收藏,并留下你的观点哦!

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