程序很简单就只放代码了,自己完善下color和Drawable即可使用
Java文件:
package com.ytu.jkxy.jk171.sjp.russiablock;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Handler;
//import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.Toast;
import java.util.Random;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//声明一个游戏区域控件
View view;
//游戏区域长宽
int xWidth,xHight;
//地图画笔
Paint mapPaint;
//初始化辅助线画笔
Paint linepaint;
//方块画笔
Paint boxPaint;
//状态画笔
Paint startPaint;
//地图
boolean [][]maps;
//方块
Point[] boxs;
//方块的种类
final int TYPE = 7;
//方块类型
int boxType;
//方块大小
int boxSize;
//自动下落线程
public Thread downThread;
//
public Handler handler=new Handler(){
public void handleMessage(android.os.Message msg){
//刷新重绘view
view.invalidate();
};
};
//暂停状态
public boolean isPause;
//游戏结束状态
public boolean isOver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题栏
getSupportActionBar().hide();
setContentView(R.layout.activity_main);
intData();
newBoxs();
initView();
intLister();
}
//初始化数据
public void intData(){
//获得屏幕宽度
int width=getScreeWidth(this);
//设置游戏区域宽度=屏幕宽度*2/3
xWidth=width * 2/3;
//游戏区域的高度=宽度 * 2
xHight=2 * xWidth;
//初始化地图
maps=new boolean[10][20];
//初始化方块大小:游戏宽度/10
boxSize=xWidth/maps.length;
}
/*新的方块*/
public void newBoxs(){
//随机数生成一个新的方块
Random random=new Random();
boxType=random.nextInt(7);
switch (boxType){
//田字形
//55
//55
case 0:
boxs=new Point[]{new Point(4,0),new Point(5,0),new Point(4,1),new Point(5,1)};
break;
//L 例:
//5
//5
//55
case 1:
boxs=new Point[]{new Point(4,1),new Point(5,0),new Point(3,1),new Point(5,1)};
break;
//反L
case 2:
boxs=new Point[]{new Point(4,1),new Point(3,0),new Point(3,1),new Point(5,1)};
break;
//横条
//例:5555
case 3:
boxs=new Point[]{new Point(3,0),new Point(4,0),new Point(5,0),new Point(6,0)};
break;
//凸字形 例:
/*5
555*/
case 4:
boxs=new Point[]{new Point(4,1),new Point(5,0),new Point(5,1),new Point(6,1)};
break;
case 5:
boxs=new Point[]{new Point(4,0),new Point(5,0),new Point(5,1),new Point(5,2)};
break;
case 6:
boxs=new Point[]{new Point(5,0),new Point(6,0),new Point(4,1),new Point(5,1)};
break;
}
}
//初始化视图
@SuppressLint("ResourceAsColor")
public void initView(){
//初始化画笔
mapPaint=new Paint();
mapPaint.setColor(0x50000000);
mapPaint.setAntiAlias(true);
linepaint =new Paint();
linepaint.setColor(R.color.paint1);
//一般会打开抗锯齿
linepaint.setAntiAlias(true);
//初始化方块画笔
boxPaint=new Paint();
boxPaint.setColor(0xff000000);
boxPaint.setAntiAlias(true);
startPaint=new Paint();
startPaint.setColor(R.color.tools);
startPaint.setAntiAlias(true);
startPaint.setTextSize(100);
//1.得到父容器
FrameLayout layoutGame=findViewById(R.id.layoutGame);
//2.实例化游戏区域
view = new View(this){
//重写游戏区域绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制地图
for(int x=0;x0;y--){
//执行判断
if(checkLine(y)) {
//执行消行
deleteLine(y);
//消掉的那一行开始重新遍历
y++;
}
}
}
/*消行判断*/
public boolean checkLine(int y){
for(int x=0;x0; y--){
for(int x=0;x=maps.length||y>=maps[0].length||maps[x][y] == true);
}
}
布局文件:
//帧布局
//游戏开始按钮 (包括重新开始)
//游戏暂停按钮
//左右变换下降按钮
//
//总系统显性布局
测试结果: