Video Poker senza tante pretese

Stato
Chiusa ad ulteriori risposte.
C

calibro22

Guest
Ciao a tutti ,
mi son divertito a convertire da Javascript a VBA questo mio game fatto qualche anno fa.
Per chi volesse spulciare il codice (scritto un po' così...) la password è "forzadoria".
 

Allegati

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
22.845
1.865
Como
2011MAC 2016WIN
519
Grazie della condivisione.
 

rollis13

Utente assiduo
15 Novembre 2015
1.609
65
Cordenons
Office 2016 x64
83
@calibro22, simpatico lavoro, hai già previsto l'implementazione del controllo della Tessera Sanitaria per allineati alla probabile nuova legge Muio2.
 
C

calibro22

Guest
Grazie Rollis13. Potevo farlo un po' meglio per esempio richiamando le carte con quel sitema che GerardoSaluto_saluto ci ha insegnato con la sua lezione
EM16 Inserire Immagini Dinamiche con le formule di Excel
invece ho deciso di cancellare le immagini e ricrearl con gli stessi nomi.
Inoltre le immagini non sono ad alta risoluzione.
Stavo pensando adesso ad un Black Jack, però per far le cose decentemente dovrei prevedere anche la giocata del banco e qua mi sa che la cosa si fa interessante.

Non credo di aver capito la battuta sulla tessera sanitaria. C'è qualche notizia fresca fresca di TG che mi son perso ?
 

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
4.023
65
office pro 2010
58
non so giocare ai videopoker quindi non so dire la mia sulla meccanica di gioco comunque:

quanto riguarda il rimescolamento di un mazzo di carte, forse, diventa più comprensibile una cosa del genere:

Codice:
Public Function MescolaMazzo(Mazzo As Collection) As Collection
    Dim Clone As New Collection
    Dim Uscita As New Collection
    Dim i As Long
    
    For i = 1 To Mazzo.Count
        Clone.Add Mazzo(i)
    Next
    Do Until Clone.Count = 0
        i = Int(Rnd() * (Clone.Count - 1 + 1)) + 1
        Uscita.Add Clone(i)
        Clone.Remove (i)
    Loop
    
    Set MescolaMazzo = Uscita
End Function
oppure:

Codice:
Option Explicit

Sub prova()
    Dim a As New Collection
    Dim b As Collection
    Dim i As Long
    Dim col As Long
    
    For i = 1 To 52
        a.Add i, CStr(i)
    Next
    
    For col = 1 To 10
        Mescolamazzo_2 a
        For i = 1 To 52
            With Foglio3
                .Cells(.Rows.Count, col).End(xlUp).Offset(1, 0).value = a(i)
            End With
        Next
    Next
End Sub

Public Sub Mescolamazzo_2(Mazzo As Collection)
    Dim Uscita As New Collection
    Dim i As Long
    
    Do Until Mazzo.Count = 0
        DoEvents
        i = Int(Rnd() * (Mazzo.Count - 1 + 1)) + 1
        Uscita.Add Mazzo(i)
        Mazzo.Remove (i)
    Loop
    Set Mazzo = Uscita
End Sub
...
Ho anche notato la classe card.
Se rendi pubbliche le variabili che utilizzi all' interno della classe, non serve che tenti di limitarle dietro ad una property.

L' ambito di una procedura, di una variabile, di un processo in generale, deve sempre essere il più ristretto possibile.

quanto riguarda la calsse implementata, se dichiari pubbliche le variabili:

Codice:
Public dnum As Byte
Public dseme As String
Public dfname As String
allora non senso e non serve implementare le property:
Codice:
Public Property Get num() As Byte
    num = dnum
End Property

Public Property Let num(dnumv As Byte)
    dnum = dnumv
End Property

Public Property Get seme() As String
    seme = dseme
End Property

Public Property Let seme(dsemev As String)
    dseme = dsemev
End Property
infatti, noterai dall' intellisense, che sia le variabili che utilizzi nelle property che le property stesse, sono membri dell' oggetto che vai ad istanziare. Di fatto l' incapsulamento non c'è.


una carta ha certamente delle proprietà di sola lettura come il seme ed il numero che ha impressosopra di essa. (non puoi cambiarlo) Però puo cambiare, per esempio, la posizione della carta nel mazzo. ecco che le routine property vengono in aiuto per poter gestire le proprietà di modo che esse possno esse di sola lettura, sola scrittura....


Codice:
Private pNumero As Byte
Private pSeme As String
Private pPosizioneMazzo As Long
Public Giocatore As String

Public Property Get numero() As Byte
        numero = pNumero
End Property

Public Property Get seme() As String
        seme = dseme
End Property

Public Property Let PosizioneMazzo(ByVal vNewValue As Variant)
    pPosizioneMazzo = vNewValue
    '
    'fai qualcosa con questo dato che non sarà accessibile all' esterno della classe in cui è implementato
End Property

Sub Nuova_Carta(Numero_Della_Carta As Byte, Seme_Della_Carta As String)
    pNumero = Numero_Della_Carta
    pSeme = Seme_Della_Carta
End Sub

quanto riguarda l' utilizzo di public nei moduli standard, oltre a rendere visibili le variabili anche all' esterno, essere rimarranno valorizzate fino a che non chiuderai Excel, quindi, direi che non è al cosa più igenica, a meno che non sia voluto per qualche motivo.

Infine, c'è il solito:

Codice:
Set shp = Nothing
non c'è bisogno di settare a nothing un oggetto prima di uscire da una subroutine perché all' uscita di una subroutine gli oggetti vengono settati a nothing automaticamente.
 

rollis13

Utente assiduo
15 Novembre 2015
1.609
65
Cordenons
Office 2016 x64
83
[…]Non credo di aver capito la battuta sulla tessera sanitaria. C'è qualche notizia fresca fresca di TG che mi son perso ?
In ogni caso era solo una battuta collegata al testo del Decreto Dignità al voto in questi giorni ed in particolare al Capo III - ARTICOLO 9-ter. (Misure a tutela dei minori) dove si fa cenno all'uso della Tessera Sanitaria; segnalo un link per eventuali approfondimenti.
 
C

calibro22

Guest
@rollis
Non guardo tanto i TG (anche perché sono un po' eremita) e di questo decreto dignità non ne sapevo niente. Adesso ho capito il nesso SmileForum

@dracoscrigno.
tutte le tue considerazioni sono validissime.
ho tradotto in un paio d'ore il vecchio codice javascript che avevo usato per una piccola extension di Chrome mai pubblicata.

per il sistema di mescolamento hai perfettamente ragione.
Al tempo che avevo implementato il codice avevo deciso di mescolare le carte con questo bizzarro sistema di permutare due carte alla volta e l'ho fedelmente riprodotto anche in VB.

Per il discorso delle classi, il mio è stato un timido tentativo di tradurre una classe javascript in una classe VB.
Come avrai capito non ho molta confidenza con le classi VB.
Conosco la loro importanza per implementare codice scalabile e riutilizzabile (ereditarietà, incapsulamento, polimorfismo), quindi devo trovare il tempo per approfondirle un po' come si deve.

Per il discorso del settggio a Nothing, cosa vuoi che ti dica... è una abitudine che credo di non avere solo io.
Forse non serve più e alcuni dicono che non è mai servito,
Sappiamo però entrambi che Excel e il suo IDE non finiscono mai di stupirci con le stranezze più disparate
Io credo di aver risolto con questo Set = Nothing qualche problema di OverFlow e\o crash del programma, ma forse in quei casi sono state solo coincidenze.

Per chi vuole confrontare e\o installare l'extension di Chrome dello stesso programma (leggermente più semplice e senza score) allego la struttura compressa.
Per installarla bisogna scompattare la cartella e caricarla come estensione non pacchettizzata in modalità sviluppatore.

Mi sono divertito a scaricare il tuo programma del solitario a piramide. Sarò forse una capra, ma ho fatto tipo 20 partite e non sono riuscito a finirne una.
Io l'ho sempre visto con il mazzo da 52 e mi riusciva più semplice. Forse con 40 carte la probabilità di successo è inferiore :occhispalancati:

Ciao
 

Allegati

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
4.023
65
office pro 2010
58
Purtroppo le classi in vba sono un misero accenno di quello che si potrebbe aspettare da un implementazione OOP, comunque, sono abbastanza comode da potersi inventare un sacco di cose comode e carine come i vari calendari che si vedono sul forum o come il mio mal riuscito gioco con le carte che, per queanto mi riguarda, non mi è mai riuscito nemmeno giocandoci con le carte vere.

quel gioco fu, più che altro, un modo per giocare con le classi ed ora, con il senno di poi, ci sarebbero un bel pò di cose da correggergli per farmelo definire un esercizio svolto in modo sufficentemente corretto. all' epoca ho "barato" sull' incapsulamento per riuscire a fare in modo che certe proprietà fossero gestite anche altrove. però ogni tanto lo vado a ripescare perchè, comunque, anche leggere come NON bisogna fare, mi aiuta a ricordarmi come DEVO fare :Confuso:

per il Nothing, un giorno, magari, mi faccio venire voglia di tirare fuori un papiro dove spiego per filo e per segno dove è utile settare a nothing e dove è inutile. il centro nevralgico, comunque, è tutto nel concetto di ambito di validità.
Non ho letto attentamente tutto ma sono certo che l' overflow non è certo risolto da quel nothing. le variabili oggetto a cui si riferisce sono dichiarate e definite nella stessa routine è passano a nothing non appena il flusso esce da essa.
un overFlow è generalmente scatenato da una reiterata chiamata a qualche procedura...

quanto riguarda il mio esercizio sulle classi, cosa vuoi mai, è pieno zeppo di errori e di escamotage per fare cose che, all' epoca, nonmi venivano poi tanto beneone. infatti l' incapsulamento, proprio in quel listato, l' ho cannato di brutto ma, come stavo dicendo, all' epoca non sapevo proprio come uscirne vivo.

se dovessi riscriverlo cambierei molte cose.

quanto riguarda la riuscita del gioco, non credo si acosa semplice. io non sono mai riuscito a vederne la fine nemmeno giocandoci dal vero. in quello proposto non c'è nemmeno il modo di farlo più semplice perché all' epoca non era questo lo scopo principale dell' implementazione ma sarebbe interessante poter impostare il grado di "fortuna" .... vedremo un giorno se ce ne sarà il tempo e la voglia...


l' originale me lo scarico con calma in questi giorni perché leggere un pò di javascript non può farmi che bene...
 
C

calibro22

Guest
Ciao a tutti,
ho implementato una nuova feature al mio pokerino.
Ho aggiunto una "Hall Of Fame"
In pratica adesso quando il gioco finisce per uno di questi motivi:
  1. non ho più score (game over)
  2. inizio una nuova partita (quando ce n'è già una in corso)
  3. chiudo il file (perché non ne posso più SmileForum)
se ho superato il mio punteggio "Your Best Score Ever", avrò la possibiltà di registrare il mio nome e il mio punteggio in una lista-ranking di10 posizioni.

Il bello che questa lista è PUBBLICA pertanto possiamo gareggiare tra di noi!!!

All'inizio la lista dei Top 10 è stata riempita con dei nomi di fantasia e dei punteggi molto bassi, quindi all'inizio non sarà molto difficile scrivere il proprio nome.

Che dire, io due prove le avrei anche fatte, ma il vero test, (se volete) dovete farmelo voi e poi farmi sapere riguardo impressioni, consigli, stranezze e\o bachi

Magari il gioco dopo un po' potrà annoiare,
la cosa interessante di questa nuova feature è il modo in cui ho gestito la lettura e scrittura della lista Top-10 senza scrivere alcun webservice.
Lascio a voi scoprire come ho fatto, non è niente di più di un uovo di Colombo.

Il gioco adesso è scaricabile a questo LINK

'Notte
 
C

calibro22

Guest
Ciao, correto baco (dovuto a modifica dell'ultimo secondo senza fare due test) che di fatto non mi faceva aprire la lista del ranking dopo aver pigiato sull'apposito pulsante.
Adesso la userForm si dovrebbe aprire correttamente. Saluto_saluto
 
Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!