写了一个简单的贪吃蛇游戏、、、
主要思路
一、用一个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贪吃蛇游戏源码"的详细解读: 1. **用户界面(UI)设计**: - 使用Android Studio中的布局工具(如XML布局)创建游戏主界面,包含游戏区域、得分显示、开始/暂停按钮等元素。 - 游戏区域通常用一...
《我的Android贪吃蛇游戏》是一款由个人开发者独立完成的移动平台游戏,旨在提升开发者自身的动手能力和巩固课堂所学的编程知识。贪吃蛇游戏,作为经典的休闲游戏,深受各年龄段玩家的喜爱,其简单易懂的规则和无尽...
【基于Android贪吃蛇游戏论文】的摘要指出,该课题旨在使用Java语言在Android平台上开发一款手机游戏。考虑到作者的知识范围和客观条件,选择开发一个单机版的贪吃蛇游戏。贪吃蛇游戏作为一款经典游戏,曾是诺基亚...
本篇将围绕这个主题,详细介绍Android贪吃蛇游戏的开发过程。 一、Android开发环境搭建 在开始开发之前,首先需要安装Android Studio,它是Google官方提供的集成开发环境(IDE),包含了构建、调试和发布Android...
《Android 贪吃蛇游戏源代码解析与学习指南》 贪吃蛇游戏,作为一款经典的游戏,无论是在PC还是移动设备上,都深受玩家喜爱。Android平台上的贪吃蛇游戏,更是为开发者提供了一个良好的实践平台,让我们可以通过源...
【Android贪吃蛇游戏开发详解】 Android平台上的贪吃蛇游戏是一款经典的休闲娱乐应用,它利用设备的重力感应功能来控制游戏中的蛇移动。在本文中,我们将深入探讨这款"Android贪吃蛇(最终版)"的实现原理、关键...
【Android贪吃蛇游戏源码】是一个非常适合初学者和进阶者学习的Android开发资源,它提供了实现经典游戏“贪吃蛇”的完整代码。通过分析和理解这个源码,你可以深入学习Android应用开发的基本概念、游戏逻辑以及UI...
### Android贪吃蛇游戏代码详解 #### 一、概述 本文将详细介绍一个简单的Android贪吃蛇游戏项目的代码实现。此项目包含三个主要的文件:`TileView.java`、`SnakeView.java`以及`Snake.java`。这三个文件共同构建了...
本文将深入解析这个Android贪吃蛇游戏的源代码,并探讨其核心概念和技术实现。 首先,让我们从游戏的基本框架开始。在Android应用开发中,通常会使用Activity作为应用程序的主要组件。在这个贪吃蛇游戏中,Activity...
这款由你提供的项目,"android贪吃蛇游戏——snake",显然是一款用Java或Kotlin语言实现的Android应用程序,它利用Android SDK中的图形库和事件处理机制来创建一个交互式的贪吃蛇游戏界面。 首先,我们要理解贪吃蛇...
贪吃蛇游戏的核心部分主要涉及游戏循环、碰撞检测、食物生成和蛇的移动逻辑。 1. **游戏循环**:在Android中,游戏循环通常通过SurfaceView或者GLSurfaceView来实现。SurfaceView允许我们创建一个独立于主线程的...
【标题】 Mono For Android 贪吃蛇游戏源码 Mono for Android 是一个开发平台,允许程序员使用 C# 和 .NET Framework 来构建原生 Android 应用程序。本项目是一个将 C# 编写的贪吃蛇游戏移植到 Android 平台的例子...
综上所述,开发Android贪吃蛇游戏涵盖了Android UI设计、游戏逻辑实现、事件处理、动画效果制作以及资源管理等多个方面。每个环节都需要精心设计和优化,才能打造出一款用户喜爱的移动游戏。在实际开发过程中,...
总的来说,开发Android贪吃蛇游戏是一个结合编程基础、图形界面设计和用户体验优化的过程。通过这个项目,开发者不仅可以熟悉Android开发的基本流程,还能锻炼问题解决和创新思维能力。无论你是初学者还是有经验的...
本项目是一个增强版的Android贪吃蛇游戏,它不仅包含了基础的游戏逻辑,还可能涉及了一些高级特性,比如动画效果、用户交互优化等。通过分析这个项目的源代码,我们可以深入了解Android应用开发的相关技术。 首先,...
【标题】: 基于Android贪吃蛇游戏开发 【摘要】与【描述】中提到的是一个关于使用Java语言在Android平台上开发贪吃蛇游戏的本科毕业设计项目。作者对游戏的背景进行了简单介绍,并阐述了选择Android平台的原因,...
通过上述步骤,我们可以实现一个基本的Android贪吃蛇游戏。在实际开发中,还可以添加更多的功能,如分数排行榜、多级难度、游戏音效等,提高游戏的趣味性和挑战性。对于初学者,这是一个很好的学习项目,因为它涵盖...