Das Richtige Gadget für ein Sudoku ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Das Richtige Gadget für ein Sudoku ?

Beitrag von GreyEnt »

Hallo NG,

hab mir ein Lösungsprogramm für Sudoku Karten geschrieben.
Allerding erstmal im Consolenmodus.
Nun steht die Windows Variante an.
Welches Gadget kann ich am besten für die einzelnen Felder nehmen?
Zum einen muß ich die Felder editieren können. Zum anderen wird der Inhalt der Felder berechnet und vom Programm beschrieben.
Ich gehe davon aus das ein 9er Sudoku ein Jeder kennt?
Wenn nicht kann ich auch die Consolenvariante mailen. Ist nur wieder riesig und undurchsichtig geworden :)

MfG
Dieter
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich würde dafür imagegadgets benutzen.
die zahlen würde ich vorab erzeugen.

"editieren" in dem sinne ist nicht nötig. es würde z.b. genügen,
wenn ein kästchen einen blinkenden rahmen bekommt, sobald man es anklickt,
und dann per zahlentasten/10er-tastatur eine zahl zugewiesen bekommen kann.

> ein Lösungsprogramm
achso... also gar kein spiel... hm..
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Hi Kaeru Gaman

Beitrag von GreyEnt »

schön von Dir zu hören.

<ich würde dafür imagegadgets benutzen.
<die zahlen würde ich vorab erzeugen.
das scheint mir der Richtige weg sein.
Ich erzeuge 81 freie magegadgets. Wenn ich es anklicke kann ich es bestimmen welches PIC es bekommt.
Also die magegadgets kann man immer wieder neu mit einem PIC belegen?

> ein Lösungsprogramm
<achso... also gar kein spiel... hm..
gute Frage. Zumindest kann man damit Karten erzeugen oder lösen oder auf plausiblität prüfen.
Oder richtig angeben. :) Wenn man eine Karte in 15sec. schaft.
_________________
<no comment....

warum no comment...?
gefällt Dir meine Idee nicht?

MfG
Dieter
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

du kannst den inhalt des imagegadgets sooft ändern wie du willst,
du kannst die neun images die du hast beliebig vielen gadgets zuweisen.

normal sollte ja jedes image auf 9 gadgets auftauchen,
aber du könntest auch fehlversuche zulassen, solange kein widerspruch mit bereits gelöstem entsteht...
aber das wäre wieder ne spiel-geschichte, hat nix mit der anzeige zu tun...

grundsätzlich ist es dem gadget egal, welches image es zugewiesen bekommt...

du musst nur beachten: wenn du den inhalt eines gadgets änderst,
brauchst du einen ereignisschleifendurchlauf, um die änderung wirksam werden zu lassen.

also, die änderung ist ein Event, und du brauchst ein (Wait)WindowEvent()
um dieses zu bearbeiten, währenddessen keine weitere änderung stattfindet.

(klingt jetzt etwas kompliziert, kann ich auch noch mal einfacher erklären)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Das Richtige Gadget für ein Sudoku
Benutze eine eigene Fensterklasse.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

hallo edel

was meinst Du mit einer eigenen Fensterklasse?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

sowas :

Code: Alles auswählen

    
  Macro _GET_X_LPARAM(lParam)
    (lParam & $FFFF)
  EndMacro
  
  Macro _GET_Y_LPARAM(lParam)
    ((lParam>>16) & $FFFF)
  EndMacro
  
  #CWM_SETDATA = #WM_USER + 1
  
  
  Procedure EditProc(hwnd,msg,wParam,lParam)
    id  = getprop_(hwnd,"PB_ID")   
    old = GetGadgetData(id)
    
    If msg = #WM_CHAR ; nur zahlen anzeigen lassen
      Select wParam
        Case '0' To '9'
        Default 
          ProcedureReturn 0
      EndSelect
    EndIf
    
    If msg = #WM_KEYUP
      If wParam = #VK_RETURN 
        x = GadgetX(id) / 30 
        y = GadgetY(id) / 30 
        HideGadget(id,1)
        SendMessage_(GetParent_(hwnd),#CWM_SETDATA,x,y)
        ProcedureReturn 0
      EndIf
    EndIf
    
    ProcedureReturn CallWindowProc_(old,hwnd,msg,wParam,lParam)
  EndProcedure
    
    
  Procedure CProc(hwnd,msg,wParam,lParam)
    Static Dim Array.s(8,8)
    Static edit
    
    If msg = #CWM_SETDATA
      Array(wParam,lParam) = GetGadgetText(edit)
      InvalidateRect_(hwnd,0,0)
    EndIf
    
    If msg = #WM_CREATE
      
      CreateGadgetList(hwnd)
      edit = StringGadget(#PB_Any,0,0,0,0,"") 
      old  = SetWindowLong_(GadgetID(edit),#GWL_WNDPROC,@EditProc()) 
      SetGadgetData(edit,old) 
      HideGadget(edit,1)
    EndIf
    
    If msg = #WM_PAINT
      
      hdc = beginpaint_(hwnd,ps.PAINTSTRUCT)
      
      pen  =  CreatePen_(#PS_SOLID,1,GetSysColor_(#COLOR_BTNSHADOW)) 
      
      SelectObject_(hdc,pen)
      
      For y = 1 To 9 
        For x = 1 To 9
          
          MoveToEx_(hdc,x*30,0,#Null)
          LineTo_(hdc,x*30,270)
          
          MoveToEx_(hdc,0,y*30,#Null)
          LineTo_(hdc,270,y*30)
          
          x1 = x-1
          y1 = y-1
          text.s = Array(x1,y1)
          
          If text 
            
            rect.RECT
            
            rect\left   = x1*30
            rect\top    = y1*30 
            rect\right  = 30 + rect\left 
            rect\bottom = 30 + rect\top

            SetBkMode_(hdc,#TRANSPARENT)
            DrawText_(hdc,text,Len(text),@rect,#DT_CENTER|#DT_VCENTER|#DT_SINGLELINE) 
            
            rect\left   + 2
            rect\top    + 2
            rect\right  - 1
            rect\bottom - 1
            
            DrawEdge_(hdc,rect,#BDR_RAISEDINNER,#EDGE_RAISED|#EDGE_ETCHED|#EDGE_BUMP)      
            
          EndIf
         
        Next 
      Next
    
      deleteobject_(pen)
      
      endpaint_(hwnd,ps)  
      
    EndIf
    
    If msg = #WM_LBUTTONDOWN
      x = _GET_X_LPARAM(lParam) / 30 
      y = _GET_Y_LPARAM(lParam) / 30 
      
      SetGadgetText(edit,Array(x,y))
      HideGadget(edit,0)
      SetActiveGadget(edit)
      ResizeGadget(edit,x*30,y*30,30,30)
      
    EndIf
    
    ProcedureReturn DefWindowProc_(hwnd,msg,wParam,lParam)
  EndProcedure
  
  Procedure RegisterWin()
    Protected wndC.WNDCLASS 
    
    wndC\style          = #CS_VREDRAW | #CS_HREDRAW
    wndC\lpfnWndProc    = @CProc()
    wndC\hInstance      = GetModuleHandle_(0)
    wndC\hCursor        = LoadCursor_(0, #IDC_ARROW)
    wndC\hbrBackground  = GetSysColorBrush_(#COLOR_BTNFACE)
    wndC\lpszClassName  = @"FENSTERKLASSE" 
  
    ProcedureReturn RegisterClass_(@wndC) 
  EndProcedure
  
  
  ;// TEST
  
  RegisterWin()
  
  hwnd = OpenWindow(0,0,0,500,400,"")
  
  CreateWindowEx_(#WS_EX_STATICEDGE,"FENSTERKLASSE","",#WS_CHILD|#WS_VISIBLE,10,10,272,272,hwnd,0,0,0)
  
  Repeat
    event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow

Das ist jetzt nur auf die schnelle gemacht, wenn du damit nicht
klar kommst, kann ich es morgen noch mal sauber schreiben. :D
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

Hallo edel,

danke für deine Hilfe.

Ich verstehe leider keine Zeile von deinem Programm. :)
Das ist mehr ein Problem meinerseits. )
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

Wo lernt man denn so zu programmieren?
gibt es ein Lehrbuch von dem ich nichts weiß?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Antworten