Tworzenie gry 'memory' - problem z czasem, punktacją, opóźnieniem, losowaniem wygraną

0

Witam, na zajęcia z programowania musze napisać grę memory - czyli takie coś, że mamy obrazki zakryte klikamy 2 i jezeli sa taki same t znikna i nabijaja sie nam punty. Jezeli klikniemy 2 rozne to sie z powrotem zaslaniaja. A przy kazdym uruchomieniu gra losuje inaczej obrazki.

Mam aktualnie taki kod:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace memory
{
    public partial class Form1 : Form
    {
        int odkryte = 0;
        PictureBox starakarta;

        public Form1()
        {
            InitializeComponent();
        }

        private void karta11_Click(object sender, EventArgs e)
        {

            odkryte++;
            if (odkryte == 3)

            {
                odkryte = 1;
                karta11.Image = Properties.Resources.z;
                karta12.Image = Properties.Resources.z;
                karta13.Image = Properties.Resources.z;
                karta14.Image = Properties.Resources.z;
                karta21.Image = Properties.Resources.z;
                karta22.Image = Properties.Resources.z;
                karta23.Image = Properties.Resources.z;
                karta24.Image = Properties.Resources.z;
                karta31.Image = Properties.Resources.z;
                karta32.Image = Properties.Resources.z;
                karta33.Image = Properties.Resources.z;
                karta34.Image = Properties.Resources.z;
                karta41.Image = Properties.Resources.z;
                karta42.Image = Properties.Resources.z;
                karta43.Image = Properties.Resources.z;
                karta44.Image = Properties.Resources.z;
            }

            PictureBox karta = sender as PictureBox;

            if (karta.Tag == "1")
            {
                karta.Image = Properties.Resources.o1;
            }

            if (karta.Tag == "2")
            {
                karta.Image = Properties.Resources.o2;
            }
            if (karta.Tag == "3")
            {
                karta.Image = Properties.Resources.o3;
            }
            if (karta.Tag == "4")
            {
                karta.Image = Properties.Resources.o4;
            }
            if (karta.Tag == "5")
            {
                karta.Image = Properties.Resources.o5;
            }
            if (karta.Tag == "6")
            {
                karta.Image = Properties.Resources.o6;
            }
            if (karta.Tag == "7")
            {
                karta.Image = Properties.Resources.o7;
            }
            if (karta.Tag == "8")
            {
                karta.Image = Properties.Resources.o8;
            }
            if (starakarta != null)
                
                if (karta.Tag == starakarta.Tag)
                {
                    if (starakarta != karta)
                    {
                        karta.Hide();
                        starakarta.Hide();
                    }
                }
            starakarta = karta;
        }

        
    }
        
}

Gra działa, ale potrzebuję dorobić kilka elementów, a mianowicie:
1)po pierwszym kliknięciu, żeby zaczął odliczać się czas
2)punktacja
3)po kliknięciu 2 takich samych żeby ten drugi nie znikał od razu(tak to nawet go nie widzimy) a z opóźnieniem
4)losowanie elementów
5)gdy wszystkie obrazki znikną powinien wyskoczyć komunikat, że wygraliśmy i w nim ile pk i jak długo graliśmy

Prosiłbym o w miarę możliwości dokładne wytłumaczenie, gdyż jestem dopiero początkującym (miałem raptem 2 wykłady do tej pory)
Z góry dziękuję za wszelką pomoc :)

0
            if (karta.Tag == "1")
            {
                karta.Image = Properties.Resources.o1;
            }

            if (karta.Tag == "2")
            {
                karta.Image = Properties.Resources.o2;
            }
            if (karta.Tag == "3")
            {
                karta.Image = Properties.Resources.o3;
            }
            ...

to można skrócić do

switch(karta.Tag) {
    "1": karta.Image = Properties.Resources.o1; break;
    "2": karta.Image = Properties.Resources.o2; break;
    "3": karta.Image = Properties.Resources.o3; break;
    "4": karta.Image = Properties.Resources.o4; break;
    "5": karta.Image = Properties.Resources.o5; break;
    "6": karta.Image = Properties.Resources.o6; break;
    "7": karta.Image = Properties.Resources.o7; break;
    "8": karta.Image = Properties.Resources.o8; break;
}
0

takie coś nie dziła, wywala błedy.

 Error	1	} expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	50	13	memory
Error	2	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	51	19	memory
Error	3	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	51	19	memory
Error	4	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	51	21	memory
Error	5	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	52	8	memory
Error	6	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	52	8	memory
Error	7	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	52	10	memory
Error	8	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	53	8	memory
Error	9	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	53	8	memory
Error	10	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	53	10	memory
Error	11	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	54	8	memory
Error	12	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	54	8	memory
Error	13	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	54	10	memory
Error	14	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	55	8	memory
Error	15	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	55	8	memory
Error	16	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	55	10	memory
Error	17	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	56	8	memory
Error	18	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	56	8	memory
Error	19	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	56	10	memory
Error	20	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	57	8	memory
Error	21	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	57	8	memory
Error	22	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	57	10	memory
Error	23	Invalid expression term ':'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	58	8	memory
Error	24	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	58	8	memory
Error	25	; expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	58	10	memory
Error	26	{ expected	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	58	55	memory

A poza tym to mi nie pomaga w stworzeniu elementów, które potrzebuję:P

0

Nie działa, bo brakuje case w każdej linijce.

adixt napisał(a)

Gra działa, ale potrzebuję dorobić kilka elementów, a mianowicie:
1)po pierwszym kliknięciu, żeby zaczął odliczać się czas
2)punktacja
3)po kliknięciu 2 takich samych żeby ten drugi nie znikał od razu(tak to nawet go nie widzimy) a z opóźnieniem
4)losowanie elementów
5)gdy wszystkie obrazki znikną powinien wyskoczyć komunikat, że wygraliśmy i w nim ile pk i jak długo graliśmy

  1. To możesz zrobić sobie dwa pola typu DateTime, jedno o nazwie start, drugie stop. Po pierwszym kliknięciu do start wstawiasz aktualny czas, po zakończeniu gry wstawiasz aktualny czas do stop. Potem odejmujesz i wiesz jak długo trwała gra.
  2. Jaka punktacja, jakiej jej zasady?
  3. Chodzi Ci o jakąś animację?
  4. Klasa Random służy do losowania. Nie wiem co konkretnie chcesz losować.
  5. To pewno trzeba będzie użyć MessageBox.Show i wyświetlić wartość z pewnych zmiennych.
0
somekind napisał(a)

Nie działa, bo brakuje case w każdej linijce.

adixt napisał(a)

Gra działa, ale potrzebuję dorobić kilka elementów, a mianowicie:
1)po pierwszym kliknięciu, żeby zaczął odliczać się czas
2)punktacja
3)po kliknięciu 2 takich samych żeby ten drugi nie znikał od razu(tak to nawet go nie widzimy) a z opóźnieniem
4)losowanie elementów
5)gdy wszystkie obrazki znikną powinien wyskoczyć komunikat, że wygraliśmy i w nim ile pk i jak długo graliśmy

  1. To możesz zrobić sobie dwa pola typu DateTime, jedno o nazwie start, drugie stop. Po pierwszym kliknięciu do start wstawiasz aktualny czas, po zakończeniu gry wstawiasz aktualny czas do stop. Potem odejmujesz i wiesz jak długo trwała gra.
  2. Jaka punktacja, jakiej jej zasady?
  3. Chodzi Ci o jakąś animację?
  4. Klasa Random służy do losowania. Nie wiem co konkretnie chcesz losować.
  5. To pewno trzeba będzie użyć MessageBox.Show i wyświetlić wartość z pewnych zmiennych.
  1. mógłbym prosić o bardziej konkretną instrukcje jak to dokonać, a poza tym czemu użyć DateTime a nie Timer? CZy Timer nie odlicza czasu? Chcę osiągnąć takie coś, że na dole będę miał jakby stoper odliczający co sekundę czas gry (0:00, 0:01...) i myślę ze można to zrobić w 1 okienku wykorzystując Timer, ale nie wiem jak.
  2. chodzi mi o zwykła punktacje - 1pkt po każdej zgadniętej parze obrazków
    3)nie chdzi mi o animacje, a o kod, który spowoduje opóźnienie znikniecia obrazka po kliknięciu(jeżeli są 2 takie same)
  3. chodzi o to że po kazdym uruchomieniu aplikacji obrazki byly w innym polozeniu(oczywisice z góry wygladaja tak samo bo wszystkie zakryte, ale musi sie zmieniac paramert .Tag ktory odpowiada za zdjecie pod spodem)

co do punktacji mam taki pomysł: na początku zdeklarować

int x = 0; 

a na dole w if'ce dopisac

 if (starakarta != karta)
                    {
                        karta.Hide();
                        starakarta.Hide();
                        x = x++;
                        textBox1.Text = x;
                    }

Tylko niestety to nie działa, bo

Error	9	Cannot implicitly convert type 'int' to 'string'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	93	41	memory
 

Jak to ominąć?

0
adixt napisał(a)
  1. mógłbym prosić o bardziej konkretną instrukcje jak to dokonać, a poza tym czemu użyć DateTime a nie Timer? CZy Timer nie odlicza czasu? Chcę osiągnąć takie coś, że na dole będę miał jakby stoper odliczający co sekundę czas gry (0:00, 0:01...) i myślę ze można to zrobić w 1 okienku wykorzystując Timer, ale nie wiem jak.

DateTime pozwala przechowywać informację o czasie, mając dwie takie wartości można obliczyć ich różnicę. Do mierzenia czasu można też użyć Stopwatch, który ma metody Start i Stop.
A Timer nie służy do mierzenia czasu, tylko do wykonywania określonej operacji w określonym odstępie czasu. W szczególności możesz za jego pomocą zmieniać tekst jakiegoś Labela i pokazywać ile czasu upłynęło od początku gry. Ale do przechowywania tej wartości go nie użyjesz.

3)nie chdzi mi o animacje, a o kod, który spowoduje opóźnienie znikniecia obrazka po kliknięciu(jeżeli są 2 takie same)

Najprostszy sposób to uśpienie całej aplikacji na żądany czas przy użyciu Thread.Sleep(). Tylko nie wiem, czy taki efekt opóźnienia Ci wystarczy.

  1. chodzi o to że po kazdym uruchomieniu aplikacji obrazki byly w innym polozeniu(oczywisice z góry wygladaja tak samo bo wszystkie zakryte, ale musi sie zmieniac paramert .Tag ktory odpowiada za zdjecie pod spodem)

A gdzie przechowujesz informację o tym, który obrazek znajduje się, w którym miejscu planszy?
Tak na pierwszy rzut oka, to podstawą całej gry powinna być tablica int[4, 4], wypełniona liczbami.

Tylko niestety to nie działa, bo

Error	9	Cannot implicitly convert type 'int' to 'string'	C:\Users\Dziomek\Desktop\MEMORY!!\memory\Form1.cs	93	41	memory
 

Jak to ominąć?

A przeczytałeś, co tam jest napisane?
Nie możesz wstawić liczby całkowitej do właściwości typu napis.
To jest źle:

textBox1.Text = x;

Ale możesz wywołać x.ToString(), żeby zamienić liczbę w napis.

Czym Twoim zdaniem różni się to:

x = x++;

od tego:

x++;

Wydaje mi się, że nie znasz podstaw języka, a bierzesz się za pisanie aplikacji okienkowych. Stracisz tylko czas, który mógłbyś przeznaczyć na prawdziwą naukę języka.

0

a więc tak stowrzyłem już punktację poprzez:

if (starakarta != karta)
                    {
                        karta.Hide();
                        starakarta.Hide();
                        x++;
                        label1.Text = x.ToString();
                                                
                    } 

i wymyśliłem kod na opóźnienie odwracania, żeby móc zobaczyć drugi obrazek

 for (int i = 0; i < 10; i++)
            {
                System.Threading.Thread.Sleep(100);
            }

tylko nie wiem, gdzie go wkleić aby dorbze działał, bo jak go wkleiłem przed karta.Hide to po kliknięciu 2 obrazka znika on po czasie ale i tak nie widzimy obrazka(cały czas jest zakryty, a powinien pojawić się ten drugi i po czasie zniknąć). Jak tego dokonać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1