首页 > 编程 > Java > 正文

java swing小游戏-贪吃蛇大冒险

2019-11-06 07:31:16
字体:
来源:转载
供稿:网友

之前在网上看到很多人在在找贪吃蛇源码,难道今天比较闲就动手写了一个小项目现在分享给大家。 游戏源码获取方式1:游戏源码 首先下面看一下效果图: 这里写图片描述 小蛇每吃一个食物就会长长一点,当碰到自身或者墙壁游戏就结束了。 用法: 要点: 1. 图形的绘制 2. 贪吃蛇的移动 3. 食物的随机分布 4. 碰撞检测 5. 死亡检测 一 图形的绘制 图形绘制使用的是ImageIcon里的paintIcon() 方法,该方法接收三个参数: 第一个参数是要绘制的地方,第二个参数是画笔对象,第三个是要绘制图形位置的x坐标,第四个是要绘制图形的y坐标主要代码如下:

public void paint(Graphics g) { //此为重点,必须要调用父类方法才会重新绘制 super.paint(g); this.setBackground(Color.BLACK); //this.setVisible(true); //根据前进的方向画出蛇头 if(direction.equals("R")){ snake.headR.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]); }else if (direction.equals("D")) { snake.headD.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]); }else if (direction.equals("L")) { snake.headL.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]); }else if (direction.equals("U")) { snake.headU.paintIcon(this, g, snake.snakeX[0], snake.snakeY[0]); } //画出蛇的身体 for(int i=1;i<len;i++){ snake.body.paintIcon(this, g, snake.snakeX[i], snake.snakeY[i]); } //提示文字 if(!isStarted){ Color color = g.getColor(); g.setColor(Color.white); Font font=new Font("华文行楷", Font.BOLD, 30); g.setFont(font); g.drawString("点击空格键开始/暂停", 250, 380); g.setColor(color); } //游戏结束提示 if(isDead){ Color color = g.getColor(); g.setColor(Color.white); Font font=new Font("隶书", Font.BOLD, 35); g.setFont(font); g.drawString("总得分:"+Score, 230, 300); g.drawString("GameOver/PRess space to restart!", 120, 380); g.setColor(color); } //paint Score //显示分数 Color color = g.getColor(); g.setColor(Color.white); Font font=new Font("隶书", Font.BOLD, 20); g.setFont(font); Score=(len-3)*5; g.drawString("分数:"+Score, 680, 30); g.setColor(color); snake.imgFood.paintIcon(this, g, food.foodX, food.foodY); }

二 贪吃蛇的移动: 蛇画出之后要解决的就是蛇的移动问题,移动的算法就是整个游戏的核心,核心思想是: 蛇头向前移动之后,跟在后面的身体依次向前进行移动,然后重新绘制图片,主要代码如下:

if(isStarted && !isDead){ //移动蛇的身体 for(int i=len-1;i>0;i--){ snake.snakeX[i]=snake.snakeX[i-1]; snake.snakeY[i]=snake.snakeY[i-1]; } //移动蛇的头部 if(direction.equals("R")){ snake.snakeX[0]+=25; }else if (direction.equals("D")) { snake.snakeY[0]+=25; }else if (direction.equals("L")) { snake.snakeX[0]-=25; }else if (direction.equals("U")) { snake.snakeY[0]-=25; }

三 食物的随机分布 食物是贪吃蛇游戏中第二重要的,它的位置要随机分布而不是固定的位置,这就要用到Random函数了,该函数可以产生随机数。初始化食物类的时候会对其坐标进行随机分配,当贪吃蛇将食物吃下之后会调用getRandomXY()方法再获取一个随机位置主要代码如下:

public Food() { random=new Random(); foodX=random.nextInt(30)*20+30; foodY=random.nextInt(30)*20+30;}public void getRandomXY(){ foodX=random.nextInt(30)*20+30; foodY=random.nextInt(30)*20+30;}

四 碰撞检测 如何知晓贪吃蛇可以吃食物!就必须进行碰撞检测,当贪吃蛇的头与食物接触,食物重新绘制,原理很简单,虽然碰撞检测有很多种,比如矩形碰撞,像素检测等。但是对于贪吃蛇这种小游戏矩形碰撞已经足够了。首先要用到Rectangle类把贪吃蛇的头包装成一个矩形,然后食物也包装成一个矩形,当两个矩形有接触时,碰撞! Rectangle类的初始化方法需要四个参数。

被包装物体左上角x坐标值被包装物体左上角y坐标值物体宽度物体长度

主要代码如下: 贪吃蛇包装:

public Rectangle getRect() { return new Rectangle((int)snakeX[0],(int)snakeY[0],30,28); }

食物包装:

public Rectangle getRect(){ return new Rectangle((int)foodX,(int)foodY,25,25);}

碰撞检测:

private void checkFood() { if(snake.getRect().intersects(food.getRect())){ len++; food.getRandomXY(); } }

五 死亡检测 死亡检测比较简单,只要判断蛇头的坐标是否大于边界或小于边界。当头与身体的坐标重合之后也可以判断为死亡最主要代码如下:

if(snake.snakeX[0]==snake.snakeX[i]&&snake.snakeY[0]==snake.snakeY[i]){ isDead=true; } if(snake.snakeX[0]<=0||snake.snakeX[0]>=775||snake.snakeY[0]<=0||snake.snakeY[0]>=725){ isDead=true; }

游戏源码获取方式2:关注微信公众号:SmileBoyblog,回复:贪吃蛇大冒险 即可获取 这里写图片描述


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表