Reklama
Strona 1 z 2 12 OstatniaOstatnia
Pokazuje wyniki od 1 do 15 z 17

Temat: [C#] Oczko

  1. #1

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny [C#] Oczko

    Witam, zacząłem pisać prostą gierkę w C# - oczko. Mam jednak kilka problemow z którymi nie potrafię sobie poradzić. Zacznijmy może od kodu
    Kod :
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Collections;
    
    namespace oczko
    {
      
        public partial class Form1 : Form
        {
            Random los = new Random();
            List<int> list = new List<int>();
            int score = 0;
            int escore = 0;
            int counter = 3;
            
                   
            public Form1()
            {
                InitializeComponent();
                button2.Enabled = false;
                button3.Enabled = false;
            }
    
            private void label1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e) // <--- NOWA GRA
            {
                int score = 0;
                int escore = 0;
                int counter = 3;
                button2.Enabled = true;
                button3.Enabled = true;
                string[] card = new string[24];
                int[] value = new int[24];
    
                card[0] = "9 trefl";
                card[1] = "9 karo";
                card[2] = "9 pik";
                card[3] = "9 kier";
                card[4] = "10 trefl";
                card[5] = "10 karo";
                card[6] = "10 pik";
                card[7] = "10 kier";
                card[8] = "Walet trefl";
                card[9] = "Walet karo";
                card[10] = "Walet pik";
                card[11] = "Walet kier";
                card[12] = "Dama trefl";
                card[13] = "Dama karo";
                card[14] = "Dama pik";
                card[15] = "Dama kier";
                card[16] = "Krol trefl";
                card[17] = "Krol karo";
                card[18] = "Krol pik";
                card[19] = "Krol kier";
                card[20] = "As trefl";
                card[21] = "As karo";
                card[22] = "As pik";
                card[23] = "As kier";
    
                value[0] = 0;
                value[1] = 0;
                value[2] = 0;
                value[3] = 0;
                value[4] = 10;
                value[5] = 10;
                value[6] = 10;
                value[7] = 10;
                value[8] = 2;
                value[9] = 2;
                value[10] = 2;
                value[11] = 2;
                value[12] = 3;
                value[13] = 3;
                value[14] = 3;
                value[15] = 3;
                value[16] = 4;
                value[17] = 4;
                value[18] = 4;
                value[19] = 4;
                value[20] = 11;
                value[21] = 11;
                value[22] = 11;
                value[23] = 11;
                       
                listBox1.Items.Clear();
                listBox2.Items.Clear();
                list.Clear();
                
               //losowanie 4 kart (po 2 na gracza)
                while(list.Count != 4)
                {
                int i = los.Next(0, 23);
                if (list.Contains(i))
                    continue;
                else
                    list.Add(i);
                }
                 
              
                listBox1.Items.Add(card[list[0]]);
                listBox1.Items.Add(card[list[1]]);
                score = value[list[0]] + value[list[1]];
                textBox1.Text = score.ToString();
    
                //przeciwnik               
                
    
                escore = value[list[2]] + value[list[3]];
    
                while (escore < 15)
                {
                    counter++;
                    while (list.Count != counter + 1)
                    {
                        listBox2.Items.Clear();
                        int i = los.Next(0, 23);
                        if (list.Contains(i))
                            continue;
                        else
                            list.Add(i);
    
                        escore += value[list[counter]];
    
                        for (int j = 2; j < counter + 1; j++)
                        {                        
                            listBox2.Items.Add(card[list[j]]);
                        }
                    }
                }
    
                
                textBox2.Text = escore.ToString();
    
               
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button2_Click(object sender, EventArgs e) // <--- DOBIERANIE KARTY
            {
                counter++;
                string[] card = new string[24];
                int[] value = new int[24];
    
                card[0] = "9 trefl";
                card[1] = "9 karo";
                card[2] = "9 pik";
                card[3] = "9 kier";
                card[4] = "10 trefl";
                card[5] = "10 karo";
                card[6] = "10 pik";
                card[7] = "10 kier";
                card[8] = "Walet trefl";
                card[9] = "Walet karo";
                card[10] = "Walet pik";
                card[11] = "Walet kier";
                card[12] = "Dama trefl";
                card[13] = "Dama karo";
                card[14] = "Dama pik";
                card[15] = "Dama kier";
                card[16] = "Krol trefl";
                card[17] = "Krol karo";
                card[18] = "Krol pik";
                card[19] = "Krol kier";
                card[20] = "As trefl";
                card[21] = "As karo";
                card[22] = "As pik";
                card[23] = "As kier";
    
                value[0] = 0;
                value[1] = 0;
                value[2] = 0;
                value[3] = 0;
                value[4] = 10;
                value[5] = 10;
                value[6] = 10;
                value[7] = 10;
                value[8] = 2;
                value[9] = 2;
                value[10] = 2;
                value[11] = 2;
                value[12] = 3;
                value[13] = 3;
                value[14] = 3;
                value[15] = 3;
                value[16] = 4;
                value[17] = 4;
                value[18] = 4;
                value[19] = 4;
                value[20] = 11;
                value[21] = 11;
                value[22] = 11;
                value[23] = 11;            
                                    
                while(list.Count != counter+1)
                {
                int i = los.Next(0, 23);
                if (list.Contains(i))
                    continue;
                else
                    list.Add(i);
                }
                           
                
                listBox1.Items.Add(card[list[counter]]);
    
                score += value[list[counter]];
    
                textBox1.Text = score.ToString();
    
                                     
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                MessageBox.Show("Twoj wynik to: " + score.ToString() );
                listBox1.Items.Clear();
                list.Clear();
                textBox1.Text = "0";
                button2.Enabled = false;
                button3.Enabled = false;
            }
    
    
        }
    }
    W moim rozumowaniu działa to tak:
    1. Program losuje 4 liczby, które następnie wpisuje do listy (sprawdza czy nie się nie powtarzają), liczby odpowiadają indeksom dwóch tabeli (string card i int value)
    2. Program wyswietla na podstawie wylosowanych liczb 2 karty gracza i oblicza jego obecny wynik
    3. Program sprawdza czy wynik komputera(przeciwnika) jest wiekszy od np. 15, jezeli nie to losuje jeszcze 1 liczbe, zwieksza licznik (counter) itd i na koncu wyswietla jego wynik koncowy i karty (poki co wszystko jest jawnie by miec pewnosc ze karty sie nie powtarzaja)
    4. Po kliknieciu przez gracza "dobierz karte", program losuje nowa karte, wyswietla ja i dodaje do wyniku gracza oraz zwieksza licznik (counter)
    5. Gdy gracz uzna ze nie chce dalej grac klika "pas" i program porownuje wynik jego i komputera.

    Problem jest z owym licznikiem, z poczatku ustawiony jest on na 3, program dobrze losuje 4 karty, algorytm przeciwnika dziala (counter sie zwieksza, wyniki sie zgadzaja, karty sie nie powtarzaja). Jednak gdy gracz chce dobrac karte, licznik sie resetuje i znow ustawia na 3 (mimo ze wczesniejsze dodatkowe losowania programu go zwiekszyly) i wtedy wychodza bledy w wyniku gracza. Nie wiem gdzie powinienem umiescić ten licznik by działał poprawnie?

    Druga sprawa to sposob deklaracji tych tablic card i value... nie mogę tego inaczej rozwiązać, niż deklarować te tablice w obu przyciskach ? Jeżeli dam to w innym miejscu to wyskakuja bledy, a poki co na inne rozwiazanie nie wpadlem..

  2. #2
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    32
    Posty
    1,710
    Siła reputacji
    14

    Domyślny

    Nie wiem czy z takim podejściem dasz radę dobrze tą grę napisać.

    Nie czytałem nawet kodu bardzo ani opisu ale po prostu widzę jak to próbujesz oprogramować.

    Zrób to sobie w klasie i operuj metodami a nie instrukcje wywołujesz od razu w zdarzeniach

    #edit
    no i w bardzo słaby sposób te karty tworzysz. Przecież to jest idealny przyklad na tablice 2 wymiarowa [6][4].
    i:
    0 - dziewiątka
    1 - dziesiątka
    2 - walet
    3 - dama
    4 - krol
    5 - as

    j:
    0 - trefl
    1 - karo
    2 - pik
    3 - kier

    do tego tablica z punktacja odpowiadająca figura

    0 - 0
    1 - 10
    2 - 2
    3 - 3
    4 - 4
    5 - 11

    porób metodki w tej klasie zeby Ci zwraca punkty, nazwy kart.

    #edit2
    Losuj cyfry z tabeli figur i kolorow a potem proboj dodac do listy HashSet (googlij sobie co to, chodzi ogolnie o unikalne rekordy) jak zwrotka z metody .Add() będzie false tzn ze trzeba losować ponownie bo takie istnieja.

    I w ogole nie wiem o co chodzi Ci z tym licznikiem, nie moge skminic po co on jest i co reprezentuje
    Ostatnio zmieniony przez Kusterek : 03-04-2015, 21:34

    irc: freenode.net in #torgdevs

  3. #3

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny

    Chyba przerasta mnie ten projekt ;(

    Mimo wszystko próbuje zrobić to w taki sposób: tworze kolekcje (list<string>) wszystkich kart (cards) oraz 2 inne kolekcje - gracza i przeciwnika.
    Umieszczam karty w kolekcji cards i robie cos takiego dla próby:

    Kod :
    private void newGameButton_Click(object sender, EventArgs e)
            {            
                listBox1.Items.Clear();
                           
                    i = rand.Next(0, 23);
                    cards.RemoveAt(i);
                    j = rand.Next(0, 22);
                    cards.RemoveAt(j);
                
                listBox1.Items.Add(cards[i]);
                listBox1.Items.Add(cards[j]);
                
            }
    Losuje mi liczbe z przedziału 0-23 i usuwa ją z kolekcji kart i wyświetla to w listboxie bym mógł zobaczyc wynik losowania.
    Niestety, po kilku próbach wyskakuje to


    nie wiem czy dobrze rozumiem działanie kolekcji, ale jezeli usuwamy za pomoca RemoveAt, to kasuje nam to np. to co jest pod indeksem X, a indeks X+1 przesuwa na jego miejsce itd (zmniejsza to całą tablice?)

  4. Reklama
  5. #4
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    32
    Posty
    1,710
    Siła reputacji
    14

    Domyślny

    ta, dlatego nie wpisuj , 23 albo 22 tylko listbox1.Items.Count

    irc: freenode.net in #torgdevs

  6. #5

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny

    listbox1.items.count?

    a nie bardziej coś takiego?

    Kod :
                i = rand.Next(0, cards.Count);
                cards.RemoveAt(i);
                j = rand.Next(0, cards.Count);
                cards.RemoveAt(j);
    
                listBox1.Items.Add(cards[i]);
                listBox1.Items.Add(cards[j]);
    listbox jest tutaj tylko metodą tymczasowego wyświetlania liczb, żebym wiedział kiedy w końcu będzie mi losowało 2 różne liczby
    niestety powyższy sposób po kilku próbach w końcu wyrzuca błąd, nie bardzo wiem dlaczego... i mimo iż po pierwszym losowaniu kasuje zawartośc wylosowanego indeksu to zdarza się że w drugim losowaniu zwróci mi tę samą kartę...

    Próbuje zrobić metodę która wyjmuje losową kartę z listy (wszystkch kart) i wkłada ją do innej listy (gracza lub komputera).
    Ostatnio zmieniony przez hefalump : 04-04-2015, 15:43

  7. #6
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    34
    Posty
    11,076
    Siła reputacji
    25

    Domyślny

    Ja bym w ogóle zaczął od klasy karta zawierającej pola nr, kolor, wartość (klasa uniwersalna do wszystkich gier, w niektórych wartość się zmienia też z kolorem), robił listę czy co tam z tymi kartami i wtedy ją tasował. A dalej po prostu bierzesz z góry listy i nie ma żadnych głupot.
    Przenosisz z tej listy karty na listy gracza i kasyna i możesz spokojnie policzyć łączną wartość czy wyświetlić
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  8. Reklama
  9. #7
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    32
    Posty
    1,710
    Siła reputacji
    14

    Domyślny

    @up
    tak, moj blad cards. Tylko nie wiem czy w przypadku tablic Count zwraca ilosc zadeklarowaną czy uzupełnioną, musisz sprawdzić sam

    Ale moim zdaniem to i tak rzeźbienie w gównie i w taki sposób nie skończysz tej aplikcji, problemy będą się mnożyć.
    Nie wiem czego się uparłeś na tak chujowe rozwiązanie, utrudniasz sam sobie życie
    Ostatnio zmieniony przez Kusterek : 04-04-2015, 15:49

    irc: freenode.net in #torgdevs

  10. #8

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny

    Rzeczywiście, 1 rozwiązany błąd tworzył 3 nastepne... postanowiłem posłużyć się klasą która reprezentuje karty. Znalazłem nawet coś takiego w sieci

    Kod :
    internal class Card
        {
            public static char[] Colors = new char[4]
            {
                    /* trefl */
                    '\u2663',
                    /* karo */
                    '\u2665',
                    /* kier */
                    '\u2666',
                    /* pik */
                    '\u2660'
            };
    
            public static char[] Figures = new char[13]
            {
                'A', 'K', 'D', 'W', 'X', '9', '8', '7', '6', '5', '4', '3', '2'
            };
    
            public char Color { get; private set; }
    
            public char Figure { get; private set; }
    
            public Card(char color, char figure)
            {
                Color = color;
                Figure = figure;
            }
    
            public override string ToString()
            {
                return string.Format("{0}{1}", Color, Figure);
            }
    
        }
    Kod :
     Random random = new Random();
                List<Card> deck = new List<Card>();
                foreach (char figure in Card.Figures)
                {
                    foreach (char color in Card.Colors)
                    {
                        deck.Add(new Card(color, figure));
                    }
                }
    
                List<Card> shuffleDeck = new List<Card>();
                while (deck.Count > 0)
                {
                    int i = random.Next(deck.Count);
                    shuffleDeck.Add(deck[i]);
                    deck.RemoveAt(i);
                }
    Pytanie tylko - jak to wyświetlić w jakikolwiek sposób korzystając z form? Gdy zrobie listbox1.items.add(deck); (albo shuffledeck, bez roznicy) to dostaje po prostu w listboxie napis (kolekcja)...

  11. #9
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    34
    Posty
    11,076
    Siła reputacji
    25

    Domyślny

    Nie używałem cs wieki ale zobacz jak reprezentuje elementy listbox i dodaj do tej kolekcji odpowoednie elementy?
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  12. Reklama
  13. #10
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    32
    Posty
    1,710
    Siła reputacji
    14

    Domyślny

    Cytuj hefalump napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Pytanie tylko - jak to wyświetlić w jakikolwiek sposób korzystając z form? Gdy zrobie listbox1.items.add(deck); (albo shuffledeck, bez roznicy) to dostaje po prostu w listboxie napis (kolekcja)..
    .AddRange spróbuj jeżeli dodajesz kolekcję do kolekcji

    irc: freenode.net in #torgdevs

  14. #11

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny

    Udało mi się z tym uporać, mam teraz główną kolekcję i 2 mniejsze do których wkładam karty, problem mam z napisaniem metody która obliczy obecny wynik...
    Kod :
     public int Wynik(Karta karta, int score)
            {
                if(Karta.Figury.Equals("As"))
                    score +=11;
    
                if (Karta.Figury.Equals("Krol") || Karta.Figury.Equals("Dama") || Karta.Figury.Equals("Walet"))
                    score += 10;
    
                return score;
            }
    Próbuje coś takiego, ale wtedy jedyny sposób żeby to użyć to

    Kod :
    taliaGracz[0].Wynik(taliaGracz[0], scoreGracz);
    czyli masło maślane i oczywiście nic się z wynikiem nie dzieje... nie bardzo wiem jak to inaczej napisać? Próbowałem też zrobić dodatkowy atrybut klasy Karta, jednak zrobienie metody wydaje mi się lepszym pomysłem.

  15. #12
    Avatar Komar_rk
    Data rejestracji
    2015
    Położenie
    Korea północna
    Wiek
    33
    Posty
    43
    Siła reputacji
    0

    Domyślny

    Kod :
     public void Wynik(ref  int score)
            {
                if(this.Figury.Equals("As"))
                    score +=11;
    
                if (this.Figury.Equals("Krol") || this.Figury.Equals("Dama") || this.Figury.Equals("Walet"))
                    score += 10;
    
             
            }
    Nie wnikałem w głupoty które piszesz ale czemu nie tak?
    @hefalump ;
    Ostatnio zmieniony przez Komar_rk : 05-04-2015, 18:09

  16. Reklama
  17. #13
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    32
    Posty
    1,710
    Siła reputacji
    14

    Domyślny

    Cytuj Komar_rk napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Kod :
     public void Wynik(ref  int score)
            {
                if(this.Figury.Equals("As"))
                    score +=11;
    
                if (this.Figury.Equals("Krol") || this.Figury.Equals("Dama") || this.Figury.Equals("Walet"))
                    score += 10;
    
             
            }
    Nie wnikałem w głupoty które piszesz ale czemu nie tak?
    @hefalump ;
    jakie to jest fascynujące jak osoby nie potrafiące programować potrafią skomplikować sobie prosty kod ;D

    irc: freenode.net in #torgdevs

  18. #14

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny

    No cóż, w końcu udało mi się skończyć mój jakże ambitny projekt ;D


    Jednak czego się przede wszystkim nauczyłem to to, że muszę wrócić do podstaw i nie olewać wmawiając sobie że to przecież jest łatwe... większość błędów które napotkałem były przecież tak oczywiste jak zobaczyłem rozwiązanie...

    Zamówiłem sobie Rusz Głową C#, przeczytam te 900 stron i dopiero się będę brał za projekty tego typu.

  19. #15
    Avatar Komar_rk
    Data rejestracji
    2015
    Położenie
    Korea północna
    Wiek
    33
    Posty
    43
    Siła reputacji
    0

    Domyślny

    Cytuj hefalump napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    No cóż, w końcu udało mi się skończyć mój jakże ambitny projekt ;D


    Jednak czego się przede wszystkim nauczyłem to to, że muszę wrócić do podstaw i nie olewać wmawiając sobie że to przecież jest łatwe... większość błędów które napotkałem były przecież tak oczywiste jak zobaczyłem rozwiązanie...

    Zamówiłem sobie Rusz Głową C#, przeczytam te 900 stron i dopiero się będę brał za projekty tego typu.
    jest taka metoda nauki programowania jak just in time w sensie jak Ci czegoś cza to szukasz google/inne i bazując na tym co znajdziesz robisz uczenie się na zapas gówno da w sumie bo większości zapomnisz może tak spróbuj

  20. Reklama
Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •