Memory Spiel

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
yoda
Moderator
Beiträge: 441
Registriert: Mo 2. Jan 2006, 22:35
Wohnort: bei Göttinge
Kontaktdaten:

Memory Spiel

Beitrag von yoda » Di 1. Jan 2008, 23:07

Moin,

ich will ein Memory spiel erstellen. Geht das mit einem GridView ?
Der einfachheit will ich erst mal nur Textfelder machen.

Wie mache ich die auswertung der Mausklicks ?

mfg Yoda

gaupe
Foriker
Beiträge: 9
Registriert: Mo 31. Dez 2007, 18:53
Kontaktdaten:

Beitrag von gaupe » Mi 2. Jan 2008, 01:40

das ist mal eine ser offene frage wobei mann raten muss wass du meinst
(oder es ist mein schlechtes deutsch....)

was fur ein memory spiel wie seht das dan aus?

mousclicks gehen auf kolumns und da gibts event routiner


sehe http://www.gambasdoc.org/help/comp/gb.qt/gridview?de

gridview.column und row geben das field
event routine mousedown kanst du vielleicht benuzten um zu wissen ob der
maus innerhalb das control benutzt ist

gaupe
Foriker
Beiträge: 9
Registriert: Mo 31. Dez 2007, 18:53
Kontaktdaten:

Beitrag von gaupe » Mi 2. Jan 2008, 01:48

eine einfache gridview mit bilder

kann vielleicht etwas helfen.
dus sollst ein form darstellen mit ein gridview
den muss den namen gridviewtable haben
un dan die code unten benutzen

bracht sqlite in hier aber kann mit einen array auch.
(hab ich selbst aber keine erfarung mitt)

Code: Alles auswählen

' Gambas class file

PUBLIC SUB _new()

END

PUBLIC DBcon AS NEW Connection
PUBLIC resultData AS Result

PUBLIC SUB Form_Open()
DIM DBfilename AS String
DIM DBpath AS String = user.home
DIM i AS Integer
DIM errorMessageHeader AS String
 
 ME.center
  'DB.Debug = TRUE   
  DBfilename = "testdb"
  
  ' Open a connection (to the database server only)
  DBcon.Type = "sqlite"
  DBcon.Host = DBpath

  TRY DBcon.Open()
  IF ERROR THEN
    errorMessageHeader = "Could not open database connection " & DBpath
    Error.Raise(Error.Text)
  END IF

  ' Check if DBfilename exists and is a valid sqlite database. 
  IF NOT DBcon.Databases.Exist(DBfilename)
    DBcon.Databases.Add(DBfilename)
    WAIT 0.5 'apperently this is needed for an SQLite database
    ' Close the server connection
    DBcon.Close()

    ' Open a connection to the database
    DBcon.Host = DBpath
    DBcon.Name = DBfilename
    TRY DBcon.Open()
    IF ERROR THEN
      errorMessageHeader = "Could not open database " & DBfilename & " on " & DBpath
      Error.Raise(Error.Text)
    END IF
    resultdata = DBcon.Exec("CREATE TABLE 'table1'( 'key' INTEGER PRIMARY KEY AUTOINCREMENT, 'afield' VARCHAR(10), 'bfield' VARCHAR(10), 'cfield' varchar(10), 'dfield' BLOB ,'efield' DATETIME);")
    FOR i = 1 TO 10
      DBcon.Exec("INSERT INTO 'table1' VALUES (&1, &2, &3, &4, &5, &6);", NULL, "one", "giraffe", "shark", NULL, Now())
      DBcon.Exec("INSERT INTO 'table1' VALUES (&1, &2, &3, &4, &5, &6);", NULL, "two", "elephant", "napoleon", NULL, Now())
      DBcon.Exec("INSERT INTO 'table1' VALUES (&1, &2, &3, &4, &5, &6);", NULL, "three", "tiger", "trigger", NULL, Now())
      DBcon.Exec("INSERT INTO 'table1' VALUES (&1, &2, &3, &4, &5, &6 );", NULL, "four", "ape", "surgeon", NULL, Now())
      DBcon.Exec("INSERT INTO 'table1' VALUES (&1, &2, &3, &4, &5, &6);", NULL, "five", "wildebeast", "parrot", NULL, Now())
     
    NEXT    
    setanicon()
   ' loadicon()
  ENDIF
  dbcon.Close()
  dbcon.Host = DBpath
  dbcon.name = DBfilename
  dbcon.open()
  db.Debug = TRUE
  resultData = DBcon.Exec("SELECT * from table1 ;")

END





' the routine run when the gridvietable gets focus 
PUBLIC SUB GridViewTable_GotFocus()
DIM c AS Integer

  ' Set the number of GridView columns
  GridViewTable.Header = TRUE
  GridViewTable.Columns.Count = resultData.Fields.Count 

  ' Fill in column headers from field names
  FOR c = 0 TO resultData.Fields.Count - 1
    GridViewTable.Columns[c].Text = resultData.Fields[c].Name
  NEXT 
  
  GridViewTable.Columns[4].width = 25

  ' Set the number of data rows
  GridViewTable.Rows.Count = resultData.Count
END



' The Data event routine this routine is run evrytime the gridview needs data
PUBLIC SUB GridViewTable_Data(Row AS Integer, Column AS Integer)
  resultData.MoveTo(row)

  ' check if the field is an object in that case suspect it is a picture and get the picture
   IF IsObject(resultdata[column])
    GridViewTable.Data.picture = ShowIcon(resultdata[column])
  ELSE
    GridViewTable.Data.Text = resultdata[column]
  ENDIF

  ' Here the current row is given a color yellow while the rest stays white
  IF GridViewTable.Row = Row THEN 
    GridViewTable.Data.BackColor = Color.Yellow
  ELSE 
    GridViewTable.Data.BackColor = Color.White
  END IF
END

' The routine change which is run on the event that the row or column is changed from position in the gridview
' A refresh of the previous row and the current row is done to get the color select bar coming with for the whole row
PRIVATE lastRow AS Integer
PUBLIC SUB GridViewTable_Change()
  DIM c AS Integer
  IF GridViewTable.Rows.Count < 1 THEN RETURN 
  FOR c = 0 TO GridViewTable.Columns.Count - 1
    GridViewTable[lastRow, c].Refresh()
    GridViewTable[GridViewTable.row, c].Refresh()
  NEXT 
  lastRow = GridViewTable.row
END


PUBLIC SUB Form_Close()
  ' Make sure we close the database connection
  ' We use TRY so if there is an error we still
  ' quit the application
  TRY dbcon.Close()
END

' routine running on event of clicking on a column header i change the sort order here 
' notice one can sort on pictures! havent figured out the order it does it by yet... probably by picturestring
PUBLIC SUB GridViewTable_ColumnClick(column AS Integer)
  IF column = 0 THEN resultdata = dbcon.Exec("SELECT * FROM table1 ORDER BY key;")
  IF column = 1 THEN resultdata = dbcon.Exec("SELECT * FROM table1 ORDER BY afield;")
  IF column = 2 THEN resultdata = dbcon.Exec("SELECT * FROM table1 ORDER BY bfield;")
  IF column = 3 THEN resultdata = dbcon.Exec("SELECT * FROM table1 ORDER BY cfield;")
  IF column = 4 THEN resultdata = dbcon.Exec("SELECT * FROM table1 ORDER BY dfield;")
  IF column = 5 THEN resultdata = dbcon.Exec("SELECT * FROM table1 ORDER BY efield;")
    
  GridViewTable.Refresh()
END


' scroll further or back through the records on mousewheel
PUBLIC SUB GridViewTable_MouseWheel()
  DIM i AS Integer = GridViewTable.row
  I = I - (9 * mouse.delta)  
  IF I < 0 THEN I = 0
  IF I > GridViewTable.Rows.count THEN I = GridViewTable.Rows.count - 1     
  GridViewTable.row = I   
END



' Routine for preloading the pictures in the database
PUBLIC SUB loadicon()
  DIM I, J AS Integer
  DIM filename AS String
  DIM SymbolFiles AS NEW String[]
  SymbolFiles = Dir("/home/hennie/GambaProjects/databaseopen/WaypointSymbols", "*.bmp")
db.debug = TRUE
  resultdata = dbcon.Edit("table1")
  j = 0
  FOR I = 0 TO resultData.Count - 1
     resultData.MoveTo(I)
     IF (j > SymbolFiles.Length - 1) THEN J = 0
     resultData["dfield"] = file.Load("/home/hennie/GambaProjects/databaseopen/WaypointSymbols/" & SymbolFiles[j])
     resultData.Update()
     INC J
  NEXT
  db.debug = FALSE
 ' dbcon.Exec("UPDATE 'table1' SET 'efield' = quote(&1) ;", file.Load("/home/hennie/Pictures/GCTraditional.jpg"))
END


' function for retrieving a picture from a blob field in the database and returning it as a picture
PRIVATE FUNCTION ShowIcon(fval AS Variant) AS picture
  DIM tempFile AS String
  DIM tempPicture AS String
  DIM pic AS Picture
  tempFile = Temp() & ".jpg"
  IF fval.length > 10
    tempPicture = fval.Data
    File.Save(tempFile, tempPicture)
    pic = picture.Load(tempFile)
    RETURN pic
    KILL tempFile
  ENDIF
 END
 
 PRIVATE SUB setanicon()
  DIM query AS String
 
  query = "BEGIN TRANSACTION; "
  query &= "UPDATE \"table1\" set dfield = "
  query &= "X'FFD8FFE000104A46494600010101004800480000FFE100164578696600004D4D002A0000000800"
  query &= "0000000000FFDB0043000503040404030504040405050506070C08070707070F0B0B090C110F1212"
  query &= "110F111113161C1713141A1511111821181A1D1D1F1F1F13172224221E241C1E1F1EFFDB00430105"
  query &= "05050706070E08080E1E1411141E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E"
  query &= "1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EFFC0001108001000100301220002110103"
  query &= "1101FFC400160001010100000000000000000000000000040506FFC4002210000202030001050101"
  query &= "00000000000000010203110405061200132231322171FFC400140101000000000000000000000000"
  query &= "00000007FFC400221100020101080300000000000000000000010211710003040506136181212231"
  query &= "FFDA000C03010002110311003F00C6656CF1E20442F0CD22B7895F7D1003641049342A8FF86AEAFD"
  query &= "3F4FA0ED76FCCBF4F89AC863D16388E5973E58D963C88D9956A0F220B9B3FA16A3C4FEBF97639F6E"
  query &= "135FA1CA19FC58D8F4134792ABB09735CC4AF27B811C406D0155751F5F681C53127D37BCEE7A1ECF"
  query &= "304BB7CA0B8C8DE50E1C36B0446AAC2D9B6A27E4493F2205035E92D53506371F2CDB776A7E78889E"
  query &= "CB1239029366355D4F98665EC76AE94D0100F65891CC5245BFFFD9'; "
 
  query &= "COMMIT;"
  db.debug = TRUE
  dbcon.Exec(query)
 END


yoda
Moderator
Beiträge: 441
Registriert: Mo 2. Jan 2006, 22:35
Wohnort: bei Göttinge
Kontaktdaten:

Beitrag von yoda » Mi 2. Jan 2008, 12:51

Hi,

also ich habe mir bislang folgendes gebastelt.

Code: Alles auswählen

PUBLIC SUB Form_Open()
 DIM bild AS Picture
 DIM i AS Integer
 DIM ii AS Integer
 
  ME.Center()
  felder = ["qsk", "qrb", "qrg", "qrh", "qri", "qrk", "qrl", "qrm", "qrn", "qro", "qrp", "qrq", "qrs", "qrt", "qru", "qrv", "qrx", "qsa", "qsb", "qsk", "qsd", "qsl", "qso", "qsv", "qsy", "qth", "qtr", "abt", "afsk", "agc", "agn", "alc", "atv", "avc", "award", "awdh", "bcnu", "bfo", "bpm", "bug", "cfm", "conds", "condx", "congrats", "cpi", "cuagn", "cul", "dwn", "elbug", "ere", "vy", "wtts", "wx", "xcus", "xmas", "tnx", "sure", "rig", "pse", "my", "name", "73", "ant"]
TextBox1.Text = felder.Max
bild = NEW Picture
bild = Picture["karte.png"]

   ModuleMorseCode.Play("morse memory")
  GridView1.Columns.Count = 8
  GridView1.Rows.Count = 8
  GridView1.Columns.Width = 72
  GridView1.Rows[0].Height = 72 
  GridView1.Rows[1].Height = 72 
  GridView1.Rows[2].Height = 72 
  GridView1.Rows[3].Height = 72 
  GridView1.Rows[4].Height = 72 
  GridView1.Rows[5].Height = 72 
  GridView1.Rows[6].Height = 72 
  GridView1.Rows[7].Height = 72 
  
  FOR i = 0 TO 7
    FOR ii = 0 TO 7
     GridView1[i, ii].Picture = bild
    NEXT 
  NEXT 
END




PUBLIC SUB Menu2_Click()

ME.Close  

END

PUBLIC SUB Button1_Click() ' Karten mischen

  

END
nach dem Programmstart wird das Gridview aufgebaut und die Felder mit einem Bild gefüllt.
Damit ist das Spiel Startbereit.
in dem Aray felder liegen karten.
Diese karten möchte ich nun in das Gridview einlesen. Sie werden dann angezeigt wenn in ein Feld mit der Maus geklickt wurde.
Wenn ich z.B. in einem Feld klicke und unter dem Bild ist qsk wird es angezeigt wen der 2. klick auch die karte qsk beinhaltet übergebe ich das Wotz qsk an eine Morseroutine mit

ModuleMorseCode.Play("qsk")

Meine Schwirigkeiten sind nun die karten zu mischen und in das GridView einzulesen.
Wie ermittele ich wo geklicket wurde ?

mfg Yoda

gaupe
Foriker
Beiträge: 9
Registriert: Mo 31. Dez 2007, 18:53
Kontaktdaten:

Beitrag von gaupe » Mi 2. Jan 2008, 12:58

das wird eine event routine sein

Code: Alles auswählen

PUBLIC SUB GridView1_Click()

  PRINT GridView1.Row
  PRINT GridView1.Column

END

yoda
Moderator
Beiträge: 441
Registriert: Mo 2. Jan 2006, 22:35
Wohnort: bei Göttinge
Kontaktdaten:

Beitrag von yoda » Do 3. Jan 2008, 23:11

Hi,

danke das ist ja simpel. Nun kämpfe ich wieder.
Ich habe bilder im gridview. nun will ich ein Bild Löschen und Text reinschreiben.

GridView1[tempX1, tempY1].Picture = FALSE
funktioniert leider nicht und wenn ich einfach einen Text mit

GridView1[tempX1, tempY1].Text = spielKarte[GridView1.Row, GridView1.Column]

dann ist er nicht sichtbar

mfg Dirk

gaupe
Foriker
Beiträge: 9
Registriert: Mo 31. Dez 2007, 18:53
Kontaktdaten:

Beitrag von gaupe » Do 3. Jan 2008, 23:47

hmm mal aus dem memory
etwas mit picture.flush()

versuchs mal

yoda
Moderator
Beiträge: 441
Registriert: Mo 2. Jan 2006, 22:35
Wohnort: bei Göttinge
Kontaktdaten:

Beitrag von yoda » Fr 4. Jan 2008, 03:00

Hi,

leider hat es nicht funktioniert :(

mfg Dirk

gaupe
Foriker
Beiträge: 9
Registriert: Mo 31. Dez 2007, 18:53
Kontaktdaten:

Beitrag von gaupe » Fr 4. Jan 2008, 12:03

oke dann mal die code ausprobiert....

das hierunter wirkt bei mir

Code: Alles auswählen

PUBLIC SUB GridView1_Click()
  gridview1[gridview1.row, gridview1.Column].Picture = NULL
  gridview1[gridview1.row, gridview1.Column].text = "Les mich"
  gridview1[gridview1.row, gridview1.Column].Refresh()
END

yoda
Moderator
Beiträge: 441
Registriert: Mo 2. Jan 2006, 22:35
Wohnort: bei Göttinge
Kontaktdaten:

Beitrag von yoda » So 6. Jan 2008, 19:36

Hi,

danke das funzt jetzt auch bei mir.
Ich fummele aber schon den ganzen Tag an der Klickauswertung rum.
Ich hatte mir das einfacher vorgestellt.

mfg Dirk

Antworten

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast