基本信息
源码名称:android 俄罗斯方块 游戏源码
源码大小:0.52M
文件格式:.rar
开发语言:Java
更新时间:2016-11-28
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
package com.chrislee.tetris; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; import android.view.View; public class TetrisView extends View implements Runnable{ final static int SCREEN_WIDTH = 320; final static int SCREEN_HEIGHT = 455; final int STATE_MENU = 0; final int STATE_PLAY = 1; final int STATE_PAUSE = 2; final int STATE_OVER = 3; // final int MENU_NEWGAME = 10; // final int MENU_SETTING = 11; // final int MENU_HELP = 12; // // final int SETTING_MUSIC_ON = 21; // final int SETTING_MUSIC_OFF = 22; // final int SETTING_LEVEL = 23; // final int OPTION_RESUME = 31; // final int OPTION_MENU = 32; // final int OPTION_QUIT = 33; public static final int MAX_LEVEL = 6; public static final String TAG = "TetrisView"; public static final String DATAFILE = "save.dt"; int mGamestate = STATE_PLAY; int mScore = 0; int mSpeed = 1; int mDeLine = 0; boolean mIsCombo = false; // boolean mIsPaused = false; boolean mIsVoice = true; long mMoveDelay = 600; long mLastMove = 0; // int mAtPause = OPTION_RESUME; private Context mContext = null; private Paint mPaint = new Paint(); RefreshHandler mRefreshHandler = null; //RefreshHandler mRefreshHandler = null; TileView mCurrentTile = null; TileView mNextTile = null; Court mCourt = null; ResourceStore mResourceStore = null; /////////// MusicPlayer mMPlayer = null; public TetrisView(Context context) { super(context); init(context); // TODO Auto-generated constructor stub } protected void init(Context context) { mContext = context; mCurrentTile = new TileView(context); Log.i("tetris","mCurrentTile builed"); mNextTile = new TileView(context); mCourt = new Court(context); mRefreshHandler = new RefreshHandler(this); mResourceStore = new ResourceStore(context); //////////////////////////////////////// mMPlayer = new MusicPlayer(context); // setLevel(1); mPaint.setAntiAlias(true); mPaint.setColor(Color.RED); setFocusable(true); new Thread(this).start(); } public void logic() { switch(mGamestate) { case STATE_MENU: // mGamestate = STATE_PLAY; break; case STATE_PLAY: //startGame(); playGame(); break; case STATE_PAUSE: // if(mAtPause == OPTION_RESUME) // { // mIsPaused = false; // mGamestate = STATE_PLAY; // break; // } //if(mPusedChoose = ) break; case STATE_OVER: // startGame(); // mGamestate = STATE_PLAY; break; default:; } } public void startGame() { mGamestate = STATE_PLAY; mCourt.clearCourt(); mCurrentTile = new TileView(mContext); mNextTile = new TileView(mContext); // mSpeed = speed choosed // mScore // mLine setLevel(1); mScore = 0; mDeLine = 0; mIsPaused = false; mIsCombo = false; playGame(); } public void playGame() { long now = System.currentTimeMillis(); if(now - mLastMove > mMoveDelay) { if(mIsPaused) { return; } if(mIsCombo) { mCourt.placeTile(mCurrentTile); ////// mMPlayer.playMoveVoice(); if(mCourt.isGameOver() ) { mGamestate = STATE_OVER; return; } int line = mCourt.removeLines(); if(line > 0 ) { mMPlayer.playBombVoice(); } mDeLine = line; countScore(line); mCurrentTile = mNextTile; mNextTile = new TileView(mContext); mIsCombo = false; } moveDown(); mLastMove = now; } } private void countScore(int line) { switch(line) { case 1: mScore = 100;break; case 2: mScore = 300;break; case 3: mScore = 600;break; case 4: mScore = 1000;break; default: ; } if(mScore >= 2000 && mScore <4000) { setLevel(2); } else if(mScore >= 4000 && mScore < 6000) { setLevel(3); } else if(mScore >= 6000 && mScore < 8000) { setLevel(4); } else if(mScore >= 8000 && mScore < 10000) { setLevel(5); } else if(mScore >= 10000) { setLevel(6); } } protected void onDraw(Canvas canvas) { switch(mGamestate) { case STATE_MENU: paintMenu(canvas); break; case STATE_PLAY: paintGame(canvas); break; case STATE_PAUSE: paintPause(canvas); break; case STATE_OVER: paintOver(canvas); break; default:; } } public boolean isGameOver() { return mCourt.isGameOver(); } public boolean onKeyDown(int keyCode,KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_DPAD_UP: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { rotate(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_DOWN: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { moveDown(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_LEFT: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { moveLeft(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_RIGHT: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { moveRight(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_ENTER: ; case KeyEvent.KEYCODE_DPAD_CENTER: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { fastDrop(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; // case KeyEvent.KEYCODE_S: if(mGamestate == STATE_PLAY) { mIsPaused = true; } else if(mGamestate == STATE_PAUSE) { mIsPaused = false; } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_SPACE: mIsPaused = !mIsPaused; if(mIsPaused) { mRefreshHandler.pause(); } else { mRefreshHandler.resume(); } break; default: ; } return super.onKeyDown(keyCode,event); } private void rotate() { // check if(!mIsCombo) mCurrentTile.rotateOnCourt(mCourt); } private void moveDown() { if(!mIsCombo) { if( ! mCurrentTile.moveDownOnCourt(mCourt) ) mIsCombo = true; } } private void moveLeft() { if(!mIsCombo) { mCurrentTile.moveLeftOnCourt(mCourt); } } private void moveRight() { if(!mIsCombo) { mCurrentTile.moveRightOnCourt(mCourt); } } private void fastDrop() { if(!mIsCombo) { mCurrentTile.fastDropOnCourt(mCourt); mIsCombo = true; } } private void paintMenu(Canvas canvas) { DrawTool.paintImage(canvas,mResourceStore.getMenuBackground(),0,0); DrawTool.paintImage(canvas,mResourceStore.getMenu(),0,SCREEN_HEIGHT/2 - mResourceStore.getMenu().getHeight()/2 ); } private void paintGame(Canvas canvas) { mCourt.paintCourt(canvas); mCurrentTile.paintTile(canvas); //mNextTile.paintTile(canvas); mPaint.setTextSize(20); paintNextTile(canvas); paintSpeed(canvas); paintScore(canvas); paintDeLine(canvas); } private void paintNextTile(Canvas canvas) { int i,j; for(i = 0;i<4;i ) { for(j = 0;j<4;j ) { if(mNextTile.mTile[i][j] != 0) { DrawTool.paintImage( canvas,mResourceStore.getBlock(mNextTile.getColor()-1), (int)(Court.BEGIN_DRAW_X getBlockDistance(Court.COURT_WIDTH) getBlockDistance((float) (i 0.5)) ), (int)( getBlockDistance((float)(j 0.5) ) ) ); } } } } private void paintSpeed(Canvas canvas) { mPaint.setColor(Color.BLUE); canvas.drawText("等级:",getBlockDistance(Court.COURT_WIDTH) getRightMarginToCourt(), getBlockDistance(9),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mSpeed),getBlockDistance(Court.COURT_WIDTH) 2*getRightMarginToCourt(), getBlockDistance(11),mPaint); } private void paintScore(Canvas canvas) { mPaint.setColor(Color.BLUE); canvas.drawText("得分:",getBlockDistance(Court.COURT_WIDTH) getRightMarginToCourt(), getBlockDistance(13),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mScore),getBlockDistance(Court.COURT_WIDTH) 2*getRightMarginToCourt(), getBlockDistance(15),mPaint); } private void paintDeLine(Canvas canvas) { mPaint.setColor(Color.BLUE); canvas.drawText("消去行数:",getBlockDistance(Court.COURT_WIDTH) getRightMarginToCourt(), getBlockDistance(17),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mDeLine),getBlockDistance(Court.COURT_WIDTH) 2*getRightMarginToCourt(), getBlockDistance(19),mPaint); } private float getBlockDistance(float blockNum) { return blockNum * Court.BLOCK_WIDTH; } private float getRightMarginToCourt() { return (float)10.0; } private void paintPause(Canvas canvas) { } private void paintOver(Canvas canvas) { paintGame(canvas); Paint paint = new Paint(); paint.setTextSize(40); paint.setAntiAlias(true); paint.setARGB(0xe0,0xff,0x00,0x00); canvas.drawText("Game Over",getBlockDistance(1),getBlockDistance(Court.COURT_HEIGHT/2-2),paint); //DrawTool.paintImage(canvas,mResourceStore.getGameover(),0,SCREEN_HEIGHT/2 - mResourceStore.getGameover().getHeight()/2 ); } @Override public void run() { // TODO Auto-generated method stub while(!Thread.currentThread().isInterrupted() ) { Message ms = new Message(); ms.what = RefreshHandler.MESSAGE_REFRESH; this.mRefreshHandler.sendMessage(ms); try { Thread.sleep(/*RefreshHandler.DELAY_MILLIS*/mMoveDelay); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } } public void setLevel(int level) { mSpeed = level; mMoveDelay = (long) (600*(1.0 - (double)mSpeed / 7.0 ) ); } public void setVoice(boolean isVoice) { mIsVoice = isVoice; mMPlayer.setMute(!mIsVoice); } public void restoreGame() { Properties pro = new Properties(); try { FileInputStream in = mContext.openFileInput(DATAFILE); pro.load(in); in.close(); } catch(IOException e) { Log.i(TAG,"file open failed in restoreGame()"); return; } mGamestate = Integer.valueOf(pro.get("gamestate").toString() ); mSpeed = Integer.valueOf(pro.get("speed").toString() ); setLevel(mSpeed); mScore = Integer.valueOf(pro.get("score").toString() ); mDeLine = Integer.valueOf(pro.get("deLine").toString() ); mIsVoice = Boolean.valueOf(pro.get("isVoice").toString() ); mIsCombo = Boolean.valueOf(pro.get("isCombo").toString() ); mIsPaused = Boolean.valueOf(pro.get("isPaused").toString() ); restoreCourt(pro); restoreTile(pro,mCurrentTile); restoreTile(pro,mNextTile); } private void restoreCourt(Properties pro) { int[][] matrix = mCourt.getMatrix(); int i,j; for(i = 0;i<Court.COURT_WIDTH;i ) { for(j = 0;j<Court.COURT_HEIGHT;j ) { matrix[i][j] = Integer.valueOf(pro.get("courtMatrix" i j).toString() ); } } } private void restoreTile(Properties pro,TileView tile) { int[][] matrix = tile.getMatrix(); int i,j; for(i = 0;i<4;i ) { for(j = 0;j<4;j ) { matrix[i][j] = Integer.valueOf(pro.get("tileMatrix" i j).toString() ); } } tile.setColor(Integer.valueOf(pro.get("tileColor").toString() )); tile.setShape(Integer.valueOf(pro.get("tileShape").toString() )); tile.setOffsetX(Integer.valueOf(pro.get("tileOffsetX").toString() )); tile.setOffsetY(Integer.valueOf(pro.get("tileOffsetY").toString() )); } public void saveGame() { Properties pro = new Properties(); pro.put("gamestate",String.valueOf(mGamestate)); pro.put("speed",String.valueOf(mSpeed)); pro.put("score",String.valueOf(mScore)); pro.put("deLine",String.valueOf(mDeLine)); Boolean b = new Boolean(mIsVoice); pro.put("isVoice",b.toString()); b = new Boolean(mIsCombo); pro.put("isCombo",b.toString()); b = new Boolean(mIsPaused); pro.put("isPaused",b.toString()); saveCourt(pro); saveTile(pro,mCurrentTile); saveTile(pro,mNextTile); try { FileOutputStream stream = mContext.openFileOutput(DATAFILE,Context.MODE_WORLD_WRITEABLE); pro.store(stream,""); stream.close(); } catch(IOException e) { Log.i(TAG,"ioexeption in saveGame()"); return; } } private void saveCourt(Properties pro) { int[][] court = mCourt.getMatrix(); int i,j; for(i = 0;i<Court.COURT_WIDTH;i ) { for(j = 0;j<Court.COURT_HEIGHT;j ) { pro.put("courtMatrix" i j,String.valueOf(court[i][j]) ); } } } private void saveTile(Properties pro,TileView tile) { int[][] matrix = tile.getMatrix(); int i,j; for(i =0;i<4;i ) { for(j = 0;j<4;j ) { pro.put("tileMatrix" i j,String.valueOf(matrix[i][j]) ); } } pro.put("tileColor",String.valueOf(tile.getColor() ) ); pro.put("tileShape",String.valueOf(tile.getShape() ) ); pro.put("tileOffsetX",String.valueOf(tile.getOffsetX() ) ); pro.put("tileOffsetY",String.valueOf(tile.getOffsetY() ) ); } public void onPause() { mRefreshHandler.pause(); mIsPaused = true; } public void onResume() { mRefreshHandler.resume(); mIsPaused = false; } public void freeResources() { mMPlayer.free(); } }