之前在网上看到很多人在在找贪吃蛇源码,难道今天比较闲就动手写了一个小项目现在分享给大家。
游戏源码获取方式1:游戏源码
游戏源码获取方式2:关注微信公众号:花笺说,回复:贪吃蛇大冒险 即可获取
首先下面看一下效果图:
小蛇每吃一个食物就会长长一点,当碰到自身或者墙壁游戏就结束了。
用法:
要点:
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;
}