android俄罗斯方块开发代码,基于Android的俄罗斯方块开发(附源码)

最近在学Android开发,一直想找个项目来练练手,前段时间在考试也没有时间,不过那时候就有点想法,就是想做个俄罗斯方块或者贪吃蛇什么的。然后一直到这几天才有时间来写这个项目。

完成这个项目主要有几个问题要处理:

① 边界问题,即如何判断俄罗斯方块是否已经到达边界,主要是在左右移动和下降过程中,判断俄罗斯方块是否已经抵达边界,使其不超越边界。

② 接触问题,即如何判断俄罗斯方块已经与其他俄罗斯方块接触,此时应该停止方块的下落,或者避免方块间重合。

③ 旋转问题,俄罗斯方块要旋转很简单,只要用转换公式即可,但问题是如何判断旋转后的位置是否不合法,即有没有可能触及边界,或者与其他俄罗斯方块重合。

④ 消去问题,当网格中有一行填满了方块,需要消去此行,并将在其上的所有方块均向下移动一行,更新分数等相关信息。

⑤ 界面显示问题,如何显示下落的俄罗斯方块和静止的俄罗斯方块组,以及下一个即将下落的俄罗斯方块。

⑥ 还有一些比较细节的问题,只要有耐心还是很容易可以解决的,这里就不再赘述了。

** 下面给出我相应的解决方案:**

** ** 首先,看下我的项目文件框架图:

c0a2bda67baf

然后,我在解释下每个类的作用:

c0a2bda67baf

c0a2bda67baf

c0a2bda67baf

c0a2bda67baf

第① 和第②个问题类似,每个俄罗斯方块(TetrisBlock)对象包含四个更小的块单元(BlockUnit), 在处理这两个问题的时候只要在块单元类当中添加判断块单元对象是否接触边界或者其他俄罗斯方块的块单元的方法,然后俄罗斯方块类的判断接触边界或其他俄罗斯方块的方法,只需依次调用该俄罗斯方块对象的所有块单元对象的判断方法,若其中一个块单元接触边界,则该俄罗斯方块接触边界。而边界和方块接触问题都可以大致分为两类,a. 接触两侧边界或在两侧接触其他俄罗斯方块,b. 接触网格底部边界或者方块接触其下的其他俄罗斯方块。这两类问题需要分开处理,因为方块的下落和左右移动是分开进行的,当方块左右移动时不能穿过两侧边界或与其他俄罗斯方块重合,当方块下落时,则不能穿过底部边界或穿过其下的俄罗斯方块。

第③个问题,先克隆一个下落的俄罗斯方块,对其进行旋转操作,然后判断其是否超越边界或者与其他俄罗斯方块重合,若其状态合法则将下落的俄罗斯方块进行旋转操作,否则结束操作并返回。

第④个问题,用一个数组标记每行块单元个数,并计算每行最多可填入多少个块单元,若某一行已经填满则,删除每个俄罗斯方块中在该行上的块单元,并且将在该行之上的块单元全部向下移动一行。

最后的效果大概这样

c0a2bda67baf

Paste_Image.png

能想到这个问题的解决方案就可以很轻松的开始敲代码了。

package cn.jczhuang.tetris2;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import cn.jczhuang.tetris2.model.BlockUnit;

import cn.jczhuang.tetris2.model.TetrisBlock;

import cn.jczhuang.tetris2.view.TetrisView;

import cn.jczhuang.tetris2.view.ShowNextBlockView;

public class Main extends Activity {

public Button left, right, rotate, start, speedUp; //按钮

public TextView score, maxScore, level, speed; //标签

public int scoreValue,maxScoreValue,levelValue,speedValue; //标签值

public String scoreString = "分数:",maxScoreString = "最高分:",levelString = "等级:",speedString = "速度:";

public TetrisView view;

public ShowNextBlockView nextBlockView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// 获取各组件和标签值

view = (TetrisView)findViewById(R.id.tetrisView);

left = (Button)findViewById(R.id.left);

right = (Button)findViewById(R.id.right);

rotate = (Button)findViewById(R.id.rotate);

start = (Button)findViewById(R.id.start);

speedUp = (Button)findViewById(R.id.speedUp);

nextBlockView = (ShowNextBlockView)findViewById(R.id.nextBlockView);

nextBlockView.invalidate();

score = (TextView)findViewById(R.id.score);

maxScore = (TextView)findViewById(R.id.maxScore);

level = (TextView)findViewById(R.id.level);

speed = (TextView)findViewById(R.id.speed);

scoreValue = maxScoreValue =0;

levelValue = speedValue = 1;

score.setText(scoreString + scoreValue);

level.setText(levelString + levelValue);

speed.setText(speedString + speedValue);

maxScore.setText(maxScoreString + maxScoreValue);

//设置各按钮的监听器

left.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (view.canMove)

view.getFallingBlock().move(-1);

runOnUiThread(new Runnable() {

@Override

public void run() {

view.invalidate();

}

});

}

});

right.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (view.canMove)

view.getFallingBlock().move(1);

runOnUiThread(new Runnable() {

@Override

public void run() {

view.invalidate();

}

});

}

});

rotate.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (view.canMove == false)

return;

TetrisBlock copyOfFallingBlock = view.getFallingBlock().clone();

copyOfFallingBlock.rotate();

if (copyOfFallingBlock.canRotate()) {

TetrisBlock fallinBlock = view.getFallingBlock();

fallinBlock.rotate();

}

runOnUiThread(new Runnable() {

@Override

public void run() {

view.invalidate();

}

});

}

});

start.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

view.init();

}

});

speedUp.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (view.canMove) {

view.getFallingBlock().setY(view.getFallingBlock().getY() + BlockUnit.UNITSIZE);

runOnUiThread(new Runnable() {

@Override

public void run() {

view.invalidate();

}

});

}

}

});

view.setFather(this);

view.invalidate();

}

}

package cn.jczhuang.tetris2.model;

import java.util.ArrayList;

import cn.jczhuang.tetris2.view.TetrisView;

/**

* Created by Terence on 2016/2/3.

*/

public class TetrisBlock implements Cloneable{

/*

* 俄罗斯方块

*/

public final static int TYPESUM = 7; //方块种类总数

public final static int DIRECTIONSUM = 4; //每个方块有四个方向

private int blockType,blockDirection; //方块种类,方块朝向

private int color; //方块颜色

private float x, y; //方块坐标

private ArrayList units = new ArrayList<>(); //方块组成部分

private ArrayList blocks = new ArrayList<>(); //所有俄罗斯方块

public void remove(int j){

/*

* 删除在第j行上的方块单元

* @param 需删除行标

*/

for(int i=units.size()-1;i>=0;i--){

/*

* ①逆向遍历

* ②根据y坐标计算单元所在行,若为j行则从units中删除

*/

if((int)((units.get(i).getY()- TetrisView.beginPoint)/50) == j)

units.remove(i);

}

}

public boolean canRotate(){

/*

* 判断方块是否能够翻转

* @return 若能翻转返回true

*/

for(TetrisBlock b:blocks){

//遍历俄罗斯方块所有单元,是否均能翻转,若其中一个单元不能,则俄罗斯方块

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以用中文回复关于使用Android Studio开发贪吃蛇的问题。首先,你需要了解Java编程语言和Android开发的基础知识。然后,你可以使用Android Studio创建一个新的Android项目,并在其中添加一个贪吃蛇游戏的主要逻辑。你需要使用Android的UI组件来创建游戏界面,并使用Java编写游戏逻辑。你还需要使用Android Studio提供的调试工具来测试和调试你的代码。最后,你可以将你的游戏打包成一个APK文件,并在Android设备上安装和运行它。 ### 回答2: 贪吃蛇是一个非常经典的游戏,它的规则简单易懂,玩家主要控制一只虫子吃掉屏幕上的苹果,每吃一个苹果身体就会变长一节,同时游戏难度也会逐渐加大。 要在Android Studio上开发贪吃蛇游戏,首先需要创建一个基本的游戏界面,包括背景图、贪吃蛇、苹果等元素。可以使用XML文件来实现基本布局,或者使用Java代码动态创建控件。 接下来,需要实现游戏逻辑。贪吃蛇移动的方法是通过不断修改贪吃蛇身体的位置实现的。为了实现更生动的效果,在移动的过程中还可以添加移动的动画效果。 当贪吃蛇前进时,需要不断检测是否撞墙或者撞到自己的身体,如果撞到,游戏就会结束。同时,如果贪吃蛇吃到苹果,苹果就会消失,并且贪吃蛇的身体长度会增加一个单位。 最后,需要添加基本的游戏设置,包括难度设置、适配不同屏幕和分辨率等。游戏界面和逻辑完整后,还可以添加一些游戏特效和音效等,从而让整个游戏更加具有趣味性和可玩性。 总的来说,开发Android贪吃蛇游戏需要结合基本的UI设计和编程逻辑,同时需要对游戏玩法进行深入的研究和分析,才能够创造出一个具有吸引力的、生动有趣的游戏。同时,需要不断进行软件优化和升级,从而保证游戏能够适配不同的设备和操作系统版本,提供更好的用户体验。 ### 回答3: Android Studio 是一款高效且易用的集成开发环境,可用于创建各种 Android 应用程序。使用 Android Studio 开发贪吃蛇游戏需要以下几个步骤: 1. 创建新项目:打开 Android Studio,点击“New Project”按钮创建一个新的项目。在项目设置窗口中,可以选择应用程序的名称、包名、最低 API 版本和要使用的代码模板。 2. 设计游戏界面:在 Android Studio 的 Design View 中,我们将设计贪吃蛇游戏的画面。这个过程中需要考虑屏幕、背景、蛇、食物和其他个别元素的大小、位置、颜色和形状等方面。 3. 编写游戏逻辑:在 Android Studio 的 Code View 中,我们创建一些 Java 类,定义游戏的行为和规则。例如: - 按下屏幕上下左右方向键,移动蛇头并在画面重绘时更新蛇身 - 当蛇头碰到食物时,让蛇增长一格 - 当蛇头碰到边框或自己的身体时,游戏结束 4. 运行和测试:通过连接 Android 手机或者在 Android Studio 的模拟器中运行应用程序,测试游戏功能并验证设计的界面和逻辑是否符合设计要求。 在这个过程中,我们可以使用 Android Studio 提供的很多工具和资源,例如: - 编辑器:可以快速编辑大量的 Java 代码,并根据代码的语法和语义提供自动补全、语法校验、大红频法等功能。 - 调试器:可以让我们在运行时定位错误,检查代码的状态、变量的值和执行轨迹等信息。 - 布局编辑器:可以让我们通过拖拽组件和调整参数,快速构建具有复杂层次结构和多个屏幕适配方案的 UI 布局。 - 数字图标/图片资源:直接从图片资源库中搜索和添加到项目中,避免花费额外的开发和美工成本。 总之,使用 Android Studio 开发贪吃蛇不仅可以提高开发效率和代码质量,还可以让开发者更深入地理解 Android 开发过程和原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值