`
wo_deqing
  • 浏览: 64158 次
文章分类
社区版块
存档分类
最新评论

android 俄罗斯方块实现

 
阅读更多
1、入口类:DrawActivity
package com.ray.graph;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class DrawActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//以下去掉标题和全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        GameView view = new GameView(this);
        setContentView(view);
    }
}


2、视图类:GameView ,视视图会展现于主界面上
package com.ray.graph;

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;

public class GameView extends View {

private Shape shape;

private Drawable d;
Ground ground = new Ground();
public GameView(Context context) {
super(context);
shape = ShapeFactory.getShape();
d = context.getResources().getDrawable(R.drawable.block);
this.setFocusable(true);
//new Thread(this).run();
schedule();
}

@Override
protected void onDraw(Canvas canvas) {
Log.i("game:  ", "onDraw...");
super.onDraw(canvas);
shape.draw(canvas, d);
ground.draw(canvas, d);
/*
* Paint paint = new Paint(); paint.setColor(Color.RED);
* canvas.drawRect(20, 20, 100, 100, paint);
*/
}

public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: shape.rotate(); break; case KeyEvent.KEYCODE_DPAD_DOWN: if (shape.checkBound(Shape.DOWN, ground)) shape.moveDown(ground); break; case KeyEvent.KEYCODE_DPAD_LEFT: if (shape.checkBound(Shape.LEFT, ground)) shape.moveLeft(); break; case KeyEvent.KEYCODE_DPAD_RIGHT: if (shape.checkBound(Shape.RIGHT, ground)) shape.moveRight(); break; default: break; } return super.onKeyDown(keyCode, event); }

private void schedule()
{
Timer nT1 = new Timer();
       nT1.schedule(new TimerTask(){ //计划运行时间间隔
               public void run(){
                   refresh(); //过3秒调用一下refresh()
               }
             },0,500);
}
public void refresh(){ //auto down if (shape.checkBound(Shape.DOWN, ground)){ shape.moveDown(ground); this.postInvalidate(); //使用postInvalidate();刷新 } else{//generator new block ground.add(shape.getLeft(), shape.getTop(), shape); ground.removeRow(); shape = ShapeFactory.getShape(); } }

}



3、型状类:Shape 
package com.ray.graph;

import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.Log;

public class Shape {
private int left;
private int top;
public static final int LEFT = 1, RIGHT = 2, DOWN = 3, ROTATE = 4;
public boolean checkBound(int action, Ground ground) {
int tempTop = top;
int tempLeft = left;
switch (action) {
case LEFT:
tempLeft--;
break;
case RIGHT:
tempLeft++;
break;
case DOWN:
tempTop++;
break;
case ROTATE:
break;

default:
break;
}
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
if (check(x, y)) {
if (x + tempLeft < 0 || x + tempLeft >= GameConfig.COLS
|| y + tempTop >= GameConfig.ROWS || ground.check(tempLeft, tempTop, x, y)) {
return Boolean.FALSE;
}
}
}
}
return Boolean.TRUE;
}
//[status][graph detail information]
private int[][] body;
private int status;//block status
private int type;//type of block
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int[][] getBody() {
return body;
}
public void setBody(int[][] body) {
this.body = body;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getLeft() {
return left;
}
public void setLeft(int left) {
this.left = left;
}
public int getTop() {
return top;
}
public void setTop(int top) {
this.top = top;
}
//move left
public void moveLeft() {
Log.i("game", "move left");
left--;
}
//move right
public void moveRight() {
Log.i("game", "move riht");
left++;
}
//move down
//must controller multiple thread(1-refresh schedule, 2-event) public synchronized void moveDown(Ground ground) { Log.i("game", "move down..."+top); if (checkBound(Shape.DOWN, ground)) top ++; }

public void rotate(){
status = (status + 1) % body.length; 
}
//draw this shape
public void draw(Canvas canvas, Drawable d) {
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
if (check(x, y)) {//draw
int tempX = (x + left) * GameConfig.CELL_SIZE;
int tempY = (y + top) * GameConfig.CELL_SIZE;
int right = tempX + GameConfig.CELL_SIZE;
int bottom = tempY + GameConfig.CELL_SIZE;
d.setBounds(tempX, tempY, right, bottom);
d.draw(canvas);
//Log.i("game tempY", String.valueOf(tempY));
}
}
}
}
/*
* check the position is 1, if the position is 1, them draw it
* 每种图都有4种型状,status表示那种型状
* 4 * y + x:因为每种图型都是一个4 * 4的正方式组成,4 * y相当于先算y轴是否为1,
* 由draw可看出,每一个x数值都有4个y轴的值(x = 0; y:0,4,8, 12)
*/
public boolean check(int x, int y){
return body[status][4 * y + x] == 1;
}
}


4、产生图型类:ShapeFactory
package com.ray.graph;

import java.util.Random;

public class ShapeFactory {

// 方块的形状 第一组代表方块类型有S、Z、L、J、I、O、T 7种
// 第二组为图型的型状态
//每三组图型数据,根据这些数来描绘在view中
private final static int shapes[][][] = new int[][][] {
// i
{ { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
// s
{ { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } },
// z
{ { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
// J
{ { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// o(田字)
{ { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// l(竖右勾)
{ { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
// T
{ { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };

public static Shape getShape(){
Shape shape = new Shape();
int type = new Random().nextInt(shapes.length);
shape.setBody(shapes[type]);
shape.setStatus(0);
return shape;
}
}

5、手机基本信息类:GameConfig
package com.ray.graph;

public class GameConfig {

public static final int CELL_SIZE = 20;
//480 * 800, screen information, you can see below 6 point
public static final int ROWS = 40;
public static final int COLS = 24;
}

6. manager has been drawed block
package com.ray.graph;

import android.graphics.Canvas;
import android.graphics.drawable.Drawable;

/**
 * manager has been drawed block
 * 
 * @author ray
 *
 */
public class Ground {

public int[][] body = new int[GameConfig.COLS][GameConfig.ROWS];
public void draw(Canvas canvas, Drawable d) {
for (int x = 0; x < GameConfig.COLS; x++) {
for (int y = 0; y < GameConfig.ROWS; y++) {
if (body[x][y] == 1) {
int tempX = x * GameConfig.CELL_SIZE;
int tempY = y * GameConfig.CELL_SIZE;
int right = tempX + GameConfig.CELL_SIZE;
int bottom = tempY + GameConfig.CELL_SIZE;
d.setBounds(tempX, tempY, right, bottom);
d.draw(canvas);
}
}
}
}
/**
* remember drawed block 
* 
* @param type block type(seven type)
* @param status block status
* @param left x coordinate 
* @param top y coordinate
*/
public void add(int left, int top, Shape shape) {
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
if (shape.check(x, y)){
try{
body[left + x][top + y] = 1;  
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
/**
* check the graph can down
* true: don't down, otherwise, down
* @param left
* @param top
* @param x
* @param y
* @return
*/
public boolean check(int left, int top, int x, int y){
if (body[left + x][top + y] == 1) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
/**
* remove rows
*/
public void removeRow() {
int c = 0;
int removeRows = 0;//counter 
for (int y = GameConfig.ROWS - 1; y > 0; y--) {//y coordinate
for (int x = 0; x < GameConfig.COLS; x++) {//x coordinate
if (body[x][y] == 1){
c++;
if (c == GameConfig.COLS) {//should remove the row
removeRows++;
for (int j = y; j > 0; j--) {//reset all block in body y coordinate
for (int z = 0; z < GameConfig.COLS; z++) {//x coordinate
body[z][j] = body[z][j - 1];
}
}
y++;//because the row has fall down one row.
}
}
}
c = 0;
}
counter(removeRows);
}
/**
* counter fen
* @param removeRows
*/
public void counter(int removeRows) {
}
}



7、retrieve screen information
package com.ray.graph;

import android.content.Context;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;

public class BlockUtil {

public static String getDisplayMetrics(Context cx) {
   String str = "";
   DisplayMetrics dm = new DisplayMetrics();
   dm = cx.getApplicationContext().getResources().getDisplayMetrics();
   int screenWidth = dm.widthPixels;
   int screenHeight = dm.heightPixels;
   float density = dm.density;
   float xdpi = dm.xdpi;
   float ydpi = dm.ydpi;
   str += "The absolute width:" + String.valueOf(screenWidth) + "pixels\n";
   str += "The absolute heightin:" + String.valueOf(screenHeight) + "pixels\n";
   str += "The logical density of the display.:" + String.valueOf(density) +  "\n";
   str += "X dimension :" + String.valueOf(xdpi) + "pixels per inch\n";
   str += "Y dimension :" + String.valueOf(ydpi) + "pixels per inch\n";
   return str;
}
public static int getScreenWidth(WindowManager windowManager) {
Display display = windowManager.getDefaultDisplay();
return display.getWidth();
}
public static int getScreenHeight(WindowManager windowManager) {
Display display = windowManager.getDefaultDisplay();
return display.getHeight();
}
}



分享到:
评论

相关推荐

    android俄罗斯方块

    本文将围绕“android俄罗斯方块”这一主题,深入探讨其设计与实现,包括游戏逻辑、界面设计、特殊功能以及用户体验优化等方面。 1. **游戏逻辑** 俄罗斯方块的核心是其游戏逻辑,它基于7种基础形状(T、S、Z、I、O...

    android俄罗斯方块源码

    首先,我们要明白Android俄罗斯方块的基本功能包括:方块生成、下落、旋转、消除行、得分计算以及游戏结束条件判断等。这些功能的实现主要依赖于二维数组来存储游戏板状态,以及对数组的更新操作。 1. **方块生成**...

    Android俄罗斯方块游戏

    《Android俄罗斯方块游戏开发详解》 在移动设备上,Android平台因其开源性和广泛的设备覆盖范围,成为开发者们实现各种游戏应用的理想选择。本篇将深入探讨如何在Android环境中开发一款经典的俄罗斯方块游戏,涉及...

    android 俄罗斯方块源码

    "android 俄罗斯方块源码"是一个示例项目,它基于官方版的贪吃蛇源码进行修改,展示了如何在Android环境中实现经典游戏俄罗斯方块。这个项目可以帮助初学者理解Android游戏开发的基本原理,以及如何将一个简单的概念...

    Android 俄罗斯方块源码

    在Android平台上实现一款经典的俄罗斯方块游戏,开发者需要掌握一系列的Android开发技术和游戏编程原理。以下是对这个"Android 俄罗斯方块源码"项目中涉及的知识点的详细说明: 1. **Android SDK**:Android应用的...

    Android俄罗斯方块游戏源码

    通过对这个“Android俄罗斯方块游戏源码”的分析,我们可以了解到Android游戏开发的基本流程和关键技巧,包括游戏逻辑实现、用户交互处理、图形渲染以及性能优化等。这对于提升Android开发技能,尤其是游戏开发方向...

    Android俄罗斯方块源代码

    【Android俄罗斯方块源代码】是一个专门为Android平台开发的经典游戏——俄罗斯方块的源代码实现。这个项目展示了如何在Android环境中构建一个功能完备的游戏应用,是学习Android游戏开发的绝佳实例。 1. **Android...

    Android版俄罗斯方块

    在Android版俄罗斯方块中,可以利用bmob的服务来实现在线排行榜、用户登录等功能,让玩家可以与全球的玩家竞技,增加游戏的趣味性和互动性。 综上所述,开发Android版俄罗斯方块不仅涉及基本的UI设计和事件处理,还...

    Android游戏-俄罗斯方块游戏源码(java实现,可作学习及课设使用,附运行教程)

    【安卓程序——俄罗斯方块游戏】(1)一个包含源代码和全部配置文件的完整安卓工程包。此程序是一个经典的俄罗斯方块游戏,它可以在安卓设备上运行,无论是手机还是平板电脑。这个程序非常适合初学者学习安卓开发,...

    android实现俄罗斯方块

    在Android平台上实现俄罗斯方块是一项涉及图形界面设计、游戏逻辑编程和用户交互处理的任务。以下是对这个项目的一些关键知识点的详细解释: 1. **Android开发环境**:首先,你需要一个安装了Android Studio的开发...

    Android俄罗斯方块代码

    《Android版俄罗斯方块代码详解》 Android版的俄罗斯方块是一款经典的休闲游戏,它将传统的俄罗斯方块游戏与现代移动设备的特性相结合,尤其在Java编程语言的支持下,为玩家提供了独特的游戏体验。本篇将深入探讨这...

    Android俄罗斯方块游戏源码.zip

    《Android俄罗斯方块游戏源码解析》 在深入探讨Android平台上的俄罗斯方块游戏源码之前,我们首先要了解一些基础知识。俄罗斯方块是一款经典的游戏,起源于1984年,由苏联程序员阿列克谢·帕基特诺夫设计。它的玩法...

    安卓Android俄罗斯方块游戏--完整游戏项目源码

    在本项目中,我们关注的是一个基于Android平台的俄罗斯方块游戏。这是一款经典的游戏,由一系列不同形状的方块组成,玩家需要控制...总之,这个Android俄罗斯方块游戏项目是学习移动游戏开发和Android编程的绝佳实例。

    android 实现俄罗斯方块游戏 代码 好玩

    在Android平台上实现一款俄罗斯方块游戏,涉及到许多关键的技术点,包括图形绘制、事件处理、游戏逻辑以及用户交互。下面将详细阐述这些方面。 首先,俄罗斯方块的基础是图形界面的构建。在Android中,我们可以使用...

    android实现俄罗斯方块.rar

    在Android平台上实现俄罗斯方块是一项常见的移动应用开发任务,它能帮助开发者巩固基础,并学习到游戏编程的关键概念。本文将详细解析如何在Android环境中构建一个功能完备的俄罗斯方块游戏。 首先,我们要理解...

    android俄罗斯方块源码触屏版 (原创)

    android俄罗斯方块,有详细的注释!界面美观,12生肖组成不同块。有特殊块增加,消减,穿心,炸弹。 背景可选,有声音震动。有首页跑动特效,排行榜,菜单设置等。非常全。上一个版本...

    Android俄罗斯方块游戏源码和图片

    首先,我们要明白,Android版俄罗斯方块的核心在于游戏逻辑的实现。这涉及到矩阵运算、物体移动、旋转、消除行以及得分计算等。在源码中,通常会有一个专门的数据结构来存储当前游戏的状态,如一个二维数组,每个...

    android 俄罗斯方块源代码

    本文将围绕“android 俄罗斯方块源代码”这一主题,深入探讨其背后的编程实现,特别是其独特的WiFi游戏室创建和多人游戏功能。 首先,Android版俄罗斯方块的源代码主要由以下几个部分构成: 1. **用户界面(User ...

Global site tag (gtag.js) - Google Analytics