目录
一、项目演示
二、项目测试环境
三、项目详情
四、完整的项目源码
一、项目演示
二、项目测试环境
三、项目详情
首页
这段代码实现了一个Android应用中的选择活动(`SelectActivity`)。以下是功能总结:
1. **布局和视图**:在`onCreate`方法中,设置了活动的布局,并初始化了五个`ImageView`(`grade1`至`grade5`),它们代表不同的等级选择。
2. **点击监听**:为每个`ImageView`设置了点击监听器,所有等级图标的点击都会调用`onClick`方法。
3. **启动新活动**:在`onClick`方法中,根据点击的视图ID,将相应的等级信息(1到5)通过`Intent`传递给`MainActivity`,然后启动这个活动。
总的来说,这个活动让用户可以选择不同的等级,并将选择结果传递到主活动中。
package com.example.tetris;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;public class SelectActivity extends AppCompatActivity implements View.OnClickListener {ImageView grade1;ImageView grade2;ImageView grade3;ImageView grade4;ImageView grade5;@Overridepublic void onCreate(Bundle bundle) {super.onCreate(bundle);setContentView(R.layout.activity_select);this.grade1 = (ImageView) findViewById(R.id.grade1);this.grade2 = (ImageView) findViewById(R.id.grade2);this.grade3 = (ImageView) findViewById(R.id.grade3);this.grade4 = (ImageView) findViewById(R.id.grade4);this.grade5 = (ImageView) findViewById(R.id.grade5);this.grade1.setOnClickListener(this);this.grade2.setOnClickListener(this);this.grade3.setOnClickListener(this);this.grade4.setOnClickListener(this);this.grade5.setOnClickListener(this);}public void onClick(View view) {Intent intent = new Intent(this, MainActivity.class);switch (view.getId()) {case R.id.grade1:intent.putExtra("grade", 1);break;case R.id.grade2:intent.putExtra("grade", 2);break;case R.id.grade3:intent.putExtra("grade", 3);break;case R.id.grade4:intent.putExtra("grade", 4);break;case R.id.grade5:intent.putExtra("grade", 5);break;}startActivity(intent);}
}
这段代码主要实现了一个简单的Tetris(俄罗斯方块)游戏的一些核心功能。以下是主要功能总结:
1. **清空下一个方块列表**:
- `nextTetrisList` 被清空,然后根据下一个方块的形状,将对应的颜色添加到列表中。如果位置为空,则添加0表示空白。
2. **适配器设置**:
- 创建 `BlockAdapter`,将 `nextTetrisList` 作为数据源并设置给下一个方块的视图,用于显示下一个即将出现的方块。
3. **计时器管理**:
- 创建并管理计时器,定期发送更新消息以更新游戏状态。在暂停和继续游戏时,能够启动和停止计时器。
4. **游戏暂停/继续功能**:
- `pause()` 方法实现了切换暂停状态,更新按钮文本和禁用/启用控制按钮。
5. **方块向下移动及消行逻辑**:
- `stopDown()` 方法处理方块向下移动,更新方块状态,并检查行是否满。如果满行,则增加分数,向上移动下方行,并清空顶部行。
6. **游戏结束逻辑**:
- 检查顶部行是否为空,若不为空则结束游戏,并更新最高分记录。
7. **随机方块状态更新**:
- 生成下一个随机方块和颜色,并调用方法更新下一个方块的显示。
这段代码实现了俄罗斯方块游戏的基本功能,但可以考虑提高可读性、增加错误处理、模块化设计和增强用户界面反馈等改进建议。
// 清空下一个方块列表this.nextTetrisList.clear();for (int i3 = 0; i3 < 4; i3++) {for (int i4 = 0; i4 < 4; i4++) {// 根据下一个方块的形状添加颜色到列表if (((1 << i4) & StateFang.shape[this.nextRand][i3]) != 0) {this.nextTetrisList.add(Integer.valueOf(this.nextRandColor)); // 添加颜色} else {this.nextTetrisList.add(0); // 空白位置}}}// 创建下一个方块的适配器,并设置给下一个方块的视图BlockAdapter blockAdapter3 = new BlockAdapter(this, this.nextTetrisList, R.layout.item_adapter);this.nextTetrisAdapter = blockAdapter3;this.nextTetrisView.setAdapter((ListAdapter) blockAdapter3); // 设置适配器// 打印当前随机形状的日志String str2 = this.TAG;Log.i(str2, this.rand + "");// 创建计时器,定时发送消息以更新游戏状态Timer timer2 = new Timer();this.timer = timer2;timer2.schedule(new TimerTask() {public void run() {MainActivity.this.handler.sendEmptyMessage(0); // 定时发送更新消息}}, 0, (long) this.timeInterval); // 设置定时任务,开始时立即执行,每隔 timeInterval 毫秒执行一次}private void pause() {// 切换暂停状态boolean z = !this.isPause;this.isPause = z;if (z) { // 如果现在是暂停状态stopTimer(); // 停止计时器this.pausebtn.setText("继续"); // 将按钮文本改为“继续”this.leftMove.setEnabled(false); // 禁用左移按钮this.rightMove.setEnabled(false); // 禁用右移按钮this.rotateMove.setEnabled(false); // 禁用旋转按钮this.downMove.setEnabled(false); // 禁用下移按钮return;}startTimer(); // 启动计时器this.pausebtn.setText("暂停"); // 将按钮文本改为“暂停”this.leftMove.setEnabled(true); // 启用左移按钮this.rightMove.setEnabled(true); // 启用右移按钮this.rotateMove.setEnabled(true); // 启用旋转按钮this.downMove.setEnabled(true); // 启用下移按钮}private void startTimer() {// 如果计时器为空,初始化计时器if (this.timer == null) {this.timer = new Timer();}// 安排一个计时任务this.timer.schedule(new TimerTask() {public void run() {MainActivity.this.handler.sendEmptyMessage(0); // 发送消息以更新游戏状态}}, 0, (long) this.timeInterval); // 从0毫秒开始,每隔timeInterval毫秒执行}private void stopTimer() {// 停止计时器Timer timer2 = this.timer;if (timer2 != null) {timer2.cancel(); // 取消计时器this.timer = null; // 将计时器设置为null}}@Overridepublic void onDestroy() {super.onDestroy();stopTimer(); // 在销毁活动时停止计时器}public void stopDown() {// 向下移动方块,处理消行逻辑int i = 3; // 从第三行开始while (true) {if (i < 0) {break; // 如果行数小于0,退出循环}int i2 = this.position[0] + i; // 计算方块的当前位置if (i2 >= 0 && StateFang.shape[this.rand][i] != 0) { // 如果当前行有效且方块形状不为空int[] iArr = this.allBlock; // 获取所有方块的数组iArr[i2] = iArr[i2] + leftMath(StateFang.shape[this.rand][i], this.position[1]); // 更新当前行的状态for (int i3 = 0; i3 < this.xSize; i3++) {// 更新当前行的颜色if (((1 << i3) & leftMath(StateFang.shape[this.rand][i], this.position[1])) != 0) {this.blockColor[i2][i3] = this.randColor; // 设置颜色}}}i--; // 行数递减}int i4 = this.ySize - 1; // 从最后一行开始检查while (i4 >= 0) {if (this.allBlock[i4] == 1023) { // 如果该行满了this.score++; // 增加分数this.scoreTextView.setText("分数:" + this.score); // 更新分数显示for (int i5 = i4 - 1; i5 >= 0; i5--) {// 向上移动方块int[] iArr2 = this.allBlock;int i6 = i5 + 1;iArr2[i6] = iArr2[i5]; // 移动行for (int i7 = 0; i7 < this.xSize; i7++) {// 更新颜色int[][] iArr3 = this.blockColor;iArr3[i6][i7] = iArr3[i5][i7];}}this.allBlock[0] = 0; // 清空顶部行for (int i8 = 0; i8 < this.xSize; i8++) {this.blockColor[0][i8] = 0; // 清空颜色}} else {i4--; // 行数递减}}if (this.allBlock[0] != 0) { // 如果顶部行不为空if (this.score > this.highestScore) { // 如果当前分数高于最高分this.cacheUtils.getValue("highestScore" + this.grade, this.score + ""); // 更新最高分this.highestScore = this.score; // 更新最高分变量this.maxScoreTextView.setText("最高分:" + this.highestScore); // 更新显示this.scoreTextView.setText("分数:" + this.score); // 更新分数显示}gameOver(); // 结束游戏}// 更新随机方块状态this.rand = this.nextRand;this.position[0] = StateFang.initPosition[this.rand][1]; // 设置新方块的位置this.position[1] = StateFang.initPosition[this.rand][0];this.randColor = this.nextRandColor; // 设置新方块的颜色this.nextRand = this.random.nextInt(19); // 生成下一个随机方块this.nextRandColor = this.random.nextInt(5) + 1; // 生成下一个随机颜色nextTetrisShow(); // 更新下一个方块的显示Log.i(this.TAG, this.rand + ""); // 日志记录当前方块}
四、完整的项目源码
👇👇👇👇👇快捷获取方式👇👇👇👇👇