`
haitian235
  • 浏览: 62451 次
  • 性别: Icon_minigender_1
  • 来自: 海南
社区版块
存档分类
最新评论

android 贪吃蛇游戏

 
阅读更多

写了一个简单的贪吃蛇游戏、、、

 

主要思路

 

一、用一个int 数组保存蛇身坐标,snake[i*2+0]为X轴,snake[i*2+1]为Y轴,

 

二、定蛇头的X轴和Y轴 并赋值,snake[0]+=snakeX;     snake[1]+=snakeY;
       蛇身移动,从蛇头开始把坐标重新赋值到下一个。

           for(int i=snakeLength-1;i>0;i--){
             snake[i*2+0]=snake[(i-1)*2+0];
             snake[i*2+1]=snake[(i-1)*2+1];
         }

 

三、Random 随机等到食物坐标,没有判断 和蛇身的坐标重合会怎么样。

 

        foodX=random_food.nextInt(screen_w-snake_w);
        foodY=random_food.nextInt(screen_h-snake_h)+LINE_Y;

 

     判断蛇头是否吃到食物

 

   if(foodX<=snake[0]&&snake[0]<=foodX+snake_w&&foodY<=snake[1]&&snake[1]  <=foodY+snake_h){
           
            return true;
        }

 

 

 

四、判断蛇头是否死亡,主要是判断是否吃到自身和是否越界

 

  
        if(snake[0]<=screen_start_w||snake[0]>=screen_w||snake[1]<=LINE_Y||snake[1]>=screen_h){
            return true;
        }
       
        for(int i=2;i<snakeLength;i++){
            if(snake[i*2+0]==snake[0]&&snake[i*2+1]==snake[1]){
                return true;
            }
        }

 

package com.snake.view;

import java.util.Random;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import com.snake.main.R;
import com.snake.main.SnakeActivity;

public class SnakeView extends SurfaceView implements SurfaceHolder.Callback{
    private SurfaceHolder mHolder;
   
    private static final int SLEEP_TIME=1000;
    private static final int head=0;
   
    private boolean isflag;
    private boolean snake_state;
    private final boolean snake_runing=true;
    private final boolean snake_pause=false;
   
    private Bitmap snake_head;
    private Bitmap snake_body;
    private Bitmap snake_food;
    //蛇的坐标
    private final int snake[]=new int[60];
   
    //蛇身长
    private int snakeLength;
   
    //蛇的方向
    private int direction;
    private static final int DIR_UP=0;
    private static final int DIR_RIGHT=1;   
    private static final int DIR_DOWN=2;
    private static final int DIR_LEFT=3;
   
    //蛇大小
    private int snake_h;
    private int snake_w;
   
    //屏幕宽高
    private int screen_h;
    private int screen_w;
   
    //蛇的食物坐标
    private static int foodX=120;
    private static int foodY=140;
   
   
    private static final int screen_start_w=-1;
   
    private final int LINE_Y=15;
   
    private final Random random_food=new Random();
    private final SnakeActivity snakeActivity;
    public SnakeView(Context context,AttributeSet attributeSet){
        super(context, attributeSet);
        snakeActivity=(SnakeActivity) context;
        ini();
    }
    public SnakeView(Context context,AttributeSet attributeSet,int defStyle){
        super(context, attributeSet, defStyle);
        snakeActivity=(SnakeActivity) context;
        ini();
    }
   
    public void ini(){
        mHolder=getHolder();
        mHolder.addCallback(this);
       
        setFocusable(true);
        isflag=true;
       
        snakeLength=snakeActivity.snakeStartLength;
       
        snake_state=snake_runing;
       
        snake_head=BitmapFactory.decodeResource(getResources(), R.drawable.redstar);
        snake_body=BitmapFactory.decodeResource(getResources(), R.drawable.yellowstar);
        snake_food=BitmapFactory.decodeResource(getResources(), R.drawable.greenstar);
       
        snake_h=snake_head.getHeight();
        snake_w=snake_head.getWidth();
       
        for(int i=0;i<snakeLength;i++){
            snake[i*2+0]=101-snake_h*i;
            snake[i*2+1]=101;
        }
       
    }

    private  void ondraw(){
        Canvas canvas=mHolder.lockCanvas();
        Paint mpaint=new Paint();
   
       
        float[] line={0,LINE_Y,screen_w,LINE_Y};
        //覆盖以前视图
        canvas.drawRect(0, 0, screen_w, screen_h, mpaint);
        mpaint.setColor(Color.WHITE);
        canvas.drawLines(line, mpaint);
        for(int i=0;i<snakeLength;i++){
            drawSnake(canvas,snake[i*2+0],snake[i*2+1],i,mpaint);
        }
        canvas.drawBitmap(snake_food, foodX, foodY, mpaint);
       
   
        mHolder.unlockCanvasAndPost(canvas);
       
    }
    public void drawSnake(Canvas canvas,int x,int y,int ishead,Paint paint){
        if(ishead==head){
            canvas.drawBitmap(snake_head, x, y, paint);
        }else {
            canvas.drawBitmap(snake_body, x, y, paint);
        }
    }

   
    public void SnakeRun() {
        while(isflag){
            while(snake_state){
                try {
                   
                    Thread.sleep(SLEEP_TIME);
                } catch (InterruptedException e) {
                   
                    e.printStackTrace();
                }
               
                    snakeMain();
                       snakeActivity.SnakeNum();
                    ondraw();
                   
                    postInvalidate();
               
            }
        }
       
    }

   
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
       
       
    }
   
    public void surfaceCreated(SurfaceHolder holder) {
        screen_h=getHeight();
        screen_w=getWidth();
       
   
   
   
    }
   


    public void surfaceDestroyed(SurfaceHolder holder) {

        isflag=false;
        snake_state=snake_pause;
    }
    //屏幕事件控制蛇
    public boolean onTouchEvent(MotionEvent event) {
       
        //按蛇头的坐标和手势得到的X/Y坐标位置的判断
        return isflag;
       
    }
    //滚轮事件控制蛇
    public boolean onTrackballEvent(MotionEvent event) {
        return isflag;
       
    }
     
    //按键事件控制蛇
   
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       
        if(keyCode==KeyEvent.KEYCODE_DPAD_UP){
            direction=DIR_UP;
            return true;
        }else if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
            direction=DIR_RIGHT;
             return true;
        }else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
            direction=DIR_DOWN;
             return true;
        }else if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
            direction=DIR_LEFT;
             return true;
        }else if(keyCode==KeyEvent.KEYCODE_DPAD_CENTER){
            if(snake_state==snake_runing){
                snake_state=snake_pause;
                   return true;
            }else {
                snake_state=snake_runing;
                   return true;
            }
   
        }
   
        return super.onKeyDown(keyCode, event);
       
    }
   //主方法
    public void snakeMain(){
        int stepX=0;
        int stepY=0;
       
        switch(direction){
        case DIR_UP:
            stepY=-snake_h;
            break;
        case DIR_RIGHT:
            stepX=snake_w;
            break;
        case DIR_DOWN:
            stepY=snake_h;
            break;
        case DIR_LEFT:
            stepX=-snake_w;
            break;
       
       
        }
        snakeMove(stepX,stepY);
        if(snakeIsDead()){
            isflag=false;
            snake_state=false;
   
        }
        if(isEatFood()){
            makeFood();
            snakeLength++;
            snakeMove(stepX,stepY);
        }
            }
    public int getSnakeLength(){

        return this.snakeLength;
       

       
    }
    public void setSnakeLength(int snakeLangth){
        this.snakeLength=snakeLangth;
    }
    //判断蛇身是否越界
    private boolean snakeIsDead(){
       
        if(snake[0]<=screen_start_w||snake[0]>=screen_w||snake[1]<=LINE_Y||snake[1]>=screen_h){
            return true;
        }
       
        for(int i=2;i<snakeLength;i++){
            if(snake[i*2+0]==snake[0]&&snake[i*2+1]==snake[1]){
                return true;
            }
        }
       
       
        return false;
    }
    //蛇的食物坐标
    public void makeFood(){
        foodX=random_food.nextInt(screen_w-snake_w);
        foodY=random_food.nextInt(screen_h-snake_h)+LINE_Y;
       
    }
    //判断蛇头是否和食物坐标相似
    public boolean isEatFood(){
       
        if(foodX<=snake[0]&&snake[0]<=foodX+snake_w&&foodY<=snake[1]&&snake[1]<=foodY+snake_h){
           
            return true;
        }
        return false;
    }
     //蛇身移动
    public void snakeMove(int snakeX,int snakeY){
   
         for(int i=snakeLength-1;i>0;i--){
             snake[i*2+0]=snake[(i-1)*2+0];
             snake[i*2+1]=snake[(i-1)*2+1];
         }
         

         //确定蛇头
        snake[0]+=snakeX;
        snake[1]+=snakeY;
    }
   
   
   

}

 

 

分享到:
评论

相关推荐

    android贪吃蛇游戏源码

    以下是对"android贪吃蛇游戏源码"的详细解读: 1. **用户界面(UI)设计**: - 使用Android Studio中的布局工具(如XML布局)创建游戏主界面,包含游戏区域、得分显示、开始/暂停按钮等元素。 - 游戏区域通常用一...

    我的Android贪吃蛇游戏

    《我的Android贪吃蛇游戏》是一款由个人开发者独立完成的移动平台游戏,旨在提升开发者自身的动手能力和巩固课堂所学的编程知识。贪吃蛇游戏,作为经典的休闲游戏,深受各年龄段玩家的喜爱,其简单易懂的规则和无尽...

    基于Android贪吃蛇游戏论文.doc

    【基于Android贪吃蛇游戏论文】的摘要指出,该课题旨在使用Java语言在Android平台上开发一款手机游戏。考虑到作者的知识范围和客观条件,选择开发一个单机版的贪吃蛇游戏。贪吃蛇游戏作为一款经典游戏,曾是诺基亚...

    Android 贪吃蛇游戏带电脑

    本篇将围绕这个主题,详细介绍Android贪吃蛇游戏的开发过程。 一、Android开发环境搭建 在开始开发之前,首先需要安装Android Studio,它是Google官方提供的集成开发环境(IDE),包含了构建、调试和发布Android...

    Android 贪吃蛇游戏源代码

    《Android 贪吃蛇游戏源代码解析与学习指南》 贪吃蛇游戏,作为一款经典的游戏,无论是在PC还是移动设备上,都深受玩家喜爱。Android平台上的贪吃蛇游戏,更是为开发者提供了一个良好的实践平台,让我们可以通过源...

    Android贪吃蛇(最终版)

    【Android贪吃蛇游戏开发详解】 Android平台上的贪吃蛇游戏是一款经典的休闲娱乐应用,它利用设备的重力感应功能来控制游戏中的蛇移动。在本文中,我们将深入探讨这款"Android贪吃蛇(最终版)"的实现原理、关键...

    Android贪吃蛇游戏源码

    【Android贪吃蛇游戏源码】是一个非常适合初学者和进阶者学习的Android开发资源,它提供了实现经典游戏“贪吃蛇”的完整代码。通过分析和理解这个源码,你可以深入学习Android应用开发的基本概念、游戏逻辑以及UI...

    android贪吃蛇游戏代码详解

    ### Android贪吃蛇游戏代码详解 #### 一、概述 本文将详细介绍一个简单的Android贪吃蛇游戏项目的代码实现。此项目包含三个主要的文件:`TileView.java`、`SnakeView.java`以及`Snake.java`。这三个文件共同构建了...

    android 贪吃蛇游戏源代码+分析

    本文将深入解析这个Android贪吃蛇游戏的源代码,并探讨其核心概念和技术实现。 首先,让我们从游戏的基本框架开始。在Android应用开发中,通常会使用Activity作为应用程序的主要组件。在这个贪吃蛇游戏中,Activity...

    android贪吃蛇游戏——snake

    这款由你提供的项目,"android贪吃蛇游戏——snake",显然是一款用Java或Kotlin语言实现的Android应用程序,它利用Android SDK中的图形库和事件处理机制来创建一个交互式的贪吃蛇游戏界面。 首先,我们要理解贪吃蛇...

    [Android游戏源码]-简单的贪吃蛇源码.rar_Android游戏源码_android_android 贪吃蛇_贪吃蛇_贪

    贪吃蛇游戏的核心部分主要涉及游戏循环、碰撞检测、食物生成和蛇的移动逻辑。 1. **游戏循环**:在Android中,游戏循环通常通过SurfaceView或者GLSurfaceView来实现。SurfaceView允许我们创建一个独立于主线程的...

    Mono For Android 贪吃蛇游戏源码

    【标题】 Mono For Android 贪吃蛇游戏源码 Mono for Android 是一个开发平台,允许程序员使用 C# 和 .NET Framework 来构建原生 Android 应用程序。本项目是一个将 C# 编写的贪吃蛇游戏移植到 Android 平台的例子...

    Android 贪吃蛇游戏

    综上所述,开发Android贪吃蛇游戏涵盖了Android UI设计、游戏逻辑实现、事件处理、动画效果制作以及资源管理等多个方面。每个环节都需要精心设计和优化,才能打造出一款用户喜爱的移动游戏。在实际开发过程中,...

    android贪吃蛇游戏

    总的来说,开发Android贪吃蛇游戏是一个结合编程基础、图形界面设计和用户体验优化的过程。通过这个项目,开发者不仅可以熟悉Android开发的基本流程,还能锻炼问题解决和创新思维能力。无论你是初学者还是有经验的...

    Android 贪吃蛇游戏增强版

    本项目是一个增强版的Android贪吃蛇游戏,它不仅包含了基础的游戏逻辑,还可能涉及了一些高级特性,比如动画效果、用户交互优化等。通过分析这个项目的源代码,我们可以深入了解Android应用开发的相关技术。 首先,...

    基于android贪吃蛇游戏().doc

    【标题】: 基于Android贪吃蛇游戏开发 【摘要】与【描述】中提到的是一个关于使用Java语言在Android平台上开发贪吃蛇游戏的本科毕业设计项目。作者对游戏的背景进行了简单介绍,并阐述了选择Android平台的原因,...

    android贪吃蛇游戏小游戏的实现.rar

    通过上述步骤,我们可以实现一个基本的Android贪吃蛇游戏。在实际开发中,还可以添加更多的功能,如分数排行榜、多级难度、游戏音效等,提高游戏的趣味性和挑战性。对于初学者,这是一个很好的学习项目,因为它涵盖...

Global site tag (gtag.js) - Google Analytics