Creați un Hangman Game Interacțiunea cu utilizatorul

În această serie, creăm un joc Hangman pentru platforma Android. Până acum, am construit interfața de utilizare a aplicației, inclusiv imagini, desene și layouts. În această a treia și ultima tranșă, ne vom concentra pe interacțiunea cu utilizatorul.


Introducere

Adăugarea interacțiunii utilizatorilor cu jocul implică mai multe aspecte, inclusiv detectarea faptului că utilizatorul câștigă sau pierde un joc, precum și răspunde la fiecare eveniment. De asemenea, vom adăuga un buton de ajutor în bara de acțiune și vom adăuga abilitatea de a naviga în joc.

Pentru a vă reîmprospăta memoria, jocul final va arăta astfel.



1. Pregătiți interfața utilizator

Pasul 1

După cum am văzut în tutorialul precedent, activitatea jocului prezintă zona spânzurare cu cele șase părți ale corpului desenate pe ecran. Atunci când începe un joc nou, părțile corpului trebuie să fie ascunse, afișându-le doar atunci când utilizatorul face o ghicire greșită. Deschideți clasa de activitate a jocului și începeți prin adăugarea la ea a următoarelor declarații de import.

importul android.app.AlertDialog; import șiroid.content.DialogInterface; import șiroid.support.v4.app.NavUtils; import șiroid.view.Menu; import șiroid.view.MenuItem; import șiroid.view.View; importă android.widget.ImageView;

Apoi, declarați cinci variabile de instanță în interfața clasei.

// parts body part privat ImageView [] bodyParts; // numărul de părți corporale private numParts = 6; // partea curentă - va crește atunci când răspunsurile greșite sunt alese privat int currPart; // numărul de caractere din cuvântul curent privat int numChars; // numărul corect ghicit privat int numCorr;

Puteți modifica numărul de părți ale corpului dacă, de exemplu, doriți să adăugați mai multe nivele de dificultate jocului. Prin stocarea părții actuale a corpului (currPart), putem adăuga o parte a corpului la un moment dat în cazul în care jucătorul face o ghicire greșită. Utilizăm numărul de litere al cuvântului țintă și numărul de presupuneri corecte pentru a urmări evoluția jucătorului în jocul actual. Verificăm periodic dacă jucătorul a câștigat sau a pierdut jocul.

În onCreate metoda de clasa de activitate a jocului, chiar înainte de a invoca joaca jocul, instanțiăm matricea de vizualizare a imaginilor și preluăm imaginile din partea corpului pe care le-am plasat în aspect. Acest fragment de cod determină, de asemenea, ordinea în care sunt afișate părțile corpului atunci când jucătorul face o estimare greșită. Începem cu capul și terminăm cu picioarele.

bodyParts = noul ImageView [numParts]; bodyParts [0] = (ImagineView) findViewById (R.id.head); bodyParts [1] = (ImagineView) findViewById (R.id.body); bodyParts [2] = (ImagineView) findViewById (R.id.arm1); bodyParts [3] = (ImagineView) findViewById (R.id.arm2); bodyParts [4] = (ImagineView) findViewById (R.id.leg1); bodyParts [5] = (ImagineView) findViewById (R.id.leg2);

Pasul 2

În joaca jocul , adăugați următorul fragment de cod. Noi am stabilit currPart la 0, a stabilit NUMCHARS la lungimea cuvântului țintă și setați numCorr la 0.

currPart = 0; NUMCHARS = currWord.length (); numCorr = 0;

Înainte de a începe jocul, părțile corpului trebuie ascunse.

pentru (int p = 0; < numParts; p++)  bodyParts[p].setVisibility(View.INVISIBLE); 

Următoarea captura de ecran arată modul în care ar trebui să pară jocul atunci când urmează să înceapă un nou joc.



2. Răspundeți la clicurile utilizatorilor

Pasul 1

Când am creat aspectul pentru butoanele cu litere, am declarat un onClick metodă. Să adăugăm acest lucru activității jocului.

public void letterPressed (Vizualizare vizualizare) // utilizatorul a apăsat o literă pentru a ghici

Când jucătorul face o apăsare de buton pentru a face o presupunere, letterPressed primește o referință la vizualizare. Acest lucru ne permite să dăm seama care scrisoare a ales jucătorul. Pentru a afla care scrisoare a fost utilizată, folosim următorul fragment de cod.

String ltr = (vizualizarea (TextView)) .getText (). ToString ();

Apoi, obținem caracterul din șir.

caractere charChar = ltr.charAt (0);

De asemenea, dezactivați butonul pentru literă și actualizați extensia de fundal pentru a afișa player-ului că litera a fost deja redată.

view.setEnabled (false); view.setBackgroundResource (R.drawable.letter_down);

În pasul următor, vom trece prin caracterele cuvântului țintă pentru a verifica dacă ghicitul jucătorului este în el. Fiecare literă a cuvântului țintă este comparată cu cea a jucătorului. Dacă ghiciul jucătorului corespunde unei scrisori în cuvântul țintă, noi creștem numCorr, a stabilit corect la Adevărat pentru a indica faptul că jucătorul a făcut o bună estimare și a actualiza culoarea textului literei de la alb la negru pentru a fi vizibilă. pentru buclă continuă până când fiecare literă a cuvântului vizat a fost verificată. Acest lucru este important deoarece o scrisoare poate apărea de mai multe ori în cuvântul țintă.

boolean corect = fals; pentru (int k = 0; k < currWord.length(); k++)  if(currWord.charAt(k)==letterChar) correct = true; numCorr++; charViews[k].setTextColor(Color.BLACK);  

Pasul 2

Apoi, trebuie să verificăm dacă jucătorul a câștigat sau a pierdut jocul după ce a ghicit, sau a făcut o greșeală ghicită, dar poate continua. Încă înăuntru letterPressed, începeți prin a verifica dacă jucătorul a făcut o idee bună.

dacă (corectă) // corectă ghici

Dacă a făcut o presupunere bună, verifică dacă a ghicit toate literele cuvântului țintă.

dacă (numCorr == numChars) // utilizatorul a câștigat

Dacă este adevărat, informăm jucătorul că a câștigat jocul. Primul lucru pe care îl facem este dezactivarea butoanelor cu litere. Facem acest lucru prin implementarea unei alte metode de ajutor, disableBtns. Implementați această metodă după letterPressed.

public void disableBtns () int numLetters = letters.getChildCount (); pentru (int l = 0; < numLetters; l++)  letters.getChildAt(l).setEnabled(false);  

În disableBtns, vom trece prin vederi prin intermediul adaptorului și vom dezactiva fiecare buton. Dacă utilizatorul a câștigat jocul, vom invoca disableBtns și afișarea unui dialog de alertă către utilizator. În dialogul de avertizare, îi întrebăm și pe jucător dacă doresc să joace un alt joc.

Ia-ți un moment să te uiți peste asta dacă nu ești familiarizat cu dialogurile pe Android. Am setat proprietățile, inclusiv titlul și un mesaj, inclusiv confirmarea răspunsului corect. Adăugăm un buton pentru a reda din nou dialogul de alertă, care sună joaca jocul metodă. Adăugăm, de asemenea, un buton pentru ieșire, care duce jucătorul înapoi la activitatea principală.

dacă (numCorr == numChars) // Dezactivați butoanele disableBtns (); // Afișare Alert Dialog AlertDialog.Builder winBuild = nou AlertDialog.Builder (acest); winBuild.setTitle ( "YAY"); winBuild.setMessage ("Ai câștigat! \ n \ nRezspunsul a fost: \ n \ n" + currWord); winBuild.setPositiveButton ("Redați din nou", noul dialog DialogInterface.OnClickListener () public void onClick (dialog DialogInterface, int id) GameActivity.this.playGame ();); winBuild.setNegativeButton ("Exit", noul dialog DialogInterface.OnClickListener () public void onClick (dialog DialogInterface, int id) GameActivity.this.finish ();); winBuild.show (); 

Pasul 3

Dacă utilizatorul nu a câștigat jocul, trebuie să verificăm dacă a răspuns în mod incorect, dar mai are încă ghici. În interiorul altfel dacă bloc, vom arăta următoarea parte a corpului și vom crește numărul de presupuneri incorecte cu 1.

dacă (corecte) // corect ghici altceva dacă (currPart < numParts)  //some guesses left bodyParts[currPart].setVisibility(View.VISIBLE); currPart++; 

Pasul 4

După altfel dacă, putem presupune în siguranță că jucătorul a pierdut jocul. Începem prin dezactivarea butoanelor așa cum am făcut mai devreme și vom afișa un dialog de avertizare care să ateste că jucătorul a pierdut jocul. De asemenea, includem răspunsul corect și oferim opțiunea de a juca un alt joc.

altfel // utilizatorul a pierdut disableBtns (); // Afișare Alert Dialog AlertDialog.Builder loseBuild = nou AlertDialog.Builder (acest); loseBuild.setTitle ( "OOPS"); loseBuild.setMessage ("Pierdeți! \ n \ n Răspunsul a fost: \ n \ n" + currWord); loseBuild.setPositiveButton ("Redați din nou", noul dialog DialogInterface.OnClickListener () public void onClick (dialog DialogInterface, int id) GameActivity.this.playGame ();); loseBuild.setNegativeButton ("Exit", noul dialog DialogInterface.OnClickListener () public void onClick (dialog DialogInterface, int id) GameActivity.this.finish ();); loseBuild.show (); 

Credeți sau nu, am realizat implementarea aspectului de interacțiune al utilizatorului din joc. Tot ce a mai rămas pentru noi este să adăugăm câteva îmbunătățiri la interfață.



3. Finalizați bara de acțiune

Pasul 1

Să terminăm acest tutorial prin adăugarea unui buton de ajutor la bara de acțiune. Nu voi intra în prea multe detalii, dar simțiți-vă liber să experimentați acest lucru în propriile aplicații. În funcție de nivelurile API pe care le vizați, asistența pentru navigare prin intermediul barei de acțiune este furnizată cu codificare puțin sau deloc. Pentru a vă asigura că bara de acțiune permite navigarea înapoi la activitatea principală, adăugați următoarele în interiorul onCreate în activitatea jocului.

getActionBar () setDisplayHomeAsUpEnabled (adevărat).;

În manifeste, rețineți că am specificat activitatea principală ca părinte a activității jocului. Acest lucru spune sistemului de operare că navigarea înapoi / sus de la activitatea de joc ar trebui să aducă pe utilizator înapoi la activitatea principală. Proiectul dvs. ar trebui să aibă o resursă din meniul principal. Deschideți-l și aruncați o privire la conținutul său. În mod implicit, va avea o acțiune de setări, care nu este necesară pentru jocul nostru. Inserați următorul fragment de cod, pentru a adăuga un buton de ajutor.

Rețineți că am enumerat pictograma de ajutor din primul tutorial din această serie. Puteți adăuga mai multe butoane în bara de acțiune mai târziu, dacă doriți. Dacă faceți acest lucru, va trebui să extindeți codul de activitate pe care îl acoperim mai jos.

Nu avem nevoie de funcțiile barei de acțiune din activitatea principală, așa că dacă Eclipse a adăugat onCreateOptionsMenu la clasa principală de activitate, nu ezitați să o eliminați.

Pasul 2

Înapoi în activitatea jocului, setați ecranul pentru a utiliza meniul principal adăugând următoarea metodă.

@Override public boolean onCreateOptionsMenu (meniu din meniu) getMenuInflater () inflate (R.menu.main, meniu); return true; 

Adăugați o altă metodă pentru a specifica ce ar trebui să se întâmple atunci când utilizatorul încearcă să navigheze înapoi sau în sus sau apăsați pe butonul de ajutor din bara de acțiune.

@Override public boolean onOptionsItemSelected (elementul MenuItem) comutare (item.getItemId ()) case android.R.id.home: NavUtils.navigateUpFromSameTask (this); return true; caz R.id.action_help: showHelp (); return true;  retur super.onOptionsItemSelected (element); 

Navigarea în sus va duce utilizatorul înapoi la activitatea principală. android.R.id.home acțiunea corespunde apelului către setDisplayHomeAsUpEnabled am adăugat în onCreate.

Pasul 3

Adăugați o altă variabilă de instanță în partea de sus a clasei pentru informații despre ajutor.

privat AlertDialog helpAlert;

Vom utiliza o altă metodă de ajutor pentru a afișa informațiile de ajutor.

public void showAjutor () AlertDialog.Builder helpBuild = nou AlertDialog.Builder (acest); helpBuild.setTitle ( "Ajutor"); helpBuild.setMessage ("Ghiciți cuvântul selectând literele. \ n \ n" + "Aveți doar 6 selecții greșite, atunci jocul este terminat!"); helpBuild.setPositiveButton ("OK", noul DialogInterface.OnClickListener () public void onClick (dialog DialogInterface, int id) helpAlert.dismiss ();); helpAlert = helpBuild.create (); helpBuild.show (); 

Suportul pentru bara de acțiune pe care am inclus-o va funcționa numai pentru nivelurile API de 11 și mai sus, iar suportul de navigare va funcționa numai pentru nivelurile API de la 16 și peste. Pentru a sprijini versiunile mai vechi, va trebui să utilizați bibliotecile de asistență pentru bara de acțiune și navigare.

Concluzie

Jocul Hangman ar trebui să fie acum complet. Rulați-o și dați-i o rotire. Aplicația în forma sa actuală va funcționa numai pe versiunile recente de Android și interfața cu utilizatorul este potrivită doar pentru o gamă limitată de dispozitive. După cum puteți vedea, există loc de îmbunătățire. Pe lângă susținerea unei game largi de dispozitive, puteți îmbunătăți jocul adăugând nivele de dificultate sau categorii de cuvinte. Ați putea crea chiar un tablou de bord pentru a urmări scorurile.

Dacă ați finalizat această serie cu succes, ar fi trebuit să fi învățat despre mai multe aspecte ale platformei Android, inclusiv interacțiunea cu utilizatorul, adaptoarele, resursele XML și mobilizarea barei de acțiune.

Cod