Witam,
mam problem przy pisaniu kodu dla TicTacToe, konkretnie nie mam pojęcia jak mogę dołączyć do gry zliczanie zwycięstw dla kółka i dla krzyżyka. Dodam że jest to zwykły single player. Przy wpf jest to dość proste tutaj jednak nie mam pomysłu. Proszę o jakieś wskazówki.
Niezbyt rozumiem w czym masz konkretnie problem. Jak byś to zrobił w WPF, a nie możesz zrobić w UWP?
Przy WPF to Form_Load wystarczy obsłużyć, ale tutaj w UWP?
Pokaż kod w WPF w jaki sposób byś to obsłużył to Ci doradzimy.
Ok, coś się udało ale nie do końca. Spróbowałem sił w UWP ale mam problem w tym miejscu:
if (turn_count == 9)
{
draws_score_box.Text = (++draws).ToString();
if (Msgbox.Show("Remis"))
{
resetButtonsAndTurns();
}
else
canceled_new_game = true;
}
wyświetla błąd Error CS0029 Cannot implicitly convert type 'void' to 'bool'
Wcześniej aby wyświetlić Msgbox zrobiłem metode async
public static class Msgbox
{
static public async void Show(string mytext)
{
var dialog = new MessageDialog(mytext);
await dialog.ShowAsync();
}
}
- W IF-ie wywołujesz metodę która nic nie zwraca, więc jak IF ma sprawdzić jej wynik działania?
- Wyświetlasz jakiś MessageBox użytkownikowi ale ten box nie ma żadnego przycisku? Wyświetl jakiś MessageBox z np.: "reset game" i "continue" i zbierz od użytkownika odpowiedź i ją zwróć....
Poniżej jest cały kod sprawdzający wygranąi założenie było takie że ma też wyświetlaćw txtblock'ach zwycięztwa x i zwycięztwa y. Teraz problem cały czas tkwi w błędzie wyświetla błąd Error CS0029 Cannot implicitly convert type 'void' to 'bool' . Ciągle ten sam.
Moglibyście pomóc i powiedzieć jak to poprawić?
Co do Msgboxa wiem że nie ma tam żadnych przycisków, póki co są na polu gry.
private void checkForWinner()
{
//HORIZONTAL
bool winner = false;
if ((A1.Content == A2.Content) && (A2.Content == A3.Content) && (!A1.IsEnabled))
winner = true;
else if ((B1.Content == B2.Content) && (B2.Content == B3.Content) && (!B1.IsEnabled))
winner = true;
else if ((C1.Content == C2.Content) && (C2.Content == C3.Content) && (!C1.IsEnabled))
winner = true;
//VERTICAL
else if ((A1.Content == B1.Content) && (B1.Content == C1.Content) && (!A1.IsEnabled))
winner = true;
else if ((A2.Content == B2.Content) && (B2.Content == C2.Content) && (!A2.IsEnabled))
winner = true;
else if ((A3.Content == B3.Content) && (B3.Content == C3.Content) && (!A3.IsEnabled))
winner = true;
//PRZEKĄTNA
else if ((A1.Content == B2.Content) && (B2.Content == C3.Content) && (!A1.IsEnabled))
winner = true;
else if ((A3.Content == B2.Content) && (B2.Content == C1.Content) && (!C1.IsEnabled))
winner = true;
if (winner)
{
disableButtons();
if (turn)
{
O_score_box.Text = (++O_score).ToString();
if (Msgbox.Show("gracz O Wygrał"))
{
resetButtonsAndTurns();
}
//{
// Winner = "Gracz O";
// O_score_box.Text = (++O_score).ToString();
// resetButtonsAndTurns();
//}
else
canceled_new_game = true;
}
else
{
X_score_box.Text = (++X_score).ToString();
if (Msgbox.Show("gracz X Wygrał"))
{
resetButtonsAndTurns();
}
else
canceled_new_game = true;
}
}
else
{
if (turn_count == 9)
{
draws_score_box.Text = (++draws).ToString();
if (Msgbox.show("Remis"))
{
resetButtonsAndTurns();
}
else
canceled_new_game = true;
}
}
}
Twoja funkkcja Msgbox.Show() jest typu void
, więc nie możesz na niej zrobić porównanie ifem.
Możesz zrobić tak:
public static class Msgbox
{
static public async Task<bool> Show(string mytext)
{
var dialog = new MessageDialog(mytext);
await dialog.ShowAsync();
return true;
}
}
Teraz ona zwróci true dopiero, kiedy ShowAsync() się zakończy (nie wiem czy nie kończy się przypadkiem wtedy, kiedy człowiek zamknie okienko).
Super! dzięki za odpowiedź. Teraz tylko jest problem w tym momencie: konkretnie nie można konwertować Task<bool> na bool? da radę to jakoś poprawić?
if (winner)
{
disableButtons();
if (turn)
{
O_score_box.Text = (++O_score).ToString();
if (Msgbox.Show("gracz O Wygrał"))
{
resetButtonsAndTurns();
}
else
canceled_new_game = true;
}
a może sobie poczytaj trochę więcej co?
var result = await Show("And");
Tak, jasne, jestem na samym początku drogi z programowaniem, co dzień mam większą wiedzę. Dzięki ogromne za pomoc!.
Jeszcze jedno pytanie. Dlaczego po jednej turze gdy nacisnę na jedno z pól (Button) wyskakuje Msgbox("Gracz X Wygrał"), choć powinien resetować bo jest metoda resetButtonsAndTurns() która wygląda tak:
private void resetButtonsAndTurns()
{
turn = true;
turn_count = 0;
canceled_new_game = false;
foreach (Button c in buttonArray)
{
try
{
Button b = c;
b.IsEnabled = true;
b.Content = " " ;
}
catch { }
}
}