方向键按钮用 ImageView 或者 ImageButton
不能用 Button 按钮图片和声音文件自己加
程序代码只有两百行
/**
*葫芦岛.iv 2019 02 02
*/
import android.app.*;
import android.graphics.*;
import android.graphics.Bitmap.*;
import android.media.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
import java.util.Random;
public class MainActivity extends Activity {
private int 当前图形 = -1, 下一图形, 平移, 平移1,下降, 行, i,移动x,移动y, ax, ay;
private int 行数=31,列数=16,格宽=50,下降速度=400,得分数, 级别数, 消层数;
private int [] 方块x = new int [4],方块y = new int [4], 旋转x = new int [4],旋转y = new int [4];
private int [] 颜色={Color.BLACK ,Color.CYAN,Color.YELLOW,Color.BLUE,Color.GREEN,Color.WHITE,Color.MAGENTA,Color.RED};
private int [][] 网格点 = new int [行数][列数];
private int [][] 方块组X = { { 0, 1, 0, 1 }, { -1, 0, 1, 2 }, { -1, 0, 0, 1 }, { -1, 0, 0, 1 }, { -1, 0, 0, 1 }, { -1, -1, 0, 1 }, { -1, 0, 1, 1 } };
private int [][] 方块组Y = { { -1, -1, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, -1, -1 }, { -1, -1, 0, 0 }, { 0, 0, -1, 0 }, { 0, -1, 0, 0 }, { 0, 0, 0, -1 } };
private SoundPool 播放声音=new SoundPool(3, AudioManager.STREAM_SYSTEM, 5);
private Random random = new Random();
private ImageView 界面,上,下,左,右;
private TextView 级别,层数,分数;
private Paint p = new Paint();
private Bitmap bitmap;
private Canvas g;
private Handler handler = new Handler();
private Runnable update_thread = new Runnable() {
public void run () {
if(下降速度>0){
运行();
handler.postDelayed(update_thread, 下降速度);
}
} };
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
上 = (ImageView)findViewById(R.id.上id);
下 = (ImageView)findViewById(R.id.下id);
左 = (ImageView)findViewById(R.id.左id);
右 = (ImageView)findViewById(R.id.右id);
分数 = (TextView)findViewById(R.id.分数id);
级别 = (TextView)findViewById(R.id.级别id);
层数 = (TextView)findViewById(R.id.层数id);
界面 = (ImageView)findViewById(R.id.界面id);
bitmap = Bitmap.createBitmap(800, 1550, Config.ARGB_4444);
g = new Canvas(bitmap);
界面.setImageBitmap(bitmap);
播放声音.load(this, R.drawable.xcs, 1);
播放声音.load(this, R.drawable.sjs, 1);
播放声音.load(this, R.drawable.sbs, 1);
上.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch (View p1, MotionEvent p2) {
if(p2.getAction() == MotionEvent.ACTION_DOWN && 当前图形 > 0) {
for(i = 0; i < 4; i++) {
旋转x[i] = 方块x[i];
旋转y[i] = 方块y[i];
行 = 旋转y[i];
旋转y[i] = 旋转x[i];
旋转x[i] = 行 * -1;
ax = 移动x + 旋转x[i] + 平移;
ay = 移动y + 旋转y[i] + 下降;
if(ax < 0 || ax > 列数 || ay > 30 || 网格点[ay][ax] > 0)
return true;
}
移动方块(true);}
return true;
} });
下.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch (View p1, MotionEvent p2) {
if(p2.getAction() == MotionEvent.ACTION_DOWN) {运行();下降速度 = 30;}
if(p2.getAction() == MotionEvent.ACTION_UP) 下降速度 = 400 - 级别数 * 40;
return true;
} });
左.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch (View p1, MotionEvent p2) {
if(p2.getAction() == MotionEvent.ACTION_DOWN) {平移1 = -1;运行();下降速度 = 80;}
if(p2.getAction() == MotionEvent.ACTION_UP) {
下降速度 = 400 - 级别数 * 40; 平移1 = 0; 下降 = 1;}
return true;
} });
右.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch (View p1, MotionEvent p2) {
if(p2.getAction() == MotionEvent.ACTION_DOWN) {平移1 = 1;运行();下降速度 = 80;}
if(p2.getAction() == MotionEvent.ACTION_UP) {
下降速度 = 400 - 级别数 * 40; 平移1 = 0; 下降 = 1;}
return true;
} }); p.setTextSize(160);
handler.post(update_thread);//启动
}
private void 运行 () {
if(当前图形 == -1) {//产生下一个图形
当前图形 = 下一图形;
下一图形 = random.nextInt(7);// 随机产生下一图形
移动x = 7;
移动y = 3;//回到起始点
p.setColor(Color.BLACK);
g.drawRect(300, 0, 500, 100, p);
p.setColor(颜色[下一图形 + 1]);
for(i = 0; i < 4; i++) {
ax = 方块组X[下一图形][i] * 格宽 + 350;
ay = 方块组Y[下一图形][i] * 格宽 + 格宽;
g.drawRoundRect(new RectF(ax, ay, ax + 格宽, ay + 格宽), 10, 10, p);
方块x[i] = 方块组X[当前图形][i];
方块y[i] = 方块组Y[当前图形][i];
}
}
平移 = 平移1;下降 = 下降 == 1 && 平移 != 0 ? 0 : 1; // 减慢下降速度
for(i = 0; i < 4; i++) {// 是否可以移动方块
ax = 移动x + 方块x[i] + 平移; ay = 移动y + 方块y[i] + 下降;
if(ax < 0 || ax > 15 || ay < 行数 && 网格点[ay][ax] > 0) {
ax -= 平移; 平移 = 0;//平移时横向超出游戏区||网格点上有方块 平移归零
}
if(ay >= 行数 || 网格点[ay][ax - 平移] > 0)
break;//下降到最底层||网格点上有方块就不能再移动了
}
if(i == 4) {if(下降速度 != 80)移动方块(false);下降速度++; return; }// 能够移动方块就不执行下面的代码
下降速度 = 400 - 级别数 * 40;
for(i = 0; i < 4; i++) // 不能移动方块 就给网格点赋值
网格点[移动y + 方块y[i]][移动x + 方块x[i]] = 当前图形 + 1;
行 = 0;// 消行
for(ay = 30; ay > 1; ay--)
for(i = 0, ax = 0; ax < 列数; ax++) {
网格点[ay + 行][ax] = 网格点[ay][ax]; //数组消行
if(网格点[ay][ax] != 0)
行 = ++i == 列数 ? 行 + 1 : 行; //消行条件
}
if(行 > 0) {
得分数 += (int)Math.pow(行, 2) * 10;
消层数 += 行;
for(ay = 0; ay < 行数; ay++)
for(ax = 0; ax < 列数; ax++) {
p.setColor(颜色[网格点[ay][ax]]);
g.drawRoundRect(new RectF(ax * 格宽, ay * 格宽, ax * 格宽 + 格宽 , ay * 格宽 + 格宽), 10, 10, p);
}
if(得分数 > 级别数 * 640) {
if(++级别数 == 8) {
下降速度 = 400;
g.drawText("恭喜,通关", 0, 600, p);
}
播放声音.play(2, 1, 1, 0, 0, 1);
}
else 播放声音.play(1, 1, 1, 0, 0, 1);
分数.setText("分数:" + 得分数);
级别.setText("级别:" + 级别数);
层数.setText("层数:" + 消层数);
} else if(移动y < 5) {// Game Over
播放声音.play(3, 1, 1, 0, 0, 1);
g.drawText("Game Over", 0, 600, p);
下降速度=-1;
}
当前图形 = -1;//开启图形开关
界面.invalidate();//刷新
}
private void 移动方块 (boolean 转) {
p.setColor(Color.BLACK);
for(i = 0; i < 4; i++) {// 清除方块
ax = (移动x + 方块x[i]) * 格宽;
ay = (移动y + 方块y[i]) * 格宽;
g.drawRect(ax, ay, ax + 格宽, ay + 格宽, p);
}
移动x += 平移;
移动y += 下降;
p.setColor(颜色[当前图形 + 1]);
for(i = 0; i < 4; i++) {// 绘制方块
if(转) {方块x[i] = 旋转x[i]; 方块y[i] = 旋转y[i];}
ax = (移动x + 方块x[i]) * 格宽;
ay = (移动y + 方块y[i]) * 格宽;
g.drawRoundRect(new RectF(ax, ay, ax + 格宽 , ay + 格宽), 10, 10, p);// 绘制方块
}
界面.invalidate();//刷新
}
public void 开始Click (View v) {
if(下降速度 == -1)handler.post(update_thread);//启动
网格点 = new int [行数][列数];
得分数 = 级别数 = 消层数 = 平移 = 0;
当前图形 = -1;下降 = 1;下降速度 = 400;
g.drawColor(Color.BLACK);
}
public void 暂停Click (View v) {
下降速度 = -下降速度;
if(下降速度 > 0)
handler.postDelayed(update_thread, 下降速度);
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="bottom">
<ImageView
android:layout_height="1550px"
android:background="#000000"
android:layout_width="800px"
android:id="@+id/界面id"
android:onClick="暂停Click"/>
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="分数:"
android:id="@+id/分数id"
android:textSize="20sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="级别:"
android:id="@+id/级别id"
android:layout_marginTop="30dp"
android:textSize="20sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="层数:"
android:id="@+id/层数id"
android:layout_marginTop="30dp"
android:textSize="20sp"/>
<Button
android:layout_height="100dp"
android:layout_width="match_parent"
android:text="开始"
android:layout_marginTop="50dp"
android:layout_marginBottom="78dp"
android:onClick="开始Click"
android:id="@+id/开始id"/>
<ImageView
android:layout_height="51dp"
android:layout_width="51dp"
android:src="@android:drawable/ic_delete"
android:id="@+id/上id"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="right">
<ImageView
android:layout_height="51dp"
android:layout_width="51dp"
android:src="@android:drawable/ic_delete"
android:id="@+id/左id"/>
<ImageView
android:layout_height="51dp"
android:layout_width="51dp"
android:src="@android:drawable/ic_delete"
android:id="@+id/下id"/>
<ImageView
android:layout_height="51dp"
android:layout_width="51dp"
android:src="@android:drawable/ic_delete"
android:id="@+id/右id"/>
</LinearLayout>
</LinearLayout>
网友评论