网络资源模板--Android Studio 实现俄罗斯方块游戏App

news/2024/10/22 17:17:31/

目录

一、项目演示

二、项目测试环境

三、项目详情

四、完整的项目源码 


一、项目演示

网络资源模板--基于Android studio 实现的俄罗斯方块游戏

二、项目测试环境

三、项目详情

首页

这段代码实现了一个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 + ""); // 日志记录当前方块}

四、完整的项目源码 

👇👇👇👇👇快捷获取方式👇👇👇👇👇


http://www.ppmy.cn/news/1541104.html

相关文章

HttpURLConnection和OkHttp的特点

HttpURLConnection与OkHttp概述及个人倾向性分析 在Java和Android开发中&#xff0c;HttpURLConnection与OkHttp都是用于处理HTTP请求的库&#xff0c;它们在功能、性能、易用性等方面各有千秋。本文将详细阐述两者的特点&#xff0c;并结合个人使用经验&#xff0c;表达我对哪…

计算机网络基本架构示例2

一、企业内部网络架构 在一个中型企业中&#xff0c;通常会有以下的网络架构&#xff1a; - 核心层&#xff1a;由高性能的核心交换机组成&#xff0c;负责快速转发大量数据。例如采用具有高带宽和冗余功能的三层交换机&#xff0c;确保整个网络的稳定运行。它连接着各个部门的…

Git的原理和使用(二)

1. git的版本回退 之前我们也提到过&#xff0c;Git 能够管理⽂件的历史版本&#xff0c;这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题&#xff0c;需要在某个特定的历史版本重新开始&#xff0c;这个时候&#xff0c;就需要版本 回退的功能…

【Qt】信号和槽——信号和槽的概念、信号和槽的使用、信号和槽的优缺点、自定义信号和槽、信号和槽的断开

文章目录 Qt1. 信号和槽的概念2. 信号和槽的使用3. 信号和槽的优缺点4. 自定义信号和槽5. 信号和槽的断开 Qt 1. 信号和槽的概念 信号是什么&#xff1a; 在Linux中&#xff0c;我们知道信号是一种异步的事件通知机制&#xff0c;用于通知进程某个事件已经发生。它是进程间通信…

生活中的感悟

喜怒不形于色 以前一直觉得做人要做本我&#xff0c;该笑就笑该怒就怒。但慢慢发现&#xff0c;这样可能不太好。 暂且不谈别人会感知你的真实想法&#xff0c;就单说一点&#xff0c;表情是否会引起别人的误判&#xff1f;表情除了开心和愤怒&#xff0c;还有很多&#xff0…

keras的内部的模块有哪些? (自用便签)

AI回答, 什么时候忘了回来看看

LeetCode总结-滑动窗口与双指针

一、定长滑动窗口 例题&#xff1a; 1456.定长子串中元音的最大数目 1263 643.子数组最大平均数 I 1343.大小为K且平均值大于等于阈值的子数组数目 1317 2090.半径为k的子数组平均值 1358 2379.得到K个黑块的最少涂色次数 1360 二、不定长滑动窗口 不定长滑动窗口主要分…

阿里字节技术管理岗位面试要求

在阿里巴巴等互联网公司&#xff0c;技术管理岗&#xff08;如技术团队负责人 TL 或 P8/P9 级别的职位&#xff09;面试具有较高的技术要求和管理能力的考核。面试的问题和侧重点通常包括技术深度、架构设计、团队管理、项目推动等多方面。以下是一些常见的面试问题类型、侧重点…