文章分类:移动开发
视图VIew的类的Snake的,主要关注的学习的类。
- packagecom.easyway.dev.android.snake;
-
importjava.util.ArrayList;
-
importjava.util.Random;
-
importandroid.content.Context;
-
importandroid.content.res.Resources;
-
importandroid.os.Bundle;
-
importandroid.os.Handler;
-
importandroid.os.Message;
-
importandroid.util.AttributeSet;
-
importandroid.util.Log;
-
importandroid.view.KeyEvent;
-
importandroid.view.View;
-
importandroid.widget.TextView;
-
-
publicclassSnakeViewextendsTileView{
-
privatestaticfinalStringTAG="SnakeView";
-
-
privateintmMode=READY;
-
publicstaticfinalintPAUSE=0;
-
publicstaticfinalintREADY=1;
-
publicstaticfinalintRUNNING=2;
-
publicstaticfinalintLOSE=3;
-
-
privateintmDirection=NORTH;
-
privateintmNextDirection=NORTH;
-
privatestaticfinalintNORTH=1;
-
privatestaticfinalintSOUTH=2;
-
privatestaticfinalintEAST=3;
-
privatestaticfinalintWEST=4;
-
-
privatestaticfinalintRED_STAR=1;
-
privatestaticfinalintYELLOW_STAR=2;
-
privatestaticfinalintGREEN_STAR=3;
-
-
privatelongmScore=0;
-
privatelongmMoveDelay=600;
-
-
privatelongmLastMove;
-
-
-
privateTextViewmStatusText;
-
-
privateArrayList<Coordinate>mSnakeTrail=newArrayList<Coordinate>();
-
privateArrayList<Coordinate>mAppleList=newArrayList<Coordinate>();
-
-
privatestaticfinalRandomRNG=newRandom();
-
-
privateRefreshHandlermRedrawHandler=newRefreshHandler();
-
-
classRefreshHandlerextendsHandler{
-
-
@Override
-
publicvoidhandleMessage(Messagemsg){
-
SnakeView.this.update();
-
SnakeView.this.invalidate();
- }
-
-
publicvoidsleep(longdelayMillis){
-
-
this.removeMessages(0);
-
-
sendMessageDelayed(obtainMessage(0),delayMillis);
- }
- };
-
-
publicSnakeView(Contextcontext,AttributeSetattrs){
-
super(context,attrs);
- initSnakeView();
- }
-
publicSnakeView(Contextcontext,AttributeSetattrs,intdefStyle){
-
super(context,attrs,defStyle);
- initSnakeView();
- }
-
-
privatevoidinitSnakeView(){
-
setFocusable(true);
-
Resourcesr=this.getContext().getResources();
-
-
resetTiles(4);
- loadTile(RED_STAR,r.getDrawable(R.drawable.redstar));
- loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar));
- loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar));
-
- }
-
-
-
privatevoidinitNewGame(){
- mSnakeTrail.clear();
- mAppleList.clear();
-
-
-
-
-
mSnakeTrail.add(newCoordinate(7,7));
-
mSnakeTrail.add(newCoordinate(6,7));
-
mSnakeTrail.add(newCoordinate(5,7));
-
mSnakeTrail.add(newCoordinate(4,7));
-
mSnakeTrail.add(newCoordinate(3,7));
-
mSnakeTrail.add(newCoordinate(2,7));
- mNextDirection=NORTH;
-
-
- addRandomApple();
- addRandomApple();
-
-
mMoveDelay=600;
-
-
mScore=0;
- }
-
-
privateint[]coordArrayListToArray(ArrayList<Coordinate>cvec){
-
intcount=cvec.size();
-
int[]rawArray=newint[count*2];
-
for(intindex=0;index<count;index++){
- Coordinatec=cvec.get(index);
-
rawArray[2*index]=c.x;
-
rawArray[2*index+1]=c.y;
- }
-
returnrawArray;
- }
-
-
publicBundlesaveState(){
-
Bundlemap=newBundle();
-
map.putIntArray("mAppleList",coordArrayListToArray(mAppleList));
-
map.putInt("mDirection",Integer.valueOf(mDirection));
-
map.putInt("mNextDirection",Integer.valueOf(mNextDirection));
-
map.putLong("mMoveDelay",Long.valueOf(mMoveDelay));
-
map.putLong("mScore",Long.valueOf(mScore));
-
map.putIntArray("mSnakeTrail",coordArrayListToArray(mSnakeTrail));
-
returnmap;
- }
-
-
privateArrayList<Coordinate>coordArrayToArrayList(int[]rawArray){
-
ArrayList<Coordinate>coordArrayList=newArrayList<Coordinate>();
-
intcoordCount=rawArray.length;
-
for(intindex=0;index<coordCount;index+=2){
-
Coordinatec=newCoordinate(rawArray[index],rawArray[index+1]);
- coordArrayList.add(c);
- }
-
returncoordArrayList;
- }
-
-
publicvoidrestoreState(Bundleicicle){
- setMode(PAUSE);
-
-
mAppleList=coordArrayToArrayList(icicle.getIntArray("mAppleList"));
-
mDirection=icicle.getInt("mDirection");
-
mNextDirection=icicle.getInt("mNextDirection");
-
mMoveDelay=icicle.getLong("mMoveDelay");
-
mScore=icicle.getLong("mScore");
-
mSnakeTrail=coordArrayToArrayList(icicle.getIntArray("mSnakeTrail"));
- }
-
-
@Override
-
publicbooleanonKeyDown(intkeyCode,KeyEventmsg){
-
if(keyCode==KeyEvent.KEYCODE_DPAD_UP){
-
if(mMode==READY|mMode==LOSE){
-
- initNewGame();
- setMode(RUNNING);
- update();
-
return(true);
- }
-
if(mMode==PAUSE){
-
- setMode(RUNNING);
- update();
-
return(true);
- }
-
if(mDirection!=SOUTH){
- mNextDirection=NORTH;
- }
-
return(true);
- }
-
if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
-
if(mDirection!=NORTH){
- mNextDirection=SOUTH;
- }
-
return(true);
- }
-
if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
-
if(mDirection!=EAST){
- mNextDirection=WEST;
- }
-
return(true);
- }
-
if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
-
if(mDirection!=WEST){
- mNextDirection=EAST;
- }
-
return(true);
- }
-
returnsuper.onKeyDown(keyCode,msg);
- }
-
-
publicvoidsetTextView(TextViewnewView){
- mStatusText=newView;
- }
-
-
publicvoidsetMode(intnewMode){
-
intoldMode=mMode;
- mMode=newMode;
-
if(newMode==RUNNING&oldMode!=RUNNING){
- mStatusText.setVisibility(View.INVISIBLE);
- update();
-
return;
- }
- Resourcesres=getContext().getResources();
-
CharSequencestr="";
-
if(newMode==PAUSE){
- str=res.getText(R.string.mode_pause);
- }
-
if(newMode==READY){
- str=res.getText(R.string.mode_ready);
- }
-
if(newMode==LOSE){
- str=res.getString(R.string.mode_lose_prefix)+mScore
- +res.getString(R.string.mode_lose_suffix);
- }
- mStatusText.setText(str);
- mStatusText.setVisibility(View.VISIBLE);
- }
-
-
privatevoidaddRandomApple(){
-
CoordinatenewCoord=null;
-
booleanfound=false;
-
while(!found){
-
-
-
intnewX=1+RNG.nextInt(mXTileCount-2);
-
intnewY=1+RNG.nextInt(mYTileCount-2);
-
newCoord=newCoordinate(newX,newY);
-
-
booleancollision=false;
-
intsnakelength=mSnakeTrail.size();
-
for(intindex=0;index<snakelength;index++){
-
-
if(mSnakeTrail.get(index).equals(newCoord)){
-
collision=true;
- }
- }
-
-
-
- found=!collision;
- }
-
if(newCoord==null){
-
Log.e(TAG,"SomehowendedupwithanullnewCoord!");
- }
-
- mAppleList.add(newCoord);
- }
-
-
publicvoidupdate(){
-
if(mMode==RUNNING){
-
longnow=System.currentTimeMillis();
-
if(now-mLastMove>mMoveDelay){
- clearTiles();
- updateWalls();
- updateSnake();
- updateApples();
- mLastMove=now;
- }
- mRedrawHandler.sleep(mMoveDelay);
- }
- }
-
-
privatevoidupdateWalls(){
-
for(intx=0;x<mXTileCount;x++){
-
setTile(GREEN_STAR,x,0);
-
setTile(GREEN_STAR,x,mYTileCount-1);
- }
-
for(inty=1;y<mYTileCount-1;y++){
-
setTile(GREEN_STAR,0,y);
-
setTile(GREEN_STAR,mXTileCount-1,y);
- }
- }
-
-
privatevoidupdateApples(){
-
for(Coordinatec:mAppleList){
- setTile(YELLOW_STAR,c.x,c.y);
- }
- }
-
-
privatevoidupdateSnake(){
-
booleangrowSnake=false;
-
-
-
Coordinatehead=mSnakeTrail.get(0);
-
-
CoordinatenewHead=newCoordinate(1,1);
-
- mDirection=mNextDirection;
-
switch(mDirection){
-
caseEAST:{
-
newHead=newCoordinate(head.x+1,head.y);
-
break;
- }
-
caseWEST:{
-
newHead=newCoordinate(head.x-1,head.y);
-
break;
- }
-
caseNORTH:{
-
newHead=newCoordinate(head.x,head.y-1);
-
break;
- }
-
caseSOUTH:{
-
newHead=newCoordinate(head.x,head.y+1);
-
break;
- }
- }
-
-
-
if((newHead.x<1)||(newHead.y<1)||(newHead.x>mXTileCount-2)
-
||(newHead.y>mYTileCount-2)){
- setMode(LOSE);
-
return;
- }
-
-
intsnakelength=mSnakeTrail.size();
-
for(intsnakeindex=0;snakeindex<snakelength;snakeindex++){
- Coordinatec=mSnakeTrail.get(snakeindex);
-
if(c.equals(newHead)){
- setMode(LOSE);
-
return;
- }
- }
-
-
-
intapplecount=mAppleList.size();
-
for(intappleindex=0;appleindex<applecount;appleindex++){
- Coordinatec=mAppleList.get(appleindex);
-
if(c.equals(newHead)){
- mAppleList.remove(c);
- addRandomApple();
-
- mScore++;
-
-
mMoveDelay*=0.9;
-
growSnake=true;
- }
- }
-
-
-
mSnakeTrail.add(0,newHead);
-
-
if(!growSnake){
-
mSnakeTrail.remove(mSnakeTrail.size()-1);
- }
-
intindex=0;
-
for(Coordinatec:mSnakeTrail){
-
if(index==0){
- setTile(YELLOW_STAR,c.x,c.y);
-
}else{
- setTile(RED_STAR,c.x,c.y);
- }
- index++;
- }
- }
-
-
privateclassCoordinate{
-
publicintx;
-
publicinty;
-
publicCoordinate(intnewX,intnewY){
- x=newX;
- y=newY;
- }
-
publicbooleanequals(Coordinateother){
-
if(x==other.x&&y==other.y){
-
returntrue;
- }
-
returnfalse;
- }
-
@Override
-
publicStringtoString(){
-
return"Coordinate:["+x+","+y+"]";
- }
- }
-
- }
分享到:
相关推荐
在贪吃蛇游戏中,我们需要在循环中不断更新蛇的位置,判断是否吃到食物,以及检查蛇身是否撞到边界或自身。 2. **碰撞检测**:碰撞检测是贪吃蛇游戏中的关键部分,用于判断蛇头是否碰到食物或者蛇身。这部分通常...
《基于Android的贪吃蛇游戏app》是一款专为Android平台设计的经典游戏应用,它将我们熟知的贪吃蛇游戏融入到了移动设备中,为用户带来了便捷且趣味的娱乐体验。这款应用不仅具备了贪吃蛇游戏的所有基本功能,还可能...
【标签】"Snake"代表了这个游戏的主题,即经典的贪吃蛇游戏。这个标签表明了项目的目标是复现这款在早期手机上广泛流行的游戏,玩家通过控制蛇的移动来吃食物,每吃到一个食物,蛇的长度就会增加,同时游戏难度也会...
以下是对"android贪吃蛇游戏源码"的详细解读: 1. **用户界面(UI)设计**: - 使用Android Studio中的布局工具(如XML布局)创建游戏主界面,包含游戏区域、得分显示、开始/暂停按钮等元素。 - 游戏区域通常用一...
贪吃蛇游戏作为一种经典的电子游戏,拥有广泛的玩家群体和长久的...开发者在实践中需要深入理解Android应用的生命周期、用户界面设计、事件处理机制和游戏逻辑编写等方面的知识,才能开发出稳定、好玩的贪吃蛇游戏。
### 基于Android的贪吃蛇游戏开发 #### 一、课程实训目的及要求 本实训项目旨在通过设计和实现一款基于Android平台的贪吃蛇游戏,加深学生对Android应用开发的理解,掌握游戏开发的基本流程和技术要点。具体要求...
《Android 贪吃蛇游戏源代码解析与学习指南》 贪吃蛇游戏,作为一款经典的游戏,无论是在PC还是移动设备上,都深受玩家喜爱。Android平台上的贪吃蛇游戏,更是为开发者提供了一个良好的实践平台,让我们可以通过源...
【Android贪吃蛇游戏开发详解】 Android平台上的贪吃蛇游戏是一款经典的休闲娱乐应用,它利用设备的重力感应功能来控制游戏中的蛇移动。在本文中,我们将深入探讨这款"Android贪吃蛇(最终版)"的实现原理、关键...
在"SnakeAndroid"这个压缩包中,包含了完整的Android贪吃蛇游戏源码。通过阅读和理解这些代码,你可以学习到如何在Android环境中实现游戏循环、如何处理用户输入、如何进行图形绘制以及如何设计简单的游戏逻辑。 ...
本项目旨在通过设计与开发一款基于Android平台的贪吃蛇游戏,深入学习Java程序设计基本技术,掌握Android环境下Java程序的开发技巧,熟悉游戏开发的全过程,包括需求分析、概要设计、详细设计等阶段,以及熟练运用...
这个小项目是针对Android平台开发的一个贪吃蛇游戏的示例,旨在帮助开发者学习和理解Android应用程序的设计与实现。 在Android平台上开发贪吃蛇游戏,主要涉及以下几个关键知识点: 1. **Android Studio集成开发...
【Android贪吃蛇游戏源码】是一个非常适合初学者和进阶者学习的Android开发资源,它提供了实现经典游戏“贪吃蛇”的完整代码。通过分析和理解这个源码,你可以深入学习Android应用开发的基本概念、游戏逻辑以及UI...
【基于Android贪吃蛇游戏论文】的摘要指出,该课题旨在使用Java语言在Android平台上开发一款手机游戏。考虑到作者的知识范围和客观条件,选择开发一个单机版的贪吃蛇游戏。贪吃蛇游戏作为一款经典游戏,曾是诺基亚...
在Android系统上开发游戏,尤其是经典的贪吃蛇游戏,是一个很好的学习实践项目,它可以帮助开发者深入理解Android应用的基本架构、游戏循环机制以及图形绘制。这个"android系统上的贪吃蛇游戏源码"提供了完整的实现...
本文将深入解析这个Android贪吃蛇游戏的源代码,并探讨其核心概念和技术实现。 首先,让我们从游戏的基本框架开始。在Android应用开发中,通常会使用Activity作为应用程序的主要组件。在这个贪吃蛇游戏中,Activity...
通过分析这个Android贪吃蛇游戏的源码,我们可以学习到Android图形编程、事件处理、游戏循环、碰撞检测等多个方面的重要知识。理解并实践这些概念对于提升Android游戏开发技能非常有帮助。如果你想要深入研究,可以...
本资源是基于Android移动应用开发,用Android studio实现的期末作业,贪吃蛇小游戏。功能比较少,玩家可通过相应功能按键实现小游戏运行,碰到墙壁游戏结束 所使用配置: 1. Android studio 2022 Electric Eel(2022....
通过以上分析可以看出,这个简单的Android贪吃蛇游戏项目虽然代码量不多,但是涵盖了Android应用开发的基础知识和技术点,对于初学者来说是非常好的学习案例。希望本文能够帮助读者理解游戏开发的基本流程,并激发对...