BridgeView Till denna andra prototyp av programmet har klasserna byggts ut och fått en struktur som klarar av det enda användarfall, som hittills tagits upp. Förhoppning finns att nya användarfall inte ska leda till för stora ändringar. Eventuellt kan nya klasser tillkomma. Klasser i BridgeView Klassen Grafiska Gränssnittet Den centrala, men samtidigt just nu minsta klassen. GUI-klassen, innehåller just nu fyra datamedlemmar, i form av knappar och fem metoder, de två obligatoriska FormCreate och FormPaint samt tre händelser knapptryckningar. Denna klass kommer att byggas ut ordentligt med bland annat meny, flikar och flera knappar. TFORM = class(tform) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); Objektet från denna klass kommunicerar med objekt från klasserna TSPELET och TDATABASE. Objekt SPEL av klassen TSPEL och DATABAS från TDATABASE skapas härifrån, När namnet på indatafilen är bestämd meddelas DATABAS som efter sitt arbete returnerar en pekare till starten av den länkade listan av bridgebrickor. Både BUTTON1CLICK och BUTTON2CLICK anropar metoden STARTAGAIN hos objektet SPEL, som bygger upp en bridgebricka för visning. Metoden FormPaint lägger ut bilden BORDBILD, vars utseende skapats i SPEL. Metoden PLAYNEXTCARD i SPEL flyttar nästa kort från handen till mittet av bordet. Ingen av metoderna i denna klass har fler än tre kodrader. Klassen TSPELET Klassen TSPELET är för närvarande den största, med ett antal mer eller mindre intressanta datamedlemmar och metoder. De flesta datatyperna finns deklarerade i filen DEKLARATIONER. En del strukturer finns dock med i deklaration av klassen, men kommer senare att flyttas över för att få en mer logisk uppbyggnad. Klassen känner inte till vare sig TFORM1 eller TDATABASE och anropar inga metoder utanför sig själv. Däremot används, som sagt, ett antal element deklarerade i DEKLARATIONER. Håkan Strömberg 1 KTH Syd Haninge
TSpelet= Class(TObject) public giv:tgiv; bordbild:tbitmap; bordgrund:tbitmap; lek:array[spades..clubs,2..14] of TKort; filnamn:string; kb,kh:integer; Start,AktuellP:TPekare; Antal:integer; Aktuell:TBricka; ToBid:TPlayer; KortOrdning:array[1..52] of record Finns:boolean; Spelare:TPlayer; Farg:TFarg; Valor:integer; Hallare:array[1..4] of record Finns:boolean; Kort:TKort; x,y:integer; LaggOrdning:TOrdning; TabOrdning:TOrdning; AntalSpelade:integer; StickKlart:boolean; function NextPlayer(Next:TPlayer):TPlayer; function KortKonvertering(s:string;var f:tfarg;var v:integer):boolean; procedure SpelOrdning; procedure InitPlay(Won:TPlayer;var Ordning:TOrdning); procedure TomHallare; procedure Previous; procedure StartAgain; procedure PlayNextCard; procedure InitBid; procedure BidNextBid; procedure Mala; constructor create; destructor free; giv håller reda på aktuell giv. Varje spelare har en array med 52 element, som är TRUE eller FALSE beroende på om just det kortet finns på handen. bordbild På denna bitmap byggs skärmens utseende upp av metoden mala. Bilden hämtas sedan av GUI:ens paint och läggs ut på skärmen bordgrund På denna bitmap läggs alla fast element ut då objektet skapas. Bitmapen kopieras till bordbild inför varje ny skärmvisning. Håkan Strömberg 2 KTH Syd Haninge
lek Innehåller bilder på de 52 korten tillsammans med färg och valör. filnamn. Namnet på PBN-filen från vilken brickorna lästs in. Kommer troligtvis att flyttas kb,kh håller reda på kortets höjd och bredd. Start,AktuellP två pekare till element i listan av brickor. Start håller reda på listans första bricka och AktuellP på den som just nu visas på skärmen. Antal. Så många brickor finns det i listan Aktuell. Hit kopieras brickan från brickan i listan. Tanken är att man ska kunna editera den och spara den i i listan men också ändra sig och återgå till ursprunget. ToBid Den spelar som står i tur att bjuda. Denna rutin är ännu inte utvecklad. KortOrdning. Från play-matrisen i PBN-filen, byggs en max 52 element lång vektor upp i den ordning korten spelas. Denna datastruktur är en form av mellanlagring, som ska göra det snabbt (programmeringstekniskt) att spela upp korten och ta tillbaka. Varje element i vektor utgörs av en post som innehåller spelare samt kortets färg och valör. Hallare Håller reda på de kort som spelats ut till ett stick, var och i vilken ordning de ska presenteras någonstans mitt på skärmen. Strukturen töms då fyra kort, ett helt stick, har spelats. LaggOrdning En hjälpvariabel som underlättar för att bygga upp Kortordning TabOrdning En annan hjälpvariabel med samma uppgift som ovan. AntalSpelade Hur många kort som spelats hittills StickKlart Håller reda på om fyra kort spelats på och om sticket därmed är avslutat. function NextPlayer En hjälpmetod som kanske kommer att flyttas och buntas ihop med en del andra under DEKLARATIONER. Alltså utanför alla klasser. Något som inte är möjligt i till exempel JAVA. function KortKonvertering Tar emot en sträng med två tecken och packar upp den till färg och valör. Funktionen returnerar FALSE om uppackningen misslyckades. Egentligen ska alla tänkbara fel i PBN-filen upptäckas av DATABASE. procedure SpelOrdning Den mest komplicerade metoden så här långt, som bygger upp vektorn Kortordning från i stort sätt rådata i PBN-filen. Kanske ska även denna metod i framtiden finnas i DATBASE. procedure InitPlay. Initierar spelordningen iför varje stick. En typisk hjälpmetod. Utdata är en vektor med spelarna i den ordning de kommer att spela på under nästa stick. Det är den som vann senaste stick som avgör detta. procedure TomHallare Tömmer Hallare efter varje färdigspelat stick eller då man mitt i sticket går till nästa bricka. procedure StartAgain Kommer framöver att få namnet Next. Visar nästa bricka i listan. En huvudmetod som anropar många av de andra metoderna. procedure Previous Backar till föregående bricka procedure PlayNextCard Spelar nästa kort. Det är KortOrdning som levererar data. Metoden anropas av metod i GUI. procedure InitBid För att initiera budgivningsfasen. Ännu ej implmenterad. procedure BidNextBid Visar nästa bud. Ännu ej implementerad. Håkan Strömberg 3 KTH Syd Haninge
procedure Mala Metoden placerar ut korten på aktuella platser på bitmap bordbild. NärPaint i GUI exekveras kan den färdiga bilden hämtas ned. constructor create Metod som skapar ett objekt av denna klass, destructor free tar bort objektet och frigör minne. Den länkade listan berörs dock inte av detta och måste hanteras för sig (ännu ej implementerat). Klassen TDataBase Den här klassen känner inte till några andra klasser. Endast GUI känner till TDataBase och kommunicerar endast via en metod, Work. GUI skickar in ett filnamn och får tillbaka startpekaren till den lista som innehåller bridgebrickorna. Den länkade listan är uppbyggd av poster som deklarerats i DEKLARATIONER. Denna postdeklaration måste TSPELET känna till, men den ingår inte i klassen. Denna fil innehåller cirka 300 rader. Lite är planerat, men om den ska innehålla allt som visionen lovar kommer koden troligtvis inte att understiga 3000 rader. TDataBase=Class(TObject) public infil:textfile; filnamn:string; Start:TPekare; Antal:integer; function Work(fn:string;var S:TPekare):integer; procedure Open; procedure LasInAlla; constructor create; destructor free; infil En filvariabel behövs. filnamn Namnet på filen som ska öppnas. Finns alltså på två ställen. Det finns ingen anledning att ha den i TSPELET. Start. Pekare till listans början Antal. Antal brickor i listan function Work Metoden som delar ut arbetet till främst (fn:string;var S:TPekare):integer; procedure Open Enbart för att öppna filen procedure LasInAlla Det är denna metod som gör hela jobbet. Läser in rad för rad från filen, packar upp innehållet och placerar i listans poster. Just nu görs endast en rudimentär kontroll av indata. Om det finns logiska fel i PBN-filen, kommer detta knappast att upptäckas. Metoden är ändå på över 200 kodrader och bör kanske brytas ned i i mindre delar. constructor create Skapar ett objekt av denna klass. destructor free tar bort ett objekt av denna klass. Håkan Strömberg 4 KTH Syd Haninge
Deklarationer Här följer deklarationer av gemensamma datatyper, kortfärger, spelare, kort, händer. Dessutom Bricka, som utgör posten för för bridgebrickorna i den länkade listan. Allting där är inte helt logiskt genomfört. En del smärre förändringar av datatyper kommer att göras för att snygga upp. type TFarg=(SPADES,HEARTS,DIAMONDS,CLUBS,NOTRUMPH); TPlayer=(SOUTH,WEST,NORTH,EAST); TKort=record value:2..14; color:spades..clubs; bild:tbitmap; THand=array[SPADES..CLUBS,2..14] of boolean; TGiv=array[SOUTH..EAST] of THand; TPekare=^TBricka; TTabRad=array[1..4] of string[5]; TOrdning=array[1..4] of TPlayer; TBricka=record Event:string[255]; Site:string[255]; Date:string[255]; Board:integer; South:string[255]; West:string[255]; North:string[255]; East:string[255]; Dealer:TPlayer; Vulnerable:string[4]; Deal:array[SOUTH..EAST] of THand; Scoring:string[255]; Declarer:TPlayer; Contract:string[5]; Trumph:TFarg; AntalStick:integer; Result:integer; Auction:array[1..15] of TTabRad; Play:array[1..13] of TTabRad; Utspelare:TPlayer; Next:TPekare; Håkan Strömberg 5 KTH Syd Haninge