Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
2048+ the Game - V 9.10

2048+ the Game

Sommario | Admin | Forum | Bugs | Todo | Files

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ] Precedente | Prossimo
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 10:41
Mercoledì, 27/06/2018
Testo quotato

Postato originariamente da Carlo:

Testo quotato

Postato originariamente da Ultimo:

la tua tecnica funziona bene :k:


sul file da_2048_a_8192.txt, ci sono pochi errori.

Tu Ultimo già lo sai, lo spiego per chi ha poca dimestichezza.

Le tecniche sono due, le chiamo ad L e zigzag, le cambio e le combino in base alle esigenze.
Lo scopo primario è avere sulla riga 4 i numeri sempre progressivi, con il numero più grande a destra (pos 4,4)
come fare?
tecnica L: uso la colonna 1 per impilare i numeri dal più piccolo in alto al più grande in basso.
tecnica zigzag: uso la riga 3 per impilare i numeri, il più piccolo a destra e il più grande a sinistra.

Testo quotato

Postato originariamente da Ultimo:


            Thread.Sleep(1000)


Immagino di caricare il file intero in una matrice e con un cursore scorrere la matrice avanti ed indietro, creando una moviola virtuale che permette di rivedere tutta la registrazione avanti ed indietro alla velocità voluta. :D




Ottime le due tecniche  "L" e "zig zag"

Si potrebbe usare un Dizionario per il replay

Codice sorgente

Dim Sequenza_Mosse as Dictionary(Of integer.Of string())




If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:42
Mercoledì, 27/06/2018
Testo quotato

Postato originariamente da Ultimo:
            Thread.Sleep(1000)



Invece dello sleep, intanto si potrebbe abilitare l'animazione:
Nel file va salvato invr, che contiene la casella da animare.
Codice sorgente - presumibilmente VB.NET

  1. Sub Salva(ByVal cAni As Int32)
  2.         Dim SequenzeInFile As System.IO.StreamWriter ' preparo per la scrittura del file
  3.         SequenzeInFile = My.Computer.FileSystem.OpenTextFileWriter(Application.StartupPath & "\" & TextBox_Nome.Text & ".txt", True) ' apro un file in scrittura append
  4.  
  5.         ' preparo la riga da srivere
  6.         Dim Riga As String = ""
  7.         For r = 1 To 4
  8.             For c = 1 To 4
  9.                 Riga = Riga & Matrice4x4(r, c) & ";"
  10.             Next
  11.         Next
  12.  
  13.         SequenzeInFile.WriteLine(Riga & Now.ToString & ";" & cAni.ToString) ' AGGIUNTO INDICE DELLA CASELLA ANIMATA
  14.         SequenzeInFile.Close() ' chiudo il file
  15.  
  16.     End Sub



cAni va passato dalla routine chiamante su:
Codice sorgente - presumibilmente VB.NET

  1. Public Sub Visualizza_Immagine_Celle2048(ByRef Matr2048 As Int32(,))
  2.  
  3.         'indice della cella nuovo valore random
  4.         Dim invr As Int32
  5.  
  6.         For i As Int32 = 1 To 16
  7.             Dim Tag_Cella As String = ""
  8.             Tag_Cella = Mat4x4Pict_2040(i).Tag
  9.             For r As Int32 = 1 To 4
  10.                 For c As Int32 = 1 To 4
  11.                     Dim index_M As String = r & "-" & c
  12.  
  13.                     If index_M = Tag_Cella Then
  14.                         '** Inserisce le rispettive immagini **
  15.                         If Matr2048(r, c) = 1 Then
  16.                             Mat4x4Pict_2040(i).Image = Nothing
  17.                         Else
  18.                             Mat4x4Pict_2040(i).Image = Me.ImageList1.Images(CInt(Math.Log(Matr2048(r, c), 2)) - 1)
  19.                             If index_M = Indx_Nuovo_Val Then
  20.                                 invr = i
  21.                             End If
  22.                         End If
  23.                         '************************
  24.                     End If
  25.                 Next c
  26.  
  27.             Next r
  28.  
  29.         Next i
  30.  
  31.         '** Inserimento immagine corrispondente **
  32.         If Max_Potenza_Raggiunta > 1 Then
  33.             Me.PictureBox1.BackgroundImage = Me.ImageList1.Images(CInt(Math.Log(Max_Potenza_Raggiunta, 2)) - 1)
  34.         End If
  35.         '************************
  36.  
  37.         'Avvio la procedura di animazione
  38.         If Animazione_On Then Call Animazione_Pbx(Mat4x4Pict_2040(invr))
  39.  
  40.         Me.Refresh()
  41.         'verifichiamo il punteggio
  42.         If Stato_eventi = Stato.Avviato Then
  43.             Call Controlla_Punteggio()
  44.             Salva(invr) ' gestire salvataggio on off, ' AGGIUNTO INDICE DELLA CASELLA ANIMATA
  45.         End If
  46.  
  47.     End Sub


Attenzione, codice non testato.

si può anche richiamare:  Verifica_Ultima_Potenza()

@Ultimo
in fase di [rivedi], non vedo una soluzione "semplice" per passare l'indice salvato della casella animata, il codice è un po' criptico, ci vuole la tua mano. :):)

Codice sorgente - presumibilmente VB.NET

  1. Private Sub ButtRivedi_Click(sender As Object, e As EventArgs) Handles ButtRivedi.Click
  2.         AzzeraToolStripMenuItem_Click(0, e)
  3.         Animazione_On = False ' variabile da gestire
  4.  
  5.         Dim NomePartita As String
  6.         OpenFileDialog1.Title = "Carica la partita salvata"
  7.         OpenFileDialog1.FileName = ""
  8.         OpenFileDialog1.InitialDirectory = Application.StartupPath
  9.         OpenFileDialog1.Filter = "Schema.txt|*.txt"
  10.         OpenFileDialog1.ShowDialog()
  11.         NomePartita = OpenFileDialog1.FileName
  12.         If NomePartita = "" Then Exit Sub
  13.  
  14.         Debug.Print("Leggo dal file """ & NomePartita & """ la scena salvata")
  15.         Dim objReader As New StreamReader(NomePartita)
  16.         ' Leggo fino alla fine del file
  17.         Dim RigaLetta As String
  18.         Do ' gestire sospensione e passo passo
  19.             RigaLetta = objReader.ReadLine()
  20.             If Not RigaLetta Is Nothing Then
  21.                 Dim Sequenza() As String = RigaLetta.Split(";")
  22.                 For i = 0 To 15
  23.                     Dim r As Short = Math.Ceiling(i \ 4)
  24.                     Dim c As Short = i Mod 4
  25.                     Matrice4x4(r + 1, c + 1) = Sequenza(i)
  26.                     Dim cAni As Int32 = Convert.ToInt32(Sequenza(17)) ' indice della casella animata da ripassare a Visualizza_Immagine_Celle2048(), attraverso Indx_Nuovo_Val?
  27.                     Visualizza_Immagine_Celle2048(Matrice4x4)
  28.                     Application.DoEvents() ' se non inserito, l'uso della ram aumenta in modo incontrollato
  29.                     lblInfo.Text = Sequenza(16) ' orario della mossa
  30.                 Next
  31.             End If
  32.         Loop Until RigaLetta Is Nothing
  33.         objReader.Close()
  34.         Stato_eventi = Stato.Avviato
  35.         InMovimento = False
  36.     End Sub


Codice incompleto manca passaggio indice casella animata :noway:

Ultima modifica effettuata da Carlo il 27/06/2018 alle 10:58


in programmazione tutto è permesso
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 11:05
Mercoledì, 27/06/2018
@Carlo

Verifica_Ultima_Potenza() forse è meglio

non inserirlo, per eventuali bug :yup:

Codice sorgente - presumibilmente VB.NET

  1. Public Sub Visualizza_Immagine_Celle2048(ByRef Matr2048 As Int32(,), Opctional invr2 as int32=0)
  2.  
  3.         'indice della cella nuovo valore random
  4.         Dim invr As Int32
  5.  
  6.         For i As Int32 = 1 To 16
  7.             Dim Tag_Cella As String = ""
  8.             Tag_Cella = Mat4x4Pict_2040(i).Tag
  9.             For r As Int32 = 1 To 4
  10.                 For c As Int32 = 1 To 4
  11.                     Dim index_M As String = r & "-" & c
  12.  
  13.                     If index_M = Tag_Cella Then
  14.                         '** Inserisce le rispettive immagini **
  15.                         If Matr2048(r, c) = 1 Then
  16.                             Mat4x4Pict_2040(i).Image = Nothing
  17.                         Else
  18.                             Mat4x4Pict_2040(i).Image = Me.ImageList1.Images(CInt(Math.Log(Matr2048(r, c), 2)) - 1)
  19.                             If index_M = Indx_Nuovo_Val Then
  20.                                 invr = i
  21.                             End If
  22.                             'inserimento invr2 da sequenza_mosse
  23.                              if invr2>0 then invr = invr2
  24.                         End If
  25.                         '************************
  26.                     End If
  27.                 Next c
  28.  
  29.             Next r
  30.  
  31.         Next i
  32.  
  33.         '** Inserimento immagine corrispondente **
  34.         If Max_Potenza_Raggiunta > 1 Then
  35.             Me.PictureBox1.BackgroundImage = Me.ImageList1.Images(CInt(Math.Log(Max_Potenza_Raggiunta, 2)) - 1)
  36.         End If
  37.         '************************
  38.  
  39.         'Avvio la procedura di animazione
  40.         If Animazione_On Then Call Animazione_Pbx(Mat4x4Pict_2040(invr))
  41.  
  42.         Me.Refresh()
  43.         'verifichiamo il punteggio
  44.         If Stato_eventi = Stato.Avviato Then
  45.             Call Controlla_Punteggio()
  46.             Salva(invr) ' gestire salvataggio on off, ' AGGIUNTO INDICE DELLA CASELLA ANIMATA
  47.         End If
  48.  
  49.     End Sub



If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 11:17
Mercoledì, 27/06/2018
@Carlo

Si potrebbe inserire  nella Label "Stato" anche

il punteggio e le mosse della sequenza :k:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 11:32
Mercoledì, 27/06/2018
@ Ultimo

ci sono arrivato, l'indice è in formato stringa riga-colonna, es: 1-1   3-4    2-3
Codice sorgente - presumibilmente VB.NET

  1. Public Sub Visualizza_Immagine_Celle2048(ByRef Matr2048 As Int32(,))
  2.  
  3.         'indice della cella nuovo valore random
  4.         Dim invr As Int32
  5.  
  6.         For i As Int32 = 1 To 16
  7.             Dim Tag_Cella As String = ""
  8.             Tag_Cella = Mat4x4Pict_2040(i).Tag
  9.             For r As Int32 = 1 To 4
  10.                 For c As Int32 = 1 To 4
  11.                     Dim index_M As String = r & "-" & c
  12.  
  13.                     If index_M = Tag_Cella Then
  14.                         '** Inserisce le rispettive immagini **
  15.                         If Matr2048(r, c) = 1 Then
  16.                             Mat4x4Pict_2040(i).Image = Nothing
  17.                         Else
  18.                             Mat4x4Pict_2040(i).Image = Me.ImageList1.Images(CInt(Math.Log(Matr2048(r, c), 2)) - 1)
  19.                             If index_M = Indx_Nuovo_Val Then
  20.                                 invr = i
  21.                             End If
  22.                         End If
  23.                         '************************
  24.                     End If
  25.                 Next c
  26.  
  27.             Next r
  28.  
  29.         Next i
  30.  
  31.         '** Inserimento immagine corrispondente **
  32.         If Max_Potenza_Raggiunta > 1 Then
  33.             Me.PictureBox1.BackgroundImage = Me.ImageList1.Images(CInt(Math.Log(Max_Potenza_Raggiunta, 2)) - 1)
  34.         End If
  35.         '************************
  36.  
  37.         'Avvio la procedura di animazione
  38.         If Animazione_On Then Call Animazione_Pbx(Mat4x4Pict_2040(invr))
  39.  
  40.         Me.Refresh()
  41.         'verifichiamo il punteggio
  42.         If Stato_eventi = Stato.Avviato Then
  43.             Call Controlla_Punteggio()
  44.             Salva(Indx_Nuovo_Val) ' gestire salvataggio on off, aggiunto indice della casella animata
  45.         End If
  46.  
  47.     End Sub



Codice sorgente - presumibilmente VB.NET

  1. Sub Salva(ByVal cAni As String)
  2.         Dim SequenzeInFile As System.IO.StreamWriter ' preparo per la scrittura del file
  3.         SequenzeInFile = My.Computer.FileSystem.OpenTextFileWriter(Application.StartupPath & "\" & TextBox_Nome.Text & ".txt", True) ' apro un file in scrittura append
  4.  
  5.         ' preparo la riga da srivere
  6.         Dim Riga As String = ""
  7.         For r = 1 To 4
  8.             For c = 1 To 4
  9.                 Riga = Riga & Matrice4x4(r, c) & ";"
  10.             Next
  11.         Next
  12.  
  13.         SequenzeInFile.WriteLine(Riga & Now.ToString & ";" & cAni) ' aggiunto indice della casella animata
  14.         SequenzeInFile.Close() ' chiudo il file
  15.  
  16.     End Sub


Codice sorgente - presumibilmente VB.NET

  1. Private Sub ButtRivedi_Click(sender As Object, e As EventArgs) Handles ButtRivedi.Click
  2.         AzzeraToolStripMenuItem_Click(0, e)
  3.         Timer1.Enabled = False
  4.  
  5.         Dim NomePartita As String
  6.         OpenFileDialog1.Title = "Carica la partita salvata"
  7.         OpenFileDialog1.FileName = ""
  8.         OpenFileDialog1.InitialDirectory = Application.StartupPath
  9.         OpenFileDialog1.Filter = "Schema.txt|*.txt"
  10.         OpenFileDialog1.ShowDialog()
  11.         NomePartita = OpenFileDialog1.FileName
  12.         If NomePartita = "" Then Exit Sub
  13.  
  14.         Debug.Print("Leggo dal file """ & NomePartita & """ la scena salvata")
  15.         Dim objReader As New StreamReader(NomePartita)
  16.         ' Leggo fino alla fine del file
  17.         Dim RigaLetta As String
  18.         Do ' gestire sospensione e passo passo
  19.             RigaLetta = objReader.ReadLine()
  20.             If Not RigaLetta Is Nothing Then
  21.                 Dim Sequenza() As String = RigaLetta.Split(";")
  22.                 For i = 0 To 15
  23.                     Dim r As Short = Math.Ceiling(i \ 4)
  24.                     Dim c As Short = i Mod 4
  25.                     Matrice4x4(r + 1, c + 1) = Sequenza(i)
  26.                     If Sequenza(i) > Max_Potenza_Raggiunta Then Max_Potenza_Raggiunta = Sequenza(i)
  27.                 Next
  28.                 Try ' se si carica vecchia registrazione evita l'errore
  29.                     Indx_Nuovo_Val = Sequenza(17) ' indice della casella animata ripassato a Visualizza_Immagine_Celle2048(), attraverso Indx_Nuovo_Val
  30.                 Catch
  31.                     Animazione_On = False ' variabile da gestire
  32.                 End Try
  33.                 Visualizza_Immagine_Celle2048(Matrice4x4)
  34.                 lblInfo.Text = Sequenza(16) ' orario della mossa
  35.                 lblInfo.Refresh()
  36.                 Application.DoEvents() ' se non inserito, l'uso della ram aumenta in modo incontrollato
  37.                 If Animazione_On = True Then Thread.Sleep(100)
  38.             End If
  39.         Loop Until RigaLetta Is Nothing
  40.         objReader.Close()
  41.         Timer1.Enabled = True
  42.         Stato_eventi = Stato.Avviato
  43.         InMovimento = False
  44.     End Sub


EDIT: Ho visto la tua soluzione, con il passaggio del parametro. Avevo risolto senza modificare il tuo codice, per evitare introduzione bug imprevisti.
Se ritieni valida la mia modifica, forse è meglio usarla. :k:

EDIT EDIT: corretta ButtRivedi_Click
Aggiunti Timer1.enabled on/off
Aggiunto lblInfo.Refresh()
Tolti dal ciclo For i, le righe di codice che venivano eseguite inutilmente 16 volte
Tolta Animazione_On = False, ora si sceglie da menu
Inserito sleep se Animazione_On = True

EDIT EDIT EDIT:
Inserito controllo Max_Potenza_Raggiunta, senza usare routine.

Ultima modifica effettuata da Carlo il 27/06/2018 alle 12:35


in programmazione tutto è permesso
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 13:27
Mercoledì, 27/06/2018
@Carlo

Ok va bene la tua soluzione per "Indx_Nuovo_Val"


nel mio codice il Timer1 non si ferma :-|









If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:23
Mercoledì, 27/06/2018
Testo quotato

Postato originariamente da Ultimo:

@Carlo

Si potrebbe inserire  nella Label "Stato" anche

il punteggio e le mosse della sequenza :k:


Per le mosse nessun problema, basta contarle.
Per il punteggio, forse, la cosa più veloce è memorizzarlo nel file .txt mossa per mossa, invece di ricalcolarlo, che dici?

Ultima modifica effettuata da Carlo il 27/06/2018 alle 15:35


in programmazione tutto è permesso
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 14:29
Mercoledì, 27/06/2018
Testo quotato

Postato originariamente da Carlo:

Testo quotato

Postato originariamente da Ultimo:

@Carlo

Si potrebbe inserire  nella Label "Stato" anche

il punteggio e le mosse della sequenza :k:


Per le mosse nessun problema, basa contarle.
Per il punteggio, forse, la cosa più veloce è memorizzarlo nel file .txt mossa per mossa, invece di ricalcolarlo, che dici?



si possono salvare nel file.txt :k:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ] Precedente | Prossimo