Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Поиграем в игровой автомат и попробуем выиграть большую сумму.
Подготовим шесть картинок для автомата.
На экран одновременно выводятся три картинки. В качестве рычага послужит кнопка.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:orientation="horizontal">
<ImageView
android:id="@+id/image1"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="50dp"
android:src="@drawable/slot5" />
<ImageView
android:id="@+id/image2"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="50dp"
android:src="@drawable/slot5" />
<ImageView
android:id="@+id/image3"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="50dp"
android:src="@drawable/slot5" />
</LinearLayout>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/linear"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/textView"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Start" />
</RelativeLayout>
Слот-машина состоит из трёх колёс, которые должны вращаться и выводить картинку пользователю. Создадим отдельный класс Whee на основе Thread.
package ru.alexanderklimov.slot;
public class Wheel extends Thread {
interface WheelListener {
void newImage(int img);
}
private static int[] drawables = {R.drawable.slot1, R.drawable.slot2, R.drawable.slot3,
R.drawable.slot4, R.drawable.slot5, R.drawable.slot6};
public int currentIndex;
private WheelListener wheelListener;
private long frameDuration;
private long startIn;
private boolean isStarted;
public Wheel(WheelListener wheelListener, long frameDuration, long startIn) {
this.wheelListener = wheelListener;
this.frameDuration = frameDuration;
this.startIn = startIn;
currentIndex = 0;
isStarted = true;
}
public void nextImg() {
currentIndex++;
if (currentIndex == drawables.length) {
currentIndex = 0;
}
}
@Override
public void run() {
try {
Thread.sleep(startIn);
} catch (InterruptedException e) {
}
while (isStarted) {
try {
Thread.sleep(frameDuration);
} catch (InterruptedException e) {
}
nextImg();
if (wheelListener != null) {
wheelListener.newImage(drawables[currentIndex]);
}
}
}
public void stopWheel() {
isStarted = false;
}
}
Запускаем три потока, затем останавливаем их повторным нажатием кнопки. Результат выводится на экран.
package ru.alexanderklimov.slot;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private TextView infoTextView;
private ImageView image1, image2, image3;
private Wheel wheel1, wheel2, wheel3;
private Button button;
private boolean isStarted;
public static final Random RANDOM = new Random();
public static long randomLong(long lower, long upper) {
return lower + (long) (RANDOM.nextDouble() * (upper - lower));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image1 = findViewById(R.id.image1);
image2 = findViewById(R.id.image2);
image3 = findViewById(R.id.image3);
button = findViewById(R.id.button);
infoTextView = findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isStarted) {
wheel1.stopWheel();
wheel2.stopWheel();
wheel3.stopWheel();
if (wheel1.currentIndex == wheel2.currentIndex && wheel2.currentIndex == wheel3.currentIndex) {
infoTextView.setText("You win the big prize");
} else if (wheel1.currentIndex == wheel2.currentIndex || wheel2.currentIndex == wheel3.currentIndex
|| wheel1.currentIndex == wheel3.currentIndex) {
infoTextView.setText("Little Prize");
} else {
infoTextView.setText("You lose");
}
button.setText("Start");
isStarted = false;
} else {
wheel1 = new Wheel(new Wheel.WheelListener() {
@Override
public void newImage(final int img) {
runOnUiThread(new Runnable() {
@Override
public void run() {
image1.setImageResource(img);
}
});
}
}, 200, randomLong(0, 200));
wheel1.start();
wheel2 = new Wheel(new Wheel.WheelListener() {
@Override
public void newImage(final int img) {
runOnUiThread(new Runnable() {
@Override
public void run() {
image2.setImageResource(img);
}
});
}
}, 200, randomLong(150, 400));
wheel2.start();
wheel3 = new Wheel(new Wheel.WheelListener() {
@Override
public void newImage(final int img) {
runOnUiThread(new Runnable() {
@Override
public void run() {
image3.setImageResource(img);
}
});
}
}, 200, randomLong(150, 400));
wheel3.start();
button.setText("Stop");
infoTextView.setText("");
isStarted = true;
}
}
});
}
}
Источник: Learn to create a Slot Machine for Android