Android实现掷骰子效果
作者:不能及 发布时间:2022-06-16 01:09:16
标签:Android,掷骰子
本文实例为大家分享了Android实现掷骰子效果的具体代码,供大家参考,具体内容如下
利用handler接受子线程的消息完成骰子点数的不断更替
演示
START:开始游戏
STOP:停止游戏
RECOVER:重置色子到初始状态
代码
package com.example.homeworkten;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ImageView imageView1,imageView2,imageView3;
private Button button1,button2,button3;
private ImageView[] imageViews;
private Handler handler;
//子线程
private Thread thread;
//记录每个色子的点数
private int number[];
//色子的总点数
private int count;
//volatile修饰符用来保证其它线程读取的总是该变量的最新的值
public volatile boolean isStop = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
number = new int[3];
imageView1 = findViewById(R.id.imageView1);
imageView2 = findViewById(R.id.imageView2);
imageView3 = findViewById(R.id.imageView3);
button1 = findViewById(R.id.button1);
button2 = findViewById(R.id.button2);
button3 = findViewById(R.id.button3);
imageViews = new ImageView[]{imageView1,imageView2,imageView3};
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断线程是否存在
if (thread != null&&isStop == true){
isStop = false;
}
handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
for(int i = 0;i < 3;i++) {
switch (number[i]) {
case 1:
imageViews[i].setImageResource(R.drawable.t1);
break;
case 2:
imageViews[i].setImageResource(R.drawable.t2);
break;
case 3:
imageViews[i].setImageResource(R.drawable.t3);
break;
case 4:
imageViews[i].setImageResource(R.drawable.t4);
break;
case 5:
imageViews[i].setImageResource(R.drawable.t5);
break;
case 6:
imageViews[i].setImageResource(R.drawable.t6);
break;
}
}
}
};
thread = new Thread(new Runnable() {
@Override
public void run() {
while (!isStop) {
Message message = handler.obtainMessage();
//总点数归零
count = 0;
for (int i = 0; i < 3; i++) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//生成随机数
int random = (int) (Math.random() * 6 + 1);
number[i] = random;
count += random;
}
handler.sendMessage(message);
}
}
});
thread.start();
}
});
//停止掷筛子
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isStop == false) {
isStop = true;
try {
//当子线程执行完以后才继续执行主线程
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//显示掷出的点数
Toast.makeText(MainActivity.this, "你掷的点数为" + count, Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this, "请点击开始键进行掷色子", Toast.LENGTH_SHORT).show();
}
}
});
//将色子还原到初始状态
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isStop == true) {
for (int i = 0; i < 3; i++) {
imageViews[i].setImageResource(R.drawable.t1);
}
}else {
Toast.makeText(MainActivity.this, "请先停止游戏,再重新开始", Toast.LENGTH_SHORT).show();
}
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView1"
android:layout_width="100dp"
android:layout_height="80dp"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
app:layout_constraintEnd_toStartOf="@+id/imageView2"
app:layout_constraintHorizontal_bias="0.482"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/t1" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="100dp"
android:layout_height="80dp"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
app:layout_constraintEnd_toStartOf="@+id/imageView3"
app:layout_constraintStart_toEndOf="@+id/imageView1"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/t1" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:text="start"
app:layout_constraintEnd_toStartOf="@+id/button2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:text="stop"
app:layout_constraintEnd_toStartOf="@+id/button3"
app:layout_constraintStart_toEndOf="@+id/button1"
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:text="recover"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/button2"
app:layout_constraintTop_toBottomOf="@+id/imageView3" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="100dp"
android:layout_height="80dp"
android:layout_marginStart="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageView2"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/t1" />
</androidx.constraintlayout.widget.ConstraintLayout>
来源:https://blog.csdn.net/success360/article/details/106206211
0
投稿
猜你喜欢
- 在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties
- 直接用idea clean install 进行打包maven项目时,如果没有进行设置会把测试文件也打包进去。想要忽略test文件将Mave
- 一、java final基本概念:1、主要用于修饰类、属性和方法:被final修饰的类不可以被继承被final修饰的方法不可以被重写被fin
- 省流/// <summary>/// 是否有效的文件,文件夹路径/// </summary>/// <para
- public class User { public
- Java中常用关键字:与数据类型相关(10)与流程控制相关(13)if: 表示条件判断,一般用法if(关系表达式),后跟else或
- 通过Class对象获取对象的方式是通过class.newInstance()方式获取,通过调用默认构造参数实例化一个对象。/** * Cre
- 本文实例讲述了C#检查键盘大小写锁定状态的方法。分享给大家供大家参考。具体分析如下:1、命名空间:using System.Runtime.
- 作为程序员,开发完一段代码,实现了某个功能时,有必要知道:我的程序需要多长时间?是什么导致我的程序消耗很多内存?比如,统计或者处理了一大批数
- 前言本文学习MP中的更新操作方法,带大家一起查看源码,了解更新操作的方法。学会熟练地去运用更新方法解决自己在项目中的问题。一、通过id更新1
- 函数InternetGetConnectedState返回本地系统的网络连接状态。语法:BOOL InternetGetConnectedS
- 反射允许我们在编译期或运行时获取程序集的元数据,通过反射可以做到:● 创建类型的实例● 触发方法● 获取属性、字段信息● 延迟绑定.....
- 最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了! 不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是
- 一、概念从本质上来说,它就是一个匿名函数,可以用来直接实现接口中的方法,从而简化代码。但是Lambda有一个限制,不能实现接口中的所有方法,
- 目录1、需求2、问题2、获取1)导入依赖为了获取客户端类型、操作系统类型、ip、port2)封装获取body字符串的工具类3) * 类4)继
- 下文笔者讲述maven引入本地jar包时,运行报错"java.lang.NoClassDefFoundError"的处理
- 自定义 webflux 容器配置配置代码@Componentpublic class ContainerConfig extends Rea
- 一、默认异常处理机制默认情况下,SpringBoot 提供 /error 请求,来处理所有异常的。1.浏览器客户端,请求头里的属性是Acce
- 本文实例讲述了Java基于正则实现的日期校验功能。分享给大家供大家参考,具体如下:private void checkDate() thro
- 我就废话不多说了,大家还是直接看代码吧~Caused by: java.net.SocketException: Software caus