ROMPECABEZAS VINTAGE

Source code related resources

Moderator: Rathinagiri

User avatar
LOUIS
Posts: 211
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

ROMPECABEZAS VINTAGE

Post by LOUIS »

Saludos Amigos Programadores:

Estoy aquí con un proyecto de entretenimiento familiar, pero tengo 2 dificultades que quisiera me den una manito como siempre lo habéis hecho, disculpad mi abuso, pero es que hay cosillas que no puedo y me da pena decirlo :oops:

Se trata de hacer un Rompecabezas Vintage de los años 70/80, que me imagino debéis haber jugado alguna vez de niños (Yo lo hice) ...

Adjunto 3 imágenes, 2 del juego vintage y uno de la pantalla que he hecho, así como también un archivo RAR con el PRG e imágenes.

Los números del 1 al 15 Aparecen Ordenados más un Espacio Vacío al final que hace de Comodín; LA PRIMERA DIFICULTAD es que abajo hay un Botón que dice Desordenar el cual deberá cambiar todos los números de su posición original aleatoriamente, antes de empezar el juego.

El usuario/jugador deberá entonces tratar de ordenar los 15 números y dejarlos en su posición inicial.

LA SEGUNDA DIFICULTAD es que al dar Click en un Número, éste se intercambie con El Cuadro o Espacio Vacío que debe estar junto a el ...
es decir el Número tomará la posición del Espacio Vacío y viceversa.

Si se diera Click en un Número que NO ESTÁ JUNTO al Espacio Vacío, no habrá ninguna acción o saldrá un mensaje de advertencia ...

Hay que tomar en cuenta que el intercambio de posiciones del Número con el Espacio Vacío, sólo será en Modo Horizontal o Vertical, pero
JAMÁS en Modo Diagonal.

En espera de vuestras valiosas colaboración, de antemano os doy las gracias.
Attachments
ROMPECAB.rar
(889.95 KiB) Downloaded 183 times
PANTALLA DEL JUEGO.jpg
PANTALLA DEL JUEGO.jpg (132.71 KiB) Viewed 58407 times
ROMPECABEZAS2.jpg
ROMPECABEZAS2.jpg (57.41 KiB) Viewed 58407 times
ROMPECABEZAS1.jpg
ROMPECABEZAS1.jpg (93.31 KiB) Viewed 58407 times
User avatar
serge_girard
Posts: 3167
Joined: Sun Nov 25, 2012 2:44 pm
DBs Used: 1 MySQL - MariaDB
2 DBF
Location: Belgium
Contact:

Re: ROMPECABEZAS VINTAGE

Post by serge_girard »

Thanks!
There's nothing you can do that can't be done...
User avatar
gfilatov
Posts: 1069
Joined: Fri Aug 01, 2008 5:42 am
Location: Ukraine
Contact:

Re: ROMPECABEZAS VINTAGE

Post by gfilatov »

Hello Louis,

Thanks for your request about this old game :!:

A complete implementation of this game (called Game 15) is available as an example in the MiniGUI distribution.

There is the following description of this program:
Game 15 v2.3 Copyright (c) 2003-2009 Grigory Filatov
====================================================

THIS PROGRAM IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND
IS EXPRESSED OR IMPLIED. YOU USE AT YOUR OWN RISK. THE AUTHOR
WILL NOT BE LIABLE FOR DATA LOSS, DAMAGES, LOSS OF PROFITS OR
ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS SOFTWARE.

This program is FREEWARE.

Description
-----------

This is a small game which can help you to kill free time.
The purpose of the game is to range numbers from 1 to 15.
Program saves hiscores into the file game15.dat.
You can see the appearance of the program in the picture below:
capture.png
capture.png (147.69 KiB) Viewed 58323 times
Hope this is helpful. :idea:
Kind Regards,
Grigory Filatov

"Everything should be made as simple as possible, but no simpler." Albert Einstein
User avatar
LOUIS
Posts: 211
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: ROMPECABEZAS VINTAGE

Post by LOUIS »

Hello Mr. Filatov

I can't find that url for download ... and be able to see the example code.
:roll:

Can You copy the prg here please ? :oops:

Thanks in advance.
User avatar
gfilatov
Posts: 1069
Joined: Fri Aug 01, 2008 5:42 am
Location: Ukraine
Contact:

Re: ROMPECABEZAS VINTAGE

Post by gfilatov »

LOUIS wrote: Sat Dec 16, 2023 9:50 pm Hello Mr. Filatov

I can't find that url for download ... and be able to see the example code.
Hello Louis,

Thanks for your interest :!:

The sample code is for MiniGUI Extended Edition at
https://hmgextended.com

The complete source code for the program is given below: :arrow:

Code: Select all

/*
 * MINIGUI - Harbour Win32 GUI library Demo
 *
 * Copyright 2002-2009 Roberto Lopez <harbourminigui@gmail.com>
 * http://harbourminigui.googlepages.com/
 *
 * Copyright 2003-2009 Grigory Filatov <gfilatov@inbox.ru>
*/

#include "minigui.ch"

#define PROGRAM 'Game 15'
#define VERSION ' version 2.3'
#define COPYRIGHT ' 2003-2009 Grigory Filatov'

#define IDI_MAIN 1001
// #define DEBUG

STATIC n := 4, aData := {}, cUserName := "NoName", aBase := { { "NAME", "C", 30, 0 }, { "RESULT", "N", 6, 0 } }
STATIC aKeys

FIELD NAME, RESULT
*--------------------------------------------------------*
PROCEDURE Main()
*--------------------------------------------------------*
   SET MULTIPLE OFF WARNING

   DEFINE WINDOW Form_1 ;
         AT 0, 0 ;
         WIDTH 317 ;
         HEIGHT 394 ;
         TITLE PROGRAM + VERSION ;
         ICON IDI_MAIN ;
         MAIN ;
         NOMINIMIZE NOMAXIMIZE ;
         NOSIZE NOCAPTION ;
         ON INIT OpenTopTable() ;
         ON RELEASE ( dbCloseAll(), ;
         FErase( "Game1" + IndexExt() ), FErase( "Game2" + IndexExt() ) ) ;
         FONT "Arial" ;
         SIZE 10

      @ 0, 0 IMAGE Main_1 ;
         PICTURE "MAIN" ;
         WIDTH Form_1.WIDTH HEIGHT Form_1.HEIGHT

      @ 10, 8 LABEL Label_1 VALUE Space( 6 ) + PROGRAM + VERSION ;
         WIDTH 266 HEIGHT 16 ;
         ACTION InterActiveMoveHandle( GetFormHandle( "Form_1" ) ) ;
         FONT "Arial" ;
         SIZE 12 ;
         BOLD ;
         FONTCOLOR WHITE ;
         TRANSPARENT ;
         CENTERALIGN

      @ 12, Form_1.WIDTH - 42 BUTTON MINIMIZE ;
         PICTURE "MINBTN" ;
         ACTION Form_1.MINIMIZE ;
         WIDTH 14 HEIGHT 14

      @ 12, Form_1.WIDTH - 26 BUTTON RELEASE ;
         PICTURE "CLOSEBTN" ;
         ACTION Form_1.Release() ;
         WIDTH 14 HEIGHT 14

      LoadData()

      @ 36, 14 BUTTON Button_1 PICTURE "Load" ;
         ACTION LoadGame() ;
         WIDTH 96 HEIGHT 24 ;
         TOOLTIP "Load a game" ;
         FLAT ;
         NOXPSTYLE NOTRANSPARENT

      @ 36, 110 BUTTON Button_2 PICTURE "Start" ;
         ACTION StartAgain() ;
         WIDTH 96 HEIGHT 24 ;
         TOOLTIP "Start of new game" ;
         FLAT ;
         NOXPSTYLE NOTRANSPARENT

      @ 36, 206 BUTTON Button_3 PICTURE "Save" ;
         ACTION SaveGame() ;
         WIDTH 96 HEIGHT 24 ;
         TOOLTIP "Save a game" ;
         FLAT ;
         NOXPSTYLE NOTRANSPARENT

      @ Form_1.HEIGHT - 32, 14 BUTTON Button_4 ;
         PICTURE "About" ;
         ACTION MsgAbout() ;
         WIDTH 96 HEIGHT 24 ;
         TOOLTIP "About" ;
         FLAT ;
         NOXPSTYLE NOTRANSPARENT

      @ Form_1.HEIGHT - 32, 110 BUTTON Button_5 ;
         PICTURE "Top" ;
         ACTION LoadTop() ;
         WIDTH 96 HEIGHT 24 ;
         TOOLTIP "Top Table" ;
         FLAT ;
         NOXPSTYLE NOTRANSPARENT

      @ Form_1.HEIGHT - 32, 206 BUTTON Button_6 ;
         PICTURE "Exit" ;
         ACTION Form_1.Release() ;
         WIDTH 96 HEIGHT 24 ;
         TOOLTIP "Exit" ;
         FLAT ;
         NOXPSTYLE NOTRANSPARENT

      ON KEY ALT + L ACTION LoadGame()
      ON KEY ALT + T ACTION StartAgain()
      ON KEY ALT + S ACTION SaveGame()
      ON KEY ALT + B ACTION MsgAbout()
      ON KEY ALT + 1 ACTION LoadTop()
      ON KEY ALT + X ACTION Form_1.Release()

#ifdef DEBUG
      ON KEY ALT + W ACTION LoadWin()

#endif

   END WINDOW

   Form_1.Button_1.Enabled := ( Len( Directory( "*.sav" ) ) > 0 )
   Form_1.Button_2.SetFocus

   CENTER WINDOW Form_1

   ACTIVATE WINDOW Form_1

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE PressButton()
*--------------------------------------------------------*
   LOCAL cCapt := This.PICTURE, nPress, nFree
   LOCAL row, col, nr, fl := .F.

   nFree := AScan( aData, {| x | x[ 1 ] == "B16" } )
   nPress := AScan( aData, {| x | x[ 1 ] == cCapt } )

   IF Abs( nFree - nPress ) == n .OR. Abs( nFree - nPress ) == 1
      SwapButtons( nPress, nFree )
      FOR row := 1 TO n
         FOR col := 1 TO n
            nr := ( row - 1 ) * n + col
            IF nr == n * n
               EXIT
            ENDIF
            IF Val( SubStr( aData[ nr ][ 1 ], 2 ) ) # ( col - 1 ) * n + row
               fl := .T.
               PlayBeep()
               EXIT
            ENDIF
         NEXT
         IF fl
            EXIT
         ENDIF
      NEXT
      IF ! fl
         SaveResult()
      ENDIF
   ENDIF

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE SwapButtons( nPress, nFree )
*--------------------------------------------------------*
   LOCAL cPress := aData[ nPress ][ 2 ], cFree := aData[ nFree ][ 2 ]
   LOCAL swap, nOnRow, nOnCol, nToRow, nToCol

   swap := aData[ nFree ][ 1 ]

   aData[ nFree ][ 1 ] := aData[ nPress ][ 1 ]
   aData[ nFree ][ 2 ] := cPress

   aData[ nPress ][ 1 ] := swap
   aData[ nPress ][ 2 ] := cFree

   nOnRow := GetProperty( "Form_1", cPress, "Row" )
   nOnCol := GetProperty( "Form_1", cPress, "Col" )
   nToRow := GetProperty( "Form_1", cFree, "Row" )
   nToCol := GetProperty( "Form_1", cFree, "Col" )

   SetProperty( "Form_1", cPress, "Row", nToRow )
   SetProperty( "Form_1", cPress, "Col", nToCol )
   SetProperty( "Form_1", cFree, "Row", nOnRow )
   SetProperty( "Form_1", cFree, "Col", nOnCol )

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE StartAgain()
*--------------------------------------------------------*
   LOCAL nr, cButton

   FOR nr := 1 TO n * n
      cButton := "Number_" + StrZero( nr, 2 )
      DoMethod( "Form_1", cButton, "Release" )
   NEXT

   aData := {}
   LoadData()

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE SaveGame()
*--------------------------------------------------------*
   LOCAL cCurDir := CurDrive() + ":\" + CurDir()
   LOCAL cSaveFile := PutFile ( { { "Save files (*.sav)", "*.sav" } }, ;
      'Save a Game To File', cCurDir, .T. )

   IF ! Empty( cSaveFile )

      DirChange( cCurDir )

      cSaveFile := cFileNoExt( cSaveFile ) + ".sav"

      BEGIN INI FILE cSaveFile
         SET SECTION "Game" ENTRY "Save" TO aData
      END INI

      Form_1.Button_1.Enabled := .T.

   ENDIF

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE LoadGame()
*--------------------------------------------------------*
   LOCAL cCurDir := CurDrive() + ":\" + CurDir()
   LOCAL row, col, nr, cButton, cCaption
   LOCAL cSaveFile

   IF Form_1.Button_1.Enabled == .T.

      cSaveFile := GetFile ( { { "Save files (*.sav)", "*.sav" } }, ;
         'Load a Game From File', cCurDir, , .T. )

      IF ! Empty( cSaveFile )

         DirChange( cCurDir )

         aData := {}
         cSaveFile := cFileNoExt( cSaveFile ) + ".sav"

         BEGIN INI FILE cSaveFile
            GET aData SECTION "Game" ENTRY "Save"
         END INI

         FOR nr := 1 TO n * n
            cButton := "Number_" + StrZero( nr, 2 )
            DoMethod( "Form_1", cButton, "Release" )
         NEXT

         FOR row := 1 TO n
            FOR col := 1 TO n
               nr := ( row - 1 ) * n + col
               cCaption := aData[ nr ][ 1 ]
               cButton := aData[ nr ][ 2 ]
               @ (col - 1 ) * 72 + 64, ( row - 1 ) * 72 + 15 BUTTON &cButton ;
                  OF Form_1 ;
                  PICTURE cCaption ;
                  ACTION PressButton() ;
                  WIDTH 72 HEIGHT 72
            NEXT
         NEXT

      ENDIF

   ENDIF

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE LoadData()
*--------------------------------------------------------*
   LOCAL row, col, nr, cButton, cCaption, aBtn := LoadArray()

   FOR row := 1 TO n
      FOR col := 1 TO n
         nr := ( row - 1 ) * n + col
         cCaption := "B" + LTrim( Str( aBtn[ nr ], 2 ) )
         cButton := "Number_" + StrZero( aBtn[ nr ], 2 )
         @ (col - 1 ) * 72 + 64, ( row - 1 ) * 72 + 15 BUTTON &cButton ;
            OF Form_1 ;
            PICTURE cCaption ;
            ACTION PressButton() ;
            WIDTH 72 HEIGHT 72
         AAdd( aData, { cCaption, cButton } )
      NEXT
   NEXT

RETURN

*--------------------------------------------------------*
STATIC FUNCTION LoadArray()
*--------------------------------------------------------*
   LOCAL x, i := 1, aArr := {}

   DO WHILE i <= n * n
      x := Round( Random( 32767 ) / 32767 * n * n, 0 )
      IF AScan( aArr, x ) == 0 .AND. x > 0
         AAdd( aArr, x )
         i++
      ENDIF
   ENDDO

RETURN aArr

#ifdef DEBUG
*--------------------------------------------------------*
STATIC PROCEDURE LoadWin()
*--------------------------------------------------------*
   LOCAL row, col, nr, nBtn, cButton, cCaption

   FOR nr := 1 TO n * n
      cButton := "Number_" + StrZero( nr, 2 )
      DoMethod( "Form_1", cButton, "Release" )
   NEXT

   FOR row := 1 TO n
      FOR col := 1 TO n
         nr := ( row - 1 ) * n + col
         nBtn := ( col - 1 ) * n + row
         cButton := "Number_" + StrZero( nBtn, 2 )
         cCaption := "B" + LTrim( Str( nBtn, 2 ) )
         @ (col - 1 ) * 72 + 64, ( row - 1 ) * 72 + 15 BUTTON &cButton ;
            OF Form_1 ;
            PICTURE cCaption ;
            ACTION PressButton() ;
            WIDTH 72 HEIGHT 72
         aData[ nr ][ 1 ] := cCaption
         aData[ nr ][ 2 ] := cButton
      NEXT
   NEXT

RETURN

#endif

*--------------------------------------------------------*
PROCEDURE OpenTopTable()
*--------------------------------------------------------*
   LOCAL cDataBase := "Game15.dat", lFirst := .F.

   IF ! File( cDataBase )
      dbCreate( cDataBase, aBase )
      lFirst := .T.
   ENDIF

   USE ( cDataBase ) NEW EXCLUSIVE

   IF ! NetErr()
      IF ! File( "Game2" + IndexExt() )
         INDEX ON Upper( FIELD->NAME ) TO Game2
      ENDIF
      IF ! File( "Game1" + IndexExt() )
         INDEX ON Descend( FIELD->RESULT ) TO Game1
      ENDIF
      SET INDEX TO Game1, Game2
   ELSE
      MsgStop( "Data file is locked", "Please, try again" )
      RETURN
   ENDIF

   IF lFirst
      APPEND BLANK
      NAME := "Author"
      RESULT := 100
      APPEND BLANK
      NAME := "NoName"
      RESULT := 0
   ENDIF

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE SaveResult()
*--------------------------------------------------------*
   LOCAL cName := cUserName, n

   PlayOK()
   cName := LTrim( InputBox( 'Enter your name:', 'Save Result', cName, 15000, cName ) )

   IF Empty( cName )
      cName := "NoName"
   ELSE
      cUserName := cName
   ENDIF

   SET ORDER TO 2
   SEEK Upper( cName )
   IF Found()
      n := RESULT
      RESULT := ++n
   ELSE
      APPEND BLANK
      NAME := cName
      RESULT := 1
   ENDIF
   SET ORDER TO 1

   StartAgain()

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE LoadTop()
*--------------------------------------------------------*
   LOCAL aResult := {}, nr, cButton, cLabel

   If ! IsControlDefined( Button_7, Form_1 )

      aKeys := SAVEONKEY()

      GO TOP
      DO WHILE RecNo() <= 10 .AND. ! Eof()
         AAdd( aResult, PadR( AllTrim( NAME ), 50, '.' ) + " " + ;
            LTrim( Str( RESULT ) ) )
         SKIP
      ENDDO

      FOR nr := 1 TO 6
         cButton := "Button_" + LTrim( Str( nr, 2 ) )
         DoMethod( "Form_1", cButton, "Hide" )
      NEXT

      FOR nr := 1 TO n * n
         cButton := "Number_" + StrZero( nr, 2 )
         DoMethod( "Form_1", cButton, "Hide" )
      NEXT

      @ Form_1.HEIGHT - 32, 62 BUTTON Button_7 ;
         OF Form_1 ;
         PICTURE "OK" ;
         ACTION ClearTop() ;
         WIDTH 96 HEIGHT 24 FLAT ;
         NOXPSTYLE NOTRANSPARENT

      @ Form_1.HEIGHT - 32, 164 BUTTON Button_8 ;
         OF Form_1 ;
         PICTURE "Clear" ;
         ACTION ClearTop( .T. ) ;
         WIDTH 96 HEIGHT 24 ;
         TOOLTIP "Clear Top Table" FLAT ;
         NOXPSTYLE NOTRANSPARENT

      FOR nr := 1 TO Len( aResult )

         cLabel := "Label_" + StrZero( nr, 2 )
         @ (nr - 1 ) * 32 + 42, 16 LABEL &cLabel ;
            OF Form_1 ;
            VALUE aResult[ nr ] ;
            WIDTH 280 HEIGHT 16 ;
            FONT "Arial" ;
            SIZE 12 ;
            BOLD ;
            FONTCOLOR WHITE ;
            TRANSPARENT
      NEXT

      Form_1.Button_7.SetFocus

      RedrawWindow( _HMG_MainHandle )

      ON KEY ALT + O OF Form_1 ACTION ClearTop()
      ON KEY ALT + C OF Form_1 ACTION ClearTop( .T. )

   ENDIF

RETURN

*--------------------------------------------------------*
STATIC PROCEDURE ClearTop( lClear )
*--------------------------------------------------------*
   LOCAL nr, cButton, cLabel

DEFAULT lClear := .F.

   IF lClear
      GO 2
      DELETE NEXT ( LastRec() - 1 )
      PACK
   ENDIF

   RELEASE KEY ALT + O OF Form_1
   RELEASE KEY ALT + C OF Form_1

   Form_1.Button_7.Release()
   Form_1.Button_8.Release()

   FOR nr := 1 TO 6
      cButton := "Button_" + LTrim( Str( nr, 2 ) )
      DoMethod( "Form_1", cButton, "Show" )
   NEXT

   FOR nr := 1 TO n * n
      cButton := "Number_" + StrZero( nr, 2 )
      DoMethod( "Form_1", cButton, "Show" )
   NEXT

   FOR nr := 1 TO 10
      cLabel := "Label_" + StrZero( nr, 2 )
      IF IsControlDefined( &cLabel, Form_1 )
         DoMethod( "Form_1", cLabel, "Release" )
      ELSE
         EXIT
      ENDIF
   NEXT

   RESTONKEY( aKeys )

   RedrawWindow( _HMG_MainHandle )

RETURN

*--------------------------------------------------------*
STATIC FUNCTION MsgAbout()
*--------------------------------------------------------*

RETURN MsgInfo( PadC( PROGRAM + VERSION, 38 ) + CRLF + ;
      PadC( "Copyright " + Chr( 169 ) + COPYRIGHT, 40 ) + CRLF + CRLF + ;
      hb_Compiler() + CRLF + ;
      Version() + CRLF + ;
      SubStr( MiniGuiVersion(), 1, 38 ) + CRLF + CRLF + ;
      PadC( "This program is Freeware!", 38 ) + CRLF + ;
      PadC( "Copying is allowed!", 42 ), "About", IDI_MAIN, .F. )

*--------------------------------------------------------*
STATIC FUNCTION SAVEONKEY()
*--------------------------------------------------------*
   LOCAL bKeyBlock, abSaveKeys := {}

   STORE KEY ALT + L OF Form_1 TO bKeyBlock
   AAdd( abSaveKeys, bKeyBlock )
   RELEASE KEY ALT + L OF Form_1

   STORE KEY ALT + T OF Form_1 TO bKeyBlock
   AAdd( abSaveKeys, bKeyBlock )
   RELEASE KEY ALT + T OF Form_1

   STORE KEY ALT + S OF Form_1 TO bKeyBlock
   AAdd( abSaveKeys, bKeyBlock )
   RELEASE KEY ALT + S OF Form_1

   STORE KEY ALT + B OF Form_1 TO bKeyBlock
   AAdd( abSaveKeys, bKeyBlock )
   RELEASE KEY ALT + B OF Form_1

   AAdd( abSaveKeys, Form_1.FocusedControl )

RETURN abSaveKeys

*--------------------------------------------------------*
STATIC PROCEDURE RESTONKEY( abSaveKeys )
*--------------------------------------------------------*
   LOCAL cBtnFocus

   ON KEY ALT + L OF Form_1 ACTION Eval ( abSaveKeys[ 1 ] )
   ON KEY ALT + T OF Form_1 ACTION Eval ( abSaveKeys[ 2 ] )
   ON KEY ALT + S OF Form_1 ACTION Eval ( abSaveKeys[ 3 ] )
   ON KEY ALT + B OF Form_1 ACTION Eval ( abSaveKeys[ 4 ] )

   cBtnFocus := abSaveKeys[ 5 ]
   Form_1.&( cBtnFocus ).SetFocus

RETURN

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC ( INTERACTIVEMOVEHANDLE )
{
   keybd_event(
     VK_RIGHT, // virtual-key code
           0,  // hardware scan code
           0,  // flags specifying various function options
           0   // additional data associated with keystroke
      );
   keybd_event(
      VK_LEFT, // virtual-key code
           0,  // hardware scan code
           0,  // flags specifying various function options
           0   // additional data associated with keystroke
      );

   SendMessage( ( HWND ) hb_parnl(1), WM_SYSCOMMAND, SC_MOVE, 10 );
}

#pragma ENDDUMP
Kind Regards,
Grigory Filatov

"Everything should be made as simple as possible, but no simpler." Albert Einstein
User avatar
LOUIS
Posts: 211
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: ROMPECABEZAS VINTAGE

Post by LOUIS »

Hola Amigos Programadores

Por aquí sigo con mi inquietud de hacer este rompecabezas, digamos que a mi manera como diría Frank Sinatra :D
He hecho unos cambios simplificando un poco el código y ahora estoy en la parte de desordenar los números, claro que lo
hago modestamente hasta donde entiendo (para después hacer un poco más diverso ese desorden), pero resulta que los
desordeno al revés, pero inmediatamente se vuelven a ordenar o en otras palabras se quita el desordenado y queda el screen
original del 1 al 15
Es por eso que os pido me deis una manito de ayuda, no soy experto en esto, pero me gusta mucho ...
Disculpad si molesto :oops:

Adjunto el prg y las imágenes.

P.D.- Comprendí que el espacio vacío debe tomar el número 16 aunque no se vea.
Attachments
ROMPECAB.rar
(808.68 KiB) Downloaded 165 times
User avatar
LOUIS
Posts: 211
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: ROMPECABEZAS VINTAGE

Post by LOUIS »

Hola nuevamente Amigos:

Hice un cambio para desordenar los números (sé que uds lo pueden hacer mucho mejor), pero es lo que modestamente puedo :oops:

Si me dan vuestra aprobación, veré como alterar la forma del desorden aleatoriamente, por el momento es lo que tengo
y quiero compartirlo con uds.

En la primera pantalla dad click por favor en el Botón ---> Desordenar para ver la siguiente pantalla con los números desordenados.

Como siempre, si alguien desea ayudarme modificando el código, le agradezco mucho.

Saludos.

Adjunto el Prg y el Exe más la Imagen de la pantalla con los números desordenados.
Attachments
PANTALLA DEL JUEGO2.jpg
PANTALLA DEL JUEGO2.jpg (126.36 KiB) Viewed 57122 times
ROMPECAB.rar
(757.61 KiB) Downloaded 134 times
User avatar
LOUIS
Posts: 211
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: ROMPECABEZAS VINTAGE

Post by LOUIS »

Amigos buenas noches a todos.

Por aquí de nuevo con mi programita que ya le hice unos cambios, he logrado comprender el famoso Random (recordad que no soy estudiado en Ingeniería de Sistemas, sólo soy un programador empírico) y he logrado hacer que los números se presenten aleatoriamente desordenados en la pantalla de inicio, con una imagen que muestra cómo debe dejar el player la pantalla al terminar el juego.
Tuve problemas ya que los números me salían duplicados y a veces cuadros vacíos, pero vaya que lo he logrado (hasta ahí) :oops:

Ahora viene la parte en la que quiero me déis una manito o una idea, para que el usuario pueda mover con el mouse, los números en la pantalla, mirad que el cuadro azul sin número es el "comodín" o espacio en blanco, al que se debe mover los números junto a el, sólo en sentido horizontal o vertical (diagonal no); creo que si le da un click en un número que esté junto al comodín, éste se debería mover hacia el espacio del comodín y éste último tomar el espacio del número en el que se dió click y así sucesivamente ...

Les adjunto el programa completo para que lo veáis como va y nuevamente pido que alguien me ayude o me dé una idea, para poder culminarlo.

Como siempre todo mi agradecimiento a ustedes por su valioso tiempo.
Attachments
ROMPECAB.rar
(957.24 KiB) Downloaded 159 times
ULTIMA PANTALLA.jpg
ULTIMA PANTALLA.jpg (169.33 KiB) Viewed 52542 times
User avatar
LOUIS
Posts: 211
Joined: Tue Dec 11, 2012 9:05 pm
DBs Used: DBF

Re: ROMPECABEZAS VINTAGE

Post by LOUIS »

Amigos buenas tardes.

Estoy con un problemilla y os pido ayuda :oops:

Al mostrar el cuadro con los números desordenados y dar click en cualquiera de ellos, Cómo puedo capturar el nombre de dicha imagen o número ?

El código ha variado un poquito, ya que añadí el ONCLICK MUEVE() para cuando se dé click en cualquier número, pero necesito capturar el nombre de esa imagen o número, para poder proseguir ...

Vamos, dadme una manito por favor :roll:
No me sale ninguna combinación en la Function Mueve()

De antemano muchas gracias a quien me quiera echar una ayudita.

Code: Select all

*----------------------------
FUNCTION DESORDENAR

LOCAL nNum
aleatorio:=ARRAY(16)

FOR N=1 TO 16
   PASE:=.T.
   DO WHILE PASE
      nNum:=HB_RANDOMINT(1,16)
      IF VALTYPE(aleatorio[nNum])="U"
         aleatorio[nNum]:="Photo\"+ALLTRIM(STR(N)+".jpg")
         PASE:=.F.
      ENDIF
   ENDDO
   cVar1:="FOTO"+ALLTRIM(STR(N))
   cVar2:="PHOTO\"+ ALLTRIM(STR(nNum))+".JPG"
   FILA()
   COLUMNA()
   @ F,C IMAGE &cVar1 PARENT PRINCE PICTURE cVar2 WIDTH 180 HEIGHT 150 STRETCH ONCLICK MUEVE()
NEXT

RETU


*---------------------
FUNCTION MUEVE

*NUME := IMAGE.VALUE

NUME := GETPROPERTY("PRINCE","IMAGE","value")

*NUME = (PRINCE.CVAR2.VALUE)

MSGINFO (NUME)
RETU
Attachments
POSICIONES.jpg
POSICIONES.jpg (94.95 KiB) Viewed 52371 times
User avatar
tonton2
Posts: 444
Joined: Sat Jun 29, 2013 1:26 pm
Location: Algerie
Contact:

Re: ROMPECABEZAS VINTAGE

Post by tonton2 »

Bonjour a toute l'equipe
"I want to block the RETURN or ENTER key with the following program (ON KEY RETURN ACTION NIL), but it gives me the following error, see image."
Attachments
K_Return.JPG
K_Return.JPG (10.14 KiB) Viewed 31081 times
L'Algerie vous salut
Y.TABET
Post Reply