Page 1 sur 1

Base de données et visualisation

Publié : mar. 26/oct./2021 11:45
par blendman
Salut

En ce moment, je regarde un peu les BDD (je commence avec SQLite).
Savez-vous s'il existe des codes quelque part pour visualiser et modifier une BDD ?

Merci :)

Re: Base de données et visualisation

Publié : mar. 26/oct./2021 14:44
par Marc56
Tu as l'excellent exemple de falsam:
SQLite Explorer
:wink:

Re: Base de données et visualisation

Publié : mer. 27/oct./2021 7:47
par blendman
Coucou

merci beaucoup pour le rappel de cet excellent outil ;).

En fait, je réfléchis en ce moment sur l'élaboration d'une BDD, notamment pour du jeu vidéo de type online, avec pas mal d'infos concernant le personnage.

Est-ce que mon approche est la bonne ?

SI j'ai ce code (purebasic) :
(c'est juste un exemple pour voir comment je dois faire pour exporter ça vers une bdd) :

Code : Tout sélectionner

Structure sStatPerso
  Vie.w
  Force.w
  Intelligence.W
  Chance.w
  Sagesse.w
EndStructure

Structure sQuest
  id.w ; identifiant de la quete
  State.a ; état d'avancement de la quête.
  Param$ ; autre paramètres si besoin
EndStructure

Structure sSucces
  id.w ; identifiant du succes
  State.a ; état d'avancement du succes.
  Array nb.w(0) ; le nombre rempli (pour chaque condition qui permettent de débloquer le succès)
EndStructure

Structure sEquipement
  id.w
  Used.a
  stat.sStatPerso
EndStructure

Structure sInventaire
  ; objets de base, non modifiable
  id.w
  Nb.w
EndStructure
Structure sSkills
  id.w
  XP.w
EndStructure

Structure sPersonnage
  Nom$
  classe.a ; classe du personnage : guerrier, magicien, archer, etc.
  
  ; Statistique de base, lié à la classe choisie
  ; donc non sauvegardé.
  stat.sStatPerso
  ; les points bonus qu'on a donné à nos stats
  StatBonus.sStatPerso
  ; le nombre de point qui restent à donner
  NbPointStat.w
  ; expérience et niveau
  XP.i
  Level.a
  ; puis, les tableaux ou list() nécessaires :
  Array Quete.squest(0)
  Array inventaire.sInventaire(0)
  Array equipement.sEquipement(0)
  Array skills.sSkills(0)
EndStructure

Est ce que cela signifie que je pourrais avoir ces tables dans la BDD ?
toutes les tables ont toujours un 1er champs "id_perso", qui est le même pour un compte (pour retrouver les infos de ce compte)
- table "personnage" avec les champs : nom, classe, statbonusvie, statbonusforce, statbonusintelligence, statbonuschance, statbonussagesse, NbPointStat, XP, Level.
Puis, des tables suivantes avec les champs de chaque structure associée
- table "quete"
- table "inventaire"
- table "equipement"
- table "skills"
- table "Succes" : pour celle-ci, comment faut-il faire car la structure contient un tableau : une autre table genre succesnb ?

Et ensuite, puis-je lier un personnage à une table ?
Ou alors, dans ma BDD, l'élement 34 de la table "personnage" est nécessaire lié aux éléments 34 des autres tables (inventaire, quete, equipement, etc) ?

Merci beaucoup pour les infos :)

EDIT :
voici un premier code, vous pensez que c'est comme ceci qu'il faut faire (en tout cas, que cette approche semble correcte) ?

Code : Tout sélectionner

; Dabord, pour créer et gérer un personnage, les structures.
Structure sStatPerso
  Vie.w
  Force.w
  Intelligence.W
  Chance.w
  Sagesse.w
EndStructure

Structure sQuest
  id.w ; identifiant de la quete
  State.a ; état d'avancement de la quête.
  Param$ ; autre paramètres si besoin
EndStructure

Structure sSucces
  id.w ; identifiant du succes
  State.a ; état d'avancement du succes.
  Array nb.w(0) ; le nombre rempli (pour chaque condition qui permettent de débloquer le succès)
EndStructure

Structure sEquipement
  id.w
  Used.a
  stat.sStatPerso
EndStructure

Structure sInventaire
  ; objets de base, non modifiable
  id.w
  Nb.w
EndStructure
Structure sSkills
  id.w
  XP.w
EndStructure

Structure sPersonnage
  Nom$
  classe.a ; classe du personnage : guerrier, magicien, archer, etc.
  
  ; Statistique de base, lié à la classe choisie
  ; donc non sauvegardé.
  stat.sStatPerso
  ; les points bonus qu'on a donné à nos stats
  StatBonus.sStatPerso
  ; le nombre de point qui restent à donner
  NbPointStat.w
  ; expérience et niveau
  XP.i
  Level.a
  ; puis, les tableaux ou list() nécessaires :
  Array Quete.squest(0)
  Array inventaire.sInventaire(0)
  Array equipement.sEquipement(0)
  Array skills.sSkills(0)
EndStructure

; Puis, la BDD
Procedure DB_Init()
  ; basé sur un code de metalos lui même basé sur un code Progi1984  :)
  Protected plFile.l
  Protected psSQLRequest.s
  UseSQLiteDatabase()
  file$ = GetCurrentDirectory()+"personnagejeuMMORPG1.sqlite"
  
  If FileSize(file$ ) < 0
    plFile = CreateFile(#PB_Any, file$ )
    If plFile
      CloseFile(plFile)
    EndIf
  EndIf
  
  glDBSQLite = OpenDatabase(#PB_Any, file$ , "", "", #PB_Database_SQLite)
  
  If glDBSQLite = 0
    MessageRequester("Erreur BDD jeux videos", DatabaseError())
    End
  ElseIf plFile
    ; table "create du personnage"
    psSQLRequest = "CREATE TABLE IF NOT EXISTS personnage ("
    psSQLRequest + "id_perso INTEGER PRIMARY KEY AUTOINCREMENT Not NULL, "
    psSQLRequest + "perso_nom TEXT Not NULL, "
    psSQLRequest + "perso_classe INTEGER, "
    psSQLRequest + "perso_statbonusvie INTEGER,"
    psSQLRequest + "perso_statbonusforce INTEGER,"
    psSQLRequest + "perso_statbonusintelligence INTEGER,"
    psSQLRequest + "perso_statbonuschance INTEGER,"
    psSQLRequest + "perso_statbonussagesse INTEGER,"
    psSQLRequest + "perso_nbpointstat INTEGER,"
    psSQLRequest + "perso_xp INTEGER,"
    psSQLRequest + "perso_level INTEGER"
    psSQLRequest + ")"

    ; Debug psSQLRequest
    If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
      MessageRequester("Jeu video1 - DB_Init() 1", DatabaseError())
      End
    EndIf
    
    psSQLRequest = "CREATE TABLE IF NOT EXISTS inventaire ("
    psSQLRequest + "id_perso INTEGER PRIMARY KEY AUTOINCREMENT Not NULL, "
    psSQLRequest + "inventaire_id INTEGER,"
    psSQLRequest + "inventaire_nb INTEGER"
    psSQLRequest + ")"
    ; Debug psSQLRequest
    If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
      MessageRequester("Jeu video1 - DB_Init() 2", DatabaseError())
      End
    EndIf
    
          MessageRequester("Gestion de persos - DB_Init()", "Bdd initialisée")

  EndIf
  
EndProcedure


DB_Init()



Re: Base de données et visualisation

Publié : jeu. 28/oct./2021 18:37
par Ollivier
Salut Blendman, après une petite lecture en diagonale, parce qu'impossible d'allumer un ordi, juste cette succinte suggestion :

Comme c'est en réseau, il y a des délais qui s'imposent. Et le temps dans un système on-line peut provoquer des distortions qu'il est nécessaire de corriger. Alors, je ne connais aucun jeu on-line, mais il y a sûrement des jeux qui implémentent ces mises à jour dans le game-play ou dans le scénario. Ça peut être une piste assez ludique pour toi.

Pour cerner ces distortions, tu peux abstraire le temps à l'espace : imagine une maison à 4 pièces 2 à 2. Chaque pièce a donc 2 portes intérieures pour atteindre 2 pièces voisines. Rien ne t'empêche en 3D en local de faire un jeu où il y a 5 pièces ou bien plus encore, en total désaccord avec la mécanique spatiale. Dans la réalité, si tu traverses 3 pièces dans une maison dont le plan de masse est occupé par 2 fois 2 pièces mitoyennes, tu as fait le tour de la maison, et tu es donc dans la pièce initiale. Dans un jeu de fiction, tu peux outrepasser cette règle d'occupation spatiale et imaginer que ta maison a 5 pièces.

Avec le temps, c'est un peu pareil.

On va imaginer que ta maison à 4 pièces collées 2 à 2, est remplacée par un chateau à 4 donjons 2 à 2 : pour les relier, au lieu d'une simple porte, c'est un couloir, et donc, au lieu, au lieu de passer d'une pièce à l'autre instantanément, il faut parcourir le couloir avec une durée minimum.

Dans ce cas, où le game-play comporte de telles temporisations, tu peux te permettre de créer la gestion d'un donjon par ordinateur dans un réseau à quatre ordinateurs.

Ça te donne une idée de ce que tu dois avoir dans quasiment toutes tes structures d'objet/sujet :
- un ID global (integer)
- une liste de PFS (positions, vitesses, accélérations, décisions logiques) pour chaque caractéristique quantitative de ton objet/sujet (santé, popularité, crédibilité, offense, défense, richesse, etc...)
- une liste d'attributs pour les caractéristiques qualitatives (nom, code de forme, code de texture, etc...)

Autre détail : inventer un faux hasard. C'est-à-dire une fonction pseudo-aléatoire rapide qui soit commune à toutes les machines, avec une unité de temps, par exemple la microseconde.

Comme ça, quelque soit la bécane,
Rnd(500 [microsecondes]) ça sera toujours (au pif) 0.613

De telle sorte que des coupures temporaires ne neutralisent pas tout ton jeu.

Autre détail : Avoir un ensemble de données protégé de départ de jeu (date, heure, etc...) qui soit partagé et commun par et à tous les ordinateurs. Cet ensemble doit être crypté et bien protégé pour éviter qu'il ne servent à des fins malveillantes.

Voilà ce qui me semble devoir avoir dans un système réseau de base. Bon courage à toi.

Re: Base de données et visualisation

Publié : jeu. 28/oct./2021 20:30
par Ollivier
Tu vois par exemple, là, Youtube est en panne. Tous les deux ans en moyenne, ils doivent améliorer l'algo de génération pseudo-aléatoire qui se fait toper par un nerveux.

Re: Base de données et visualisation

Publié : jeu. 28/oct./2021 20:39
par Ollivier
Et là, c'est bon... Il est plus en panne...