Serie de bouton a activer

JVFV Messages postés 2 Date d'inscription mardi 19 décembre 2017 Statut Membre Dernière intervention 19 décembre 2017 - 19 déc. 2017 à 10:17
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 4 janv. 2018 à 22:15
Bonjour,
Je viens solliciter de l'aide car je fais fasse a un problème, et aucune idée sur ma manière de le résoudre.
Allons droit au but : ( Supporter de l'O.M s'abstenir :) )

Je voudrais créer un petit jeu, qui consisterai a activer 4 boutons dans un ordre défini.
Si les 4 boutons sont activés dans le bon ordre, vous passer a l'activité suivante, dans le cas contraire,
vous recommencerez l'opération.

Je vous transmet une photo de mon code actuel.


Merci pour toute aide apporté, je précise que je suis débutant, donc un peu d'indulgence :D

1 réponse

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
4 janv. 2018 à 22:15
Salut,

Je ne sais pas trop si ton problème est toujours d'actu mais voici une solution 'assez simpliste':
Le fichier layout activity_main.xml
<?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:layout_margin="16dp"
    tools:context="xx.yyy.foo.MainActivity">
    <TextView
        android:id="@+id/textview"
        android:layout_alignParentTop="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <ToggleButton
        android:id="@+id/button1"
        android:layout_below="@id/textview"
        android:layout_alignParentStart="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"/>
    <ToggleButton
        android:id="@+id/button2"
        android:layout_below="@id/textview"
        android:layout_toEndOf="@id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"/>
    <ToggleButton
        android:id="@+id/button3"
        android:layout_below="@id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick" />
    <ToggleButton
        android:id="@+id/button4"
        android:layout_below="@id/button2"
        android:layout_toEndOf="@id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"/>
</RelativeLayout>


Le code de l'activity MainActivity.java:
package xx.yyy.foo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
  private List<Integer> mList = null; /* Liste utilisée pour l'ordre */
  private List<ToggleButton> mListButtons = null; /* Temporaire pour faciliter la manipulation des boutons */


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mList = new ArrayList<>();
    mListButtons = new ArrayList<>(Arrays.asList(
        findViewById(R.id.button1),
        findViewById(R.id.button2),
        findViewById(R.id.button3),
        findViewById(R.id.button4)
    ));
    /* Init des textes des boutons */
    final Locale locale = Locale.US;
    for(int i = 0; i < mListButtons.size(); i++) {
      ToggleButton tb = mListButtons.get(i);
      tb.setTextOn(String.format(locale, "On: Button %d", i));
      tb.setTextOff(String.format(locale, "Off: Button %d", i));
    }
    /* Build de la liste du "jeu" */
    buildList();
  }

  /**
   * Construction de la liste utilisée pour le "jeu"
   */
  private void buildList() {
    if(!mList.isEmpty()) /* cas d'erreur */
      mList.clear();
    /* Re remplissage de la liste */
    for(int i = 0; i < mListButtons.size(); i++)
      mList.add(i);
    /* random de la liste */
    Collections.shuffle(mList);
    /* Affichage de l'ordre */
    StringBuilder sb = new StringBuilder();
    sb.append("List order: ");
    mList.forEach((i) -> sb.append(i).append(" "));
    ((TextView)findViewById(R.id.textview)).setText(sb.toString().trim());
    /* Revalidation des boutons */
    uncheckAll();
  }

  /**
   * Click sur un bouton.
   * @param v Vue du click.
   */
  public void onClick(View v) {
    ToggleButton tb = (ToggleButton)v;
    String lbl = tb.getText().toString();
    /* Récupération de l'index (récupéré dans le label) */
    int idx = Integer.parseInt(lbl.substring(lbl.lastIndexOf(' ') + 1, lbl.length()));
    /* Validation de l'ordre */
    if(mList.get(0) == idx) {
      v.setEnabled(false); /* désactivation du bouton */
      mList.remove(0); /* suppression dans la liste */
      if(mList.isEmpty()) {
        Toast.makeText(this, "Success :)", Toast.LENGTH_SHORT).show();
        buildList();
      }
    } else {
      Toast.makeText(this, "Error :(", Toast.LENGTH_SHORT).show();
      shake((ToggleButton)v);
      buildList();
    }
  }

  /**
   * Petite animation en cas d'erreur.
   * @param tb Bouton à animer.
   */
  private void shake(ToggleButton tb) {
    TranslateAnimation shake = new TranslateAnimation(0, 10, 0, 0);
    shake.setDuration(500);
    shake.setInterpolator(new CycleInterpolator(5));
    tb.clearAnimation();
    tb.startAnimation(shake);
  }

  /**
   * Deselectionne et reactive les boutons.
   */
  private void uncheckAll() {
    mListButtons.forEach((bt) -> {
      bt.setChecked(false);
      bt.setEnabled(true);
    });
  }
}


Dans le code j'utilise la syntaxe java 1.8 il faudra donc ajouter le bloc compileOptions dans le fichier build.gradle (chez moi c'est dans celui de l'application):

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
defaultConfig {
applicationId "xx.yyy.foo"
minSdkVersion 24
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

0
Rejoignez-nous