PEXESO   zodpovězená otázka

VB.NET, Grafika

V programovaní len začínam ale podarilo sa mi úspešne naprogramovať databázovú aplikáciu, tak som sa rozhodol, že si naprogramujem pexeso. Ani vo sne ma nenapadlo, že je to ešte zložitejšie ako programovanie databázy. Pexeso má 36 obrázkov. Naprogramovať aby obrázky boli vždy inak rozložené nebol problém. Problém je, že neviem ako spraviť aby program pri odkrýtí dvoch rovnakých obrázkov to rozoznal a potom spravil niejakú akciu napríklad ich odobere. V opačnom prípade, že obrázky nebudú rovnaké, tak ich zavrie. Hľadal som aj na nete niejaké tipy ale nič som nenašiel. Buď v iných štátoch nepoznajú pexeso alebo sa to inak volá -:). Nevedel by ma niekto naviesť na cestu ako to spraviť ?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Erm ... neslo by si v nejakem poli pamatovat, kde je jaky obrazek, a pak to jednoduse porovnavat?

Jinak nechci vas odradit, ale databazove systemy jsou vetsinou docela jednoduche, je to spis pruda a neudelani si bordelu v datech nez nejake slozite algoritmy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na programování databázových systémů nejsou potřeba nějaké extra znalosti, stačí se naučit pár postupů. Na Pexeso je ale již potřeba umět přemýšle, doporučuji tedy tutoriál pro začátečníky na tomto serveru, pak byste měl být schopen pexeso napsat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak sa skúsím ešte potrápiť. Snaď na niečo prídem. Riešenie s polom som mal na mysli aj ja ale nevedel som to zatial dotiahnuť do uspešného konca.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ahoj,nevím zda jste na to přišel ale napadlo mne (sem začátečník takže o správnosti řešení se dá polemizovat) zda by nebylo dobře načíst každý obrázek dvakrát a po kliknutí na obrázek se zkontroluje podmínka zda je otočen již druhý,pokud ne nic se nestane pokud ano zkontroluju zda se názvy obrázku shodují a pokud ano smaží se,pokud ne otočí se...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No já jsem také začátečník, ale tak rychlý postup v hlavě:

Každý obrázek bych si zastoupil určitým číslem. Poté bych nastavil nějakou proměnnou, která by čítala otočení 2 obrázků. Když se otočí oba obrázky a jejich číslo se rovná provredu akci zamknutí obrázků a vynulování čítače otočení (možno znovu otočit dva obrázky). Pokud se nerovnají, oba obrázky otočím a vynuluji čítač.

No teď mě napadlo, že zastoupení čísel obrázkama bude hodně rozvleklá část.

(Je to jen nápad :) - Pokud nevyhovuje, tak ho neberte v potaz)

S pozdravem Bouda

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nedalo mi to a zasedl jsem k VB,bohužel pro nedostatek času jsem musel uvaqžovat zkresleně pouze nad 2 kartama,pro vaše využití by bylo nejspíš vhodné a dle mého názoru potřebné,po přidělění obrázku kartám tyto udaje zapsat,třeba do proměnných.

Napsal bych vlastní třídu která po kliknutí na kartu zkontroluje jestli jsou otočeny již nějaké obrazky.pokud ano otočí vše zpět na rub,pokud je otočen jeden pak porovnám tyto 2 proměnné a pokud se rovnají tak tyto karty smažu.Pokud nebyla ještě otočena žádná karta není co porovnávat takže se nic nestane...

 Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        Dim karta As Boolean
        Dim karta2 As Boolean
        If otoceni = 2 Then
            MsgBox("jsou otočeny 2 karty")
        End If
        If otoceni = 0 Then
            otoceni = otoceni + 1
        Else

        End If
        If otoceni = 1 Then
        ElseIf karta = karta2 Then
            MsgBox("karty se shodují")
        Else
            MsgBox("karty se neshodují")
        End If
        otoceni = otoceni + 1
    End Sub

Snad je to dobře nemám to ozkoušené,ovšem pro funkci je nutné do deklarací nahoru nad Form1_load dopsat proměnnou dim otoceni as integer.Celé je to jen pokus a v jeho funkčnost ani nedoufámje to pouze příklad jak si myslim že by se to dalo udělat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není mi zcela jasný záměr Vašeho kódu.

Už jenom proto, že v metodě definujete 2 lokální proměnné karta a karta2, jejichž hodnotu nikde nenastavujete a používáte je potom v rozhodovacím cyklu.

Problém je hlavně v tom, že tyto proměnné nejsou mimo metodu viditělné a dokonce při několikerém volání téže metody (několikerém kliknutí na obrázek) se nadefinují vždy nové, tedy bez jakékoliv vazby na stejně pojmenované proměnné z předešlého kliknutí.

Dále jste asi nepředpokládal funkčnost takovou, kdy, pokud při kliknutí na obrázek s počítadlem otočených karet=0, toto počítadlo v druhém IFu zvýšíte na 1, jenomže už s touto novou hodnotou se zúčaswtní hned následujícího rozhodovacího IFu, kde opět vyhoví (protože již má hodnotu = 1). No a ke všemu před opuštěním metody se opět hodnota počítadla zvýší o 1.

Jinak řečeno, jedním kliknutím na obrázek projdete všechny hodnoty počítadla.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

dobry den chtel bych se vas zeptat jestli by ste mi nenapsal algoritmus pexesa mam to za domaci ukol a ucim algoritmy teprve asi 4 mesice a moc je nechapu a mam za ukol napsat algoritmus pexesa tak bych vas chtel poprosit jestli by jste mi to nenapsal predem dekuji.

muj email je [email protected]

dekuji za pomoc.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Přečtěte si pořádně pravidla tohoto fóra. Domácí úkoly Vám tu nikdo dělat nebude. Musíte se snažit a když příjdete s konkrétním problémem tak Vám tu někdo určitě poradí.

Navíc na pexeso se nepotřebujete biflovat teorii, při troše snahy a zapojení mozku se dá na algoritmus pexesa přijít selským rozumem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Peter, jak řešíš to "zobrazování" jednotlivých karet na různých místech? Ptám se proto, že tuto fázi považuji za poměrně složitější, než to samotné vyhodnocování, se kterým si nevíš rady.

Schválně jsem si zkusil takové jednoduché pexeso vytvořit a přesto, že jsem také začátečník, netrvalo to víc, než možná 1 či 2 hodiny.

Těch cest je, samozřejmě, mnoho, ani nejsem přesvědčen, že já bych zvolil tu nejoptimálnější, ale ta, kterou jsem zvolil, mi připadá celkem jednoduchá a navíc docela funkční.

Takže jedna z cest:

- nejprve doporučuji připravit si kolekci obrázků (já si je

nasázel do pictureListu, na pozici 0 obrázek pozadí,

na pozice 1 - 32 pak jednotlivé obrázky na karty (pro klasické pexeso 8x8)

- pak jsem si programově vytvořil na formu 8x8 pictureboxů,

každému jsem přiřadil obrázek pozadí (z pictureListu(0))

v tomto bodě je zapotřebí vytvořit pro každý picturebox

eventhandler ukazující na společnou metodu, která bude ošetřovat kliknutí na obrázku

- pak jsem každému pictureboxu do vlastnosti .tag náhodně

přiřadil číslo od 1 do 32 tak, aby se každé z nich na formu opakovalo právě 2x

- dále jsem si nadefinoval jako globální proměnné pole 2 pomocných pictureboxů a čítač otočených karet

- no a pak už je to všechno jen na té metodě, ošetřující kliknutí na obrázku ( a kupodivu taky není nikterak složitá):

- nejprve si uložím do svého pomocného pictureboxu s indexem rovným čítači kliknutí (na začátku 0) odesílatele události kliknutí

- do tohoto odesílatele (jinak picture box, na který bylo kliknuto) zobrazím obrázek

z pictureListu s pořadovým číslem rovným hodnotě vlastnosti .tag daného pictureboxu

- zvýším čítač otočených karet

- pokud je čítač <2, ukončím metodu a čekám na kliknutí na další obrázek

- pokud je čítač=2, pak provedu vyhodnocení

- no a vyhodnocení je jednoduché - porovnám hodnoty .tag obou pomocných pictureboxů (po kliknutí na druhý obrázek už mám tyto

pictureboxy nastaveny oba dva), pokud se shodují, jedná se o "zásah" a provedu potřebné úkony, pokud jsou rozdílné, opět obě karty otočím (nastavím obrázek pozadí)

- jako poslední v obou případech nastavím opět čítač otočených karet na 0.

Omlouvám se - je to trochu delší, ale snad z toho bude patrný jeden z možných postupů, jak se dopídit výsledku. Pokud není z popisu moc jasné, co jsem tím myslel, klidně se ozvěte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Takže mám na formulár a na ňom je 36X picturebox. Obrázkov mám 36 pomenovaných od 1.jpg-36.jpg t.j. je tam 18 dvojíc. A kód vyzerá takto

Dim List(35) As Integer
 Randomize()
        For i As Integer = 0 To 35
10:         Dim value As Integer = CInt(Int((36 * Rnd()) + 1))
            For b As Integer = 0 To 35
                If value = List(b) Then
                    GoTo 10
                End If
            Next
            List(i) = value
        Next

Naplním pole a pri kliknutí na obrázok kód vyzerá takto:

PictureBox1.Image = Image.FromFile("Pictures\" & List(0) & ".jpg")

Viem, že poviete, že to spravené strašne amatérsky ale funguje to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Netvrdím že to nemůže fungovat, jenom bych se ještě zeptal k té druhé části:

PictureBox1.Image = Image.FromFile("Pictures\" & List(0) & ".jpg")

jednak to znamená, že stále, při každém kliknutí na obrázek, čtete z disku, což není nejoptimálnější (jedná se o velice pomalou operaci).

Dále bych se zeptal - to, že to máte psáno natvrdo, tj.

PictureBox1.Image = ...

mám chápat tak, že máte těch 36 pictureboxů na formu natvrdo nasázených a ke každému máte vlastní metodu pro ošetření kliknutí?

Pokud ano, pak je to, samozřejmě, funkční, ale je to, dle mého, zbytečně moc práce a navíc, pokud budete chtít kdykoliv v budoucnu cokoliv změnit (počet obrázků (pokud si dobře vzpomínám, Pexesa za našich mladých let měla velice často 8x8 kartiček), nebo jejich velikost), pak je to tolik práce, že se na to vykašlete).

Totéž bych řekl k vaší metodě na "míchání" kartiček. Ne, že by byla nefunkční a při počtu 36-ti obrázků je dost vysoká pravděpodobnost, že se zamíchání dočkáte v rozumném čase, ale představte si funkčnost - ze začátku to celkem ještě jde, ale u těch posledních čísel, zvláště u toho zcela posledního vlastně budete stále jen dokola "házet kostkou" a čekat, až padne jedno konkrétní číslo.

Další, ne zcela optimální skutečností je, že přestože máte jen 18 různých obrázků, máte na disku 36 samostatných souborů (zbytečné mrhání místem, i když ty soubory nejsou zas až tak velké), ale podstatnější je, že nevíte, které 2 obrázky jsou stejné. Takže buď musíte mít ty dvojice někde uloženy, nebo musí mezi jejich názvy existovat jednoznačný vztah tak, aby je bylo možno jednoduše porovnat.

Pak stačí, když si při do projektu nasadíte čítač kliknutí (nebo možná by stačil příznak, je-li již otočena nějaká karta, a dvě globální proměnné - ve vašem případě stačí typu integer,

a při každém kliknutí s těmito hodnotami pracujete:

- pokud je hodnota příznaku false (ještě nic není otočeno), pak do první proměnné uložíte číslo z List(x), a příznak změníte na True

- pokud je při kliknutí hodnota příznaku True (tzn. již máme nějakou kartu otočenu a v první kontrolní proměnné máme číslo prvního obrázku), pak do druhé proměnné přiřadíte číslo obrázku z List(y) a spustíte test, jestli čísla v obou proměnných představují stejné obrázky - na základě výsledku provedete potřebné operace. No a na závěr ještě nezapomenout příznak nastavit na False a může se přistoupit k dalšímu tahu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Je tak ako si to napísal. Ja viem, že je to všetko spravené amatérsky ale nič inšie ma nenapadlo. Áno mám na formuláry natvrdo 36 pictureboxov.Vzťah medzi obrázkami je taký, že obrázok 1.jpg má svoju dvojicu 36.jpg, 2.jpg má 35.jpg atď. Myslel som na to, že sa dá sledovať napr. súčet čísel. To znamená keď bude súčet 37 tak sú otočené dve rovnaké karty.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže by nemělo nic bránit tomu to otestovat a patřičně vyhodnotit.

A pokud v tom máš takovouto logiku, pak bych dokonce nedělal 2 kontrolní proměnné, ale pouze jednu, kterou bych na začátku vynuloval a pak (při každém kliknutí) do ní přičetl číslo otočeného obrázku (nemusím tak hlídat, jestli jsem kliknul 1x či 2x a jestli tedy mám ukládat do první nebo druhé pomocné proměnné).

No a pak bych teprve provedl ten mnou posledně zmiňovaný test na hodnotu příznaku, a pokud by tento byt True (tzn. že již něco bylo otočeno dříve), tak bych zjistil, jestli mám v té kontrolní proměnné číslo 37 (zásah), nebo jiné.

No a na základě tohoto rozhodnutí bych karty odstranil, nebo nechal otočené (jak máš vymyšleno co s nalezenými dvojicemi), popřípadě bych je zase po nějaké časové prodlevě (ať si je může hráč prohlédnout) skryl (otočil rubem).

No a už zbývá jenom vynulovat tu pomocnou proměnnou a nastavit příznak na false a může se jet na další tah.

To by už mělo být celkem jednoduché.

No a až to doděláš, pro porovnání Ti sem nahodím ten kousek kódu, který jsem včera večer narychlo splácal já - pro posouzení i jiné možné cesty jak k témuž výsledku dospět (neříkám lepší, taky to není žádná perla, ale jiné). Jenom to musím ještě trochu okomentovat, aby se v tom lépe orientovalo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak se mi to podařilo nějak okomentovat, snad tedy funkčnost bude z kódu jasná.

(bohužel toho komentování je tam více, než samotného kódu).

Jinak to neberte jako poučení, že tak se to má dělat, ale spíše jako námět do diskuse, že takto to taky lze řešit (ještě jednou připomínám, že jsem taky začátečník a programátorský embryo).

Samozřejmě tam není spousta věcí jako ošetření některých činností uživatele, spuštění nové hry, ukončení, vyhodnocování atd. - neměl jsem v úmyslu programovat si pexeso (a dokazovat si, jak už mi ta hlava neslouží), jenom jsem zkoušel řešit Vámi nastolený problém a hledal jsem, co je na něm tak komplikovaného.

Ale k tomu kódu:

Public Class Form1

#Region "Deklarace proměnných"
    Private Const rozmerObr As Integer = 100        ' velikost jednoho obrázku (předpoládám čtvercový obrázek)
    Private Const pocetSloupcu As Integer = 8       ' požadovaný počet sloupců a řádků pexesa
    Private Const mezera As Integer = 10            ' mezera mezi obrázky
    Private obrazky As New ImageList                ' ImageList - zásobárna pro naštení obrázků
    Private PocetObrazku As Integer                 ' pomocná proměnná pro počet obrázků (dvojic)
    Private pan As New Panel                        ' panel na který budu umisťovat Pictureboxy (abych si usnadnil jejich procházení a nepletly se mi mezi nimi ostatní Controly)
    Private pic(1) As PictureBox                    ' pole dvou pomocných pictureboxů, které budu vybírat
    Private otoceno As Integer = 0                  ' čítač otočených karet
    Private zpracovani As Boolean = False           ' pomocný přepínač, aby se zamezilo kliknutí na další kartu v průběhu zpracovávání předchozích
    Private nahodne As New Random                   ' generátor náhodných čísel (použitý pro míchání)
#End Region

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' spočítám počet potřebných obrázků (hodnotu potřebuji vícekrát, proto tato pomocná proměnná)
        PocetObrazku = (pocetSloupcu ^ 2) / 2
        ' nastavení velikosti obrázků ukládaných do ImageListu
        obrazky.ImageSize = New Drawing.Size(rozmerObr, rozmerObr)

        ' načtení pozadí
        ' na první pozici imagelistu (index "0") načtu pozadí karet Pexesa
        ' v projektu mám podadresář data a v něm obrázek s tímto pozadím s názvem pozadi.jpg
        obrazky.Images.Add(Image.FromFile("data\pozadi.jpg"))

        ' načtení kolekce obrázků
        ' jelikož jsem líný a nechtělo se mi vymýšlet jména obrázků, udělal jsem si pod výše jmenovaný adresář
        ' "data" další podadresář "kolekce", do něj jsem nalil potřebný počet obrázků ve formátu .jpg
        ' a aniž se starám o jejich názvy, všechny je projdu a načtu do svého ImageListu
        ' Velice jednoduše by se takto daly řešit různé kolekce obrázků (vyberete si odpovídající
        ' adresář). Jediné, co nemám ošetřeno je, že musíte mít v adresáři minimálně tolik obrázků,
        ' kolik jich potřebujete do hry (v mém případě 8x8/2=32 obrázků)
        For Each path As String In IO.Directory.GetFiles("data\kolekce", "*.jpg")
            obrazky.Images.Add(Image.FromFile(path))
        Next

        Randomize()

        ' na plochu si "rozdám karty
        rozdej()

        ' zamíchám obrázky na ploše
        zamichej()

        ' nechtělo se mi hrát s počítadlem, tak si to boduju v titulku formuláře:
        Me.Text = 0
    End Sub

    ' vytvořím na formuláři základní hrací plán - vytvořím vlastní PictureBoxy (rozdám karty)
    Private Sub rozdej()
        ' nejprve nadefinuju panel "pan", který bude kontejnerem pro mé PictureBoxy:
        ' levý horní roh mé hrací plochy na formuláři
        pan.Left = 10
        pan.Top = 25
        ' rozměr panelu (aby se do něj vešlo požadované množství obrázků nastavené velikosti
        pan.Width = rozmerObr * pocetSloupcu + mezera * (pocetSloupcu - 1)
        pan.Height = pan.Width
        pan.BorderStyle = BorderStyle.None
        ' panel "pan" přidám na plochu mého formuláře Form1
        Me.Controls.Add(pan)

        ' nyní do panelu nasázím na požadovaná místa požadované PictureBoxy:
        For i As Integer = 0 To pocetSloupcu - 1                            ' počítadlo řádků
            For j As Integer = 0 To pocetSloupcu - 1                        ' počítadlo sloupců
                Dim img As New PictureBox                                   ' nový PictureBox
                img.Width = rozmerObr                                       ' šířka PictureBoxu
                img.Height = rozmerObr                                      ' výška PictureBoxu
                img.BorderStyle = BorderStyle.FixedSingle                   ' PictureBox obtažen tenkou linkou
                img.SizeMode = PictureBoxSizeMode.StretchImage              ' způsob vykreslování obrázků na PictureBox (zaplní celou plochu)
                AddHandler img.Click, AddressOf kliknul                     ' pro pictureBox nastavím handler pro ošetření události "Click" - bude volána metoda "kliknul"
                img.Left = j * (rozmerObr + mezera)                         ' vypočítám souřadnice levého horního rohu PictureBoxu (vztaženo k mému panelu Pan)
                img.Top = i * (rozmerObr + mezera)
                Me.pan.Controls.Add(img)                                    ' přidám právě nadefinovaný PictureBox do kolekce Controls mého panelu "Pan"
                Application.DoEvents()                                      ' nemusí být, ale kdybych měl "moc" složitých kartiček, tak aby to celé v průběhu rozdávání nezamrzlo
            Next
        Next

    End Sub


    ' provede vlastní zamíchání obrázků na hrací ploše
    ' mohlo by být součástí předchozího, ale předpokládám vícenásobné použití
    ' (třeba před novou hrou)
    ' současně "otočím" všechny karty rubem navrch
    Private Sub zamichej()
        ' pomocné pole s počtem členů rovnajícím se celkovému počtu karet
        Dim michani(PocetObrazku * 2 - 1) As Integer

        ' pomocné pole naplním čísly od 1 do "počtu obrázků" tak, aby každé z čísel bylo v daném poli 2x
        ' (stejně, jako každý obrázek se mezi kartami vyskytuje 2x)
        ' pouze upozornění - plním čísly od 1 do (v mém případě) 32, ale pole "michani" má indexy od 0 do 31
        For i As Integer = 1 To PocetObrazku
            michani((i - 1) * 2) = i
            michani((i - 1) * 2 + 1) = i
        Next

        ' takto naplněné pole seřadím "náhodně", tedy všechny prvky zůstanou, pouze je zpřeházím
        Array.Sort(michani, AddressOf razeni)

        ' vytvořím si pomocný čítač pro procházení polem michani (správně na to existuje nějaký ukazatel, ale nad tím jsem nepřemýšlel)
        Dim citac As Integer = 0

        ' tady využiju skutečnosti, že všechny PictureBoxy mám v panelu "Pan" a kromě jich tam nic nemám
        ' pokud tedy budu postupně procházet celou kolekcí Controls tohoto panelu
        ' pohodlně projdu všemi Pictureboxy
        For Each pctbox As PictureBox In Me.pan.Controls
            pctbox.Image = obrazky.Images(0)                                ' v Pictureboxu zobrazím obrázek z mého ImageListu s indexem "0" (tj. pozadí karty)
            pctbox.Tag = michani(citac)                                     ' do vlastnosti ".tag" každého Pictureboxu přiřadím hodnotu z pomocného pole "michani" s indexem (citac)
            citac += 1                                                      ' zvýším hodnotu čítače, abych pro příští PictureBox přiřadil do .TAGu následující číslo z pole "michani"
        Next
    End Sub

    ' pomocná funkce, která mi zapříčiní, že mi Výše použitá metoda "sort" seřadí pole náhodně
    Private Function razeni(ByVal x As Integer, ByVal y As Integer) As Integer
        If x = y Then
            Return 0
        Else
            Return 2 * CInt(nahodne.Next(0, 2)) - 1
        End If
    End Function


    ' vlastní výkonná metoda, která se spustí ve chvíli, kdy uživatel klikne na libovolný z PictureBoxů
    Private Sub kliknul(ByVal sender As Object, ByVal e As System.EventArgs)
        ' pokud probíhá zpracovávání předchozího kliknutí, vyskočíme z metody
        ' zamezíme tak konfliktům v případě splašeného uživatele
        If zpracovani Then Exit Sub

        ' nastavíme příznak zpracovávání, abychom dále nebyli rušení nedočkavými hráči (viz výše)
        zpracovani = True

        ' v proměnné "sender" máme konkrétní informaci, z kterého "pictureBoxu" volání metody přišlo
        ' jediným problémem je, že tato proměnná je obecného typu "object"
        ' abychom s ní mohli pracovat jako s PictureBoxem, přetypujeme ji právě na PictureBox
        ' a současně si odkaz na ni přiřadíme do naší pomocné proměnné pic na pozici "otoceno"
        ' pokud tedy není vybrána ještě žádná karta, přiřadíme si to do proměnní pic(0),
        ' pokud je již karta vybrána, do pic(1)
        pic(otoceno) = CType(sender, PictureBox)

        ' s právě zaznamenaným PictureBoxem uděláme :
        With pic(otoceno)
            .Enabled = False                            ' znepřístupníme ho, aby na něj nemohl uživatel při příštím pokusu kliknout
            .Image = obrazky.Images(CInt(.Tag))         ' zobrazíme na něm obrázek z našeho ImageListu z pozice, která se rovná číslu uloženému ve vlastnosti .tag našeho PictureBoxu
        End With

        ' zvýšíme čítač otočených karet o 1
        otoceno += 1

        If otoceno > 1 Then vyhodnoceni() ' pokud nám nyní čítač ukazuje číslo větší než 1 znamená to, že již máme otočeny 2 karty a přejdeme na jejich vyhodnocení
        ' vypneme příznak zpracování, čímž umožníme uživateli další výběr
        zpracovani = False
    End Sub

    ' a vlastní metoda vyhodnocení otočených karet
    ' v tuto chvíli máme v proměnné pic(0) odkaz na pictureBox, který byl vybrán jako první
    ' a v pic(1) odkaz na picturebox, který byl vybrán jako druhy
    Private Sub vyhodnoceni()
        ' zkontrolujeme číslo ve vlastnostech .tag obou pictureBoxů
        If pic(0).Tag = pic(1).Tag Then
            ' zásah
            ' čísla se shodují, hráč se strefil - tady provedeme co se nám zlíbí
            ' já nechávám karty na místě, protože u nich zůstává .enabled na false
            ' nehrozí, že by mohl uživatel náš program zblbnout dalším klikáním na ně
            ' je možno, samozřejmě, obě karty schovat (tím, že pro obě nastavíme pic(0).hide=true a totéž pro pic(1)
            ' asi by se v praxi přičetla nějaká hodnota na počítadlo úspěšných zásahů,
            ' mě se nic takového nechtělo dělat, tek si jen počítám body v záhlaví formuláře
            Me.Text = CInt(Me.Text) + 2
        Else
            ' uživatel se nestrefil
            ' před další činností chvíli počkáme, aby uživatel viděl, co to otočil za kartu
            ' přestávku tvořím na několik úseků, aby to uživateli celé nezamrzlo (a mohl třeba posouvat s formulářem)
            For i As Integer = 0 To 100
                Threading.Thread.Sleep(10)
                Application.DoEvents()
            Next
            ' oběma pictureboxům nastavím zpátky původní obrázek pozadí
            ' a současně je zpátky zpřístupním pro další konání
            pic(0).Image = obrazky.Images(0)
            pic(0).Enabled = True
            pic(1).Image = obrazky.Images(0)
            pic(1).Enabled = True
            ' uberu uživateli "trestný bod"
            Me.Text = CInt(Me.Text) - 1
        End If
        ' nakonec vyčistím své dva pomocné pictureboxy ...
        pic(0) = Nothing
        pic(1) = Nothing
        ' ... a nastavím počet otočených karet na 0
        otoceno = 0
    End Sub
End Class

Je toho, bohužel, "o pár deka víc", ale snad vám alespoň něco z toho přijde podnětné. A nebojte se napsat, co mám blbě, co by bylo lepší udělat jinak - taky se učím a každá rada je přínosná

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Paráda. Dík za radu a za tipy. Teraz mi to už pôjde lepšie.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

cau...tento zdrojak si psal ve Visual Basic net?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jo - VS2005

nahlásit spamnahlásit spam 0 odpovědětodpovědět

a jde to predelat do VB 2005? pac nektere casti mi muj VB vubec nerozezna

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A konkrétně které části? Je to řešeno ve Visual Basic.net, který je součástí MS Visual Studia 2005 (teda dle mého jediný zásadní rozdíl - v Express Edition jsou jednotlivé jazyky samostatné, v Profi edition jsou distribuovány zabalené v rámci jednoho celku (visual studia) - ale z hlediska funkčnosti by měly být více méně stejné.

Napište jak jste to zkoušel a co vám to vyhodilo za chybu.

Jediné, co by tam dle mého mohlo být - jak popisuju v textu, máte v rámci projektu vytvořenu složku data, v ní obrázek s názvem pozadi.jpg a dále v té složce data další podsložku s názvem kolekce a v ní dostatečný počet obrázků?

Ještě k těm obrázkům - velikost je libovolná (program si to natáhne dle potřeby), ale musí být formátu ".jpg" a taky u všech musíte ve vlastnostech nastavit "copy to output directory" na if newer nebo allways)

Ale ještě jednou připomínám, to co jsem dal do předchozího příspěvku rozhodně nebylo myšleno jako kompletní program, pouze jako námět k diskusi (i když to herně funguje).

Když tak popiště přesněji, jaký problém s kódem máte.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mám Visual Basic .NET 2005 Express Edition, kód jsem vyzkoušel pouze se změnou cest k obrázkům a funguje bez jediné chyby! Díky podrobnému komentáři jde o dokonalý příklad. V objemné diskuzi bohužel zapadne, hodil by se do kapitoly Hry.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

mno nebere to treba:

  Private otoceno As Integer = 0               
  Private zpracovani As Boolean = False           
  
  obrazky.ImageSize = New Drawing.Size (rozmerObr, rozmerObr)
  Randomize()
  rozdej()
  zamichej()

a dalsi prikazy, treba nektere cykli to nebere

For i As Integer = 0 To pocetSloupcu - 1 

pri oprave

dim i as integer
For i  = 0 To pocetSloupcu - 1 

je cyklus v pohode ale vyse uvedene casti kodu nevim jak predelat

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A mohl byste napsat, jakou chybu Vám to hází třeba u těch deklarací?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

mno visual to proste nebere .... oznaci to jako cerveny text ve kterem je chyba

nahlásit spamnahlásit spam 0 odpovědětodpovědět

no ale kryž na to červené podtržení najedete myší, zobrazí se Vám chybová hláška,

nebo druhou možností je podívat se do Error listu (normálně okno ve spodní části VS, pokud ho nenaleznete, tak si ho zapněte přes menu: View - Error list. Tam je ta chyba taky popsána.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A ještě jeden dotaz, máte vůbec Visual Basic.NET 2005?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na Visual Basic to vypadá, ale ne .NET 2005

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No to jsem pral uz nahore ze mam obycejne VB a ne VBnet :). Zdali to jde nejak predelat do obycejneho VB

nahlásit spamnahlásit spam 0 odpovědětodpovědět

"...ze mam obycejne VB a ne VBnet", to jste nenapsal:

cau...tento zdrojak si psal ve Visual Basic net? Jo - VS2005

a jde to predelat do VB 2005? pac nektere casti mi muj VB vubec nerozezna

mno visual to proste nebere .... oznaci to jako cerveny text ve kterem je chyba

Proč by to nešlo předělat? Vše co "váš visual nebere" nahradíte tím, co bere.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se, netušil jsem, že VB ("nedotnetový") existuje taky ve verzi 2005. Proto mi to hned nedošlo.

Předělat by to mělo jít, protože ve svém kódu nepoužívám nic náročného či nadstandardního, ale bohužel v tom Vám již neporadím - neb tuto verzi VB nemám a tudíž neznám jeho syntaxi

Ale dle Vašeho popisu Váš VB nepodporuje asi současnou deklaraci a iniciaci proměnných, pročež všude, kde tuto technologii využívám rozdělte deklaraci a pak někde v kódu (nevím, máte-li tam něco jako u nás Form1_load) proveďte vlastní nastavení hodnoty (např.

Private zpracovani as boolean


' Pak na začátku nějaké metody
Zpracovani = False

) - ale to skutečně hádám.

Dále asi budete muset využít jiné funkce na generování náhodných čísel.

U těch chybných řádků rozdej() a zamíchej(), jelikož se jedná o vlastní metody dále v kódu definované, tam mne napadá pouze vyzkoušet nějaké klíčové slovo pro volání podprogramů (někdy se používá

call rozdej()

.

Více Vám, bohužel, neporadím.

Druhou možnou cestou je vzít ten můj příklad tak, jak byl původně myšlen, tedy jako ideový námět jak se to dá řešit (myslím, že z té hromady komentářů by to mohlo být patrné i při neznalosti některé z konkrétních funkcí), a naprogramovat si to dle této kuchařky sám již za pomocí pro Vás akceptovatelné syntaxe.

No a třetí možností je, nemáte-li nějaký zvlášť silný důvod setrvávat u "starší verze" jazyka, nainstalovat si (legálně a zdarma) ze stránek Microsoftu Visual Basic.NET z VS studia 2005 nebo 2008 - evidentně toho umí mnohem více, než jeho předchůdci a také dnes již pro tento systém ani na NETu získáte lepší podporu.

Pokud ale na jazyku z "přednetovské" éry trváte (jistě k tomu můžete mít fůru různých důvodů), pak Vám mohu poradit jedinou věc - zkuste to přeprogramovat sám (jak jsem psal výše) a pokud narazíte na nějaký konkrétní problém, se kterým sám nehnete, zkuste hodit dotaz do vlákna zaobírajícího se VB 6 a ostatními "nedotnety" - budete-li mít štěstí, pomoci se dočkáte.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vycházím z toho, že když se napíše "VB 2005", tak je to pouze zkrácené "Visual Basic .NET 2005 Express Edition" a že vývoj VB 6 ("obyčejný", "ne netový") skončil v minulém století. A přiznám se, že mě namíchlo, když "82.100.10.206" nikoliv pravdivě sdělil, že již psal nahoře, že má obyčejné "VB a ne VBnet :)" a tak moje "vše co váš visual nebere nahradíte tím, co bere" byla jedovatá ironie, ze zlosti nad marným hledáním chyby. Omlouvám se.

Myslím, že reálné jsou jen ty další alternativy, které jste napsal. Jde v podstatě o dva rozdílné jazyky s jen podobným pojmenováním.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Jenom bych podotknul, ze nejde o dva rozdilne jazyky, ale o starsi a novejsi vyvojovou verzi jazyka BASIC tak jako tak je to porad BASIC

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jistě máte pravdu pokud k problému přistupujete z lingvistického hlediska.

Ano, Basic (slovo skládající se z 5-ti písmen) je a vždy bude totožné se slovem Basic i po 100 letech, jistě je také pravdou, že v jisté míře na sebe tyto jazyky stále navazují - minimálně v myšlence co nejvíce zjednodušit a usnadnit práci programátora, byť i za cenu občasných drobných ústupků.

Přesto však má pravdu i pan Renner pokud tvrdí, že se jedná o dva zcela rozdílné jazyky - v kontextu probíhající debaty on hodnotí především konkrétní sémantiku a syntaxi jazyka a jeho možnosti. A v tomto ohledu si dovolím tvrdit, že VB.NET je v současné verzi mnohem blíže třeba C#.NET, než Qbasicu, nebo třeba i VB 6.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jenom bych podotknul, ze nejde o dva rozdilne jazyky, ale o starsi a novejsi vyvojovou verzi jazyka BASIC tak jako tak je to porad BASIC

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Cao....nema nekdo cele pexeso ve vb net .... proste mi to nejde rozjet ... asi nekde delam chybu ... nebo to mam cele blbe ... pokud by nekdo mel cele pexeso ve vb net byla bych rada,kdyby se nekdo podelil a poslal na email.... diky moooc

[email protected]

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Co to znamená "celé pexeso ve VB net"? To si chcete zahrát, pak ale nechápu, proč to musí být ve VB NET - stačí, když navštívíte libovolný z hracích serverů a tam určitě různých pexes naleznete nepočítaně.

Nebo se chcete naučit programovat? Pak ovšem nechápu, nestačí-li Vám ten kód uvedený výše. Na rozdíl od zvyklostí, kdy tady v diskusi řešíme se zájemci konkrétní programovací problémy (ne programy) jsem z důvodu, že dotaz, který jsme nejprve po teoretické stránce s tazatelem rozebrali směřoval tak trochu do filosofie celkové koncepce přístupu k programování takovéhoto problému. No a usoudil jsem, že nejnázornější a nejlépe sdělné bude, když takový kousek ukázkového kódu sestavím a dám jej k dispozici jako námět k zamyšlení a jako podklad pro další diskusi. No a ač to nebylo přímo úmyslem, ten kousek kódu je zcela dobře hratelný i bez jakékoliv další úpravy, i když plnohodnotné pexeso by si dotažení bodování a lepší komunikace s uživatelem jistě zasloužilo.

Proto zkuste využít tohoto kódu (nemusíte jej zcela obšlahnout, můžete jej použít třeba jako ideový vzorek) a pokud Vám v něm něco konkrétního nebude jesné nebo nebude Vám něco fungovat, pak se s konkrétním dotazem obraťte do diskuse.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tohle je uzasny .... :) diky ... ani nevis, jak jsi mi pomohl :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Koukám, že v těch verzích VB tady někteří mají trochu zmatek. Vzhledem k tomu, že tyto najasnosti jsou poměrně časté, napsal jsem o verzích VB článek. Nedotnetová verze 2005 jazyka Visual Basic neexistuje.

http://www.vbnet.cz/blog-clanek--86-jak_...

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

cau nemohol by si mi poslat zdrojak tej databazovej aplikacie, rad by som sa naucil robit taketo aplikacie ale neviem najst ziaden nejaky navod, [email protected], dikes

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Zkus to pres buttony a nastav jim content :-) A ten content potom kontroluj ;-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback