Windows Phone 8 in 10 zile 4
Azi vom discuta despre partea de logică a aplicației, despre cum fiecare element al aplicației interacționează cu altul.
Clasa Question
Click dreapta pe numele soluției-> Add ->New item -> Class și îi dăm numele de question.cs.
Clasa va avea doi constructori, unul gol și unul care va conține cuvântul meu, cele patru variante și explicația/definiția din dex.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class question { public string sin, v1, v2, v3, v4, ex; public question(string _sin, string _v1, string _v2, string _v3, string _v4, string _ex) { sin = _sin; v1 = _v1; v2 = _v2; v3 = _v3; v4 = _v4; ex = _ex; } public question() { } } |
Logica
Prin același procedeu mai creez o clasă MainViewModel.cs. Aici vom ține toată logica aplicației. Acesta este codul și îl voi explica pe rând:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
class MainViewModel { question[] q = new question[81]; public static int j; public static int scor; Random rand = new Random(); public MainViewModel() { q[0] = new question("","","","",""); .... q[100] = new question("","","","",""); } public question GenerateQ() { int i = rand.Next(0, 81); string s; j = rand.Next(4); switch(j) { case 0: s = q[i].v1; q[i].v1 = q[i].v2; q[i].v2 = s; s = q[i].v3; q[i].v3 = q[i].v4; q[i].v4 = s; s = q[i].v1; q[i].v1 = q[i].v3; q[i].v3 = s; break; case 1: s = q[i].v1; q[i].v1 = q[i].v3; q[i].v3 = s; s = q[i].v2; q[i].v2 = q[i].v4; q[i].v4 = s; s = q[i].v1; q[i].v1 = q[i].v2; q[i].v2 = s; break; case 2: s = q[i].v1; q[i].v1 = q[i].v4; q[i].v4 = s; s = q[i].v3; q[i].v3 = q[i].v2; q[i].v2 = s; s = q[i].v3; q[i].v3 = q[i].v1; q[i].v1 = s; break; } return q[i]; } } |
Creez un array de obiecte tip question în primul rând și populez array-ul meu cu întrebările pe care le am (nu, nu le dau share, mai mult am stat să fac întrebările decât să scriu codul aplicației). Este foarte important de ținut minte ordinea parametrilor:
- Cuvântul meu
- Varianta corectă
- Varianta greșită
- Varianta greșită
- Varianta greșită
- Explicațiile
Creez o clasă GenerateQ care o să îmi genereze întrebările și o să returneze un obiect de tip question pe care-l voi folosi eu în aplicația mea.
În interiorul metodei, cu un random (de i) decid ce întrebare să fie aleasă, cu un random (de j) decid care va fi varianta corectă și dau variantelor un shuffle. La final returnez obiectul meu pe care-l voi folosi în newGame.xaml.cs
NewGame
În newGame.xaml.cs voi scrie așa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
public partial class newGame : PhoneApplicationPage { private readonly MainViewModel _mvm; question q = new question(); int j; public newGame() { InitializeComponent(); _mvm = new MainViewModel(); StartGame(); } private void StartGame() { scor.Text = "Scor: " + MainViewModel.scor.ToString(); q = _mvm.GenerateQ(); sinonimTxt.Text = q.sin; v1.Content = q.v1; v2.Content = q.v2; v3.Content = q.v3; v4.Content = q.v4; } private void checkAnswer(object sender, System.Windows.Input.GestureEventArgs e) { switch((string)((Button)sender).Name) { case "v1": if (MainViewModel.j == 3) ShowCorrect(); else ShowWrong(); break; case "v2": if (MainViewModel.j == 0) ShowCorrect(); else ShowWrong(); break; case "v3": if (MainViewModel.j == 1) ShowCorrect(); else ShowWrong(); break; case "v4": if (MainViewModel.j == 2) ShowCorrect(); else ShowWrong(); break; } } private void ShowWrong() { MessageBox.Show(q.ex, "Greșit", MessageBoxButton.OK); StartGame(); MainViewModel.scor -= 15; } private void ShowCorrect() { StartGame(); MainViewModel.scor += 10; } private void shareAction(object sender, System.Windows.Input.GestureEventArgs e) { } } |
Declar clasa mea MainViewModel la început și obiectul q de tip question. Clasa MainViewModel o inițializez în constructorul newGame generând astfel și întrebările scrise de mine anterior.
Tot ce mai am de făcut este acum să pornesc jocul prin metoda StartGame();
La fiecare apelare de StartGame voi lua scorul (care a fost declarat ca fiind variabilă statică aparținând întregii clase, nu doar obiectului _mvm), apelez metoda care îmi va returna obiectul meu cu variantele amestecate și servesc view-ului textul din fiecare obiect.
Toate butoanele duc la un singur handler (linia 25) checkAnswer care va verifica care buton a declanșat event-ul și în funcție de declanșator o să îmi afișeze dacă am avut sau nu dreptate.
Linia 46 ShowWrong o să îmi afișeze un mesaj de eroare care va genera următoarea întrebare în momentul când dau click/tap pe ok și îmi va scădea 15 puncte din scor.
Linia 53 ShowCorrect doar va genera următoarea întrebare și îmi va adăuga 10 puncte la scor.
Linia 59 o vom ignora momentan, urmând să o discutăm spre finalul seriei.
Learn
În aplicația mea am 2 view-uri principale de care trebuie să mă ocup: newGame și learn. Pentru cel de-al doilea am mai puțin cod:
Practic generez întrebarea, îi afișez cuvântul și explicația cu sinonim (linia 14).
By: Adrian Coman