ô Pairs 0.10 31-May-2005 ô (C) Jon Ripley 2005 : î … ò_Err ò_Init : î … ò_Err : *î  ò_Mouse(@msg%,@wparam%,@lparam%):ø (î ò_Sys(@msg%,@wparam%,@lparam%):ø : òNewGame õ ç showtime% € ‘>showtime% Œ ã i%=0 ¸ 51 -ç state%(i%)=2 state%(i%)=1:òDrawCard(i%) í showtime%=0:showing%=0 Í  "Sleep",100 ý £ ô Finish using the DLL òcdtTerm à : Ý ò_Err ç Ÿ=17 á ê r% i "MessageBox",@hwnd%,"Internal error ("+ö$+":"+Þ+"). Quit program ?","An error has occured",52 ¸ r% cdtTerm%=cdtTerm% ç r%=6 Œ ç cdtTerm% òcdtTerm  Í á : Ý ò_Init *Esc Off ‡ : ô Set window size #V% = 0:W% = 0:X% = 952:Y% = 472 ) "AdjustWindowRect", ^V%, &CF0000, 0 6 "SetWindowPos", @hwnd%, 0, 0, 0, X%-V%, Y%-W%, 6 ï 26 : $ "SetWindowText",@hwnd%,"Pairs" : ! "CreatePopupMenu" ¸ m_file% , "AppendMenu",m_file%,0,100,"&New Game" & "AppendMenu",m_file%,2048,101,"" ( "AppendMenu",m_file%,0,102,"&Hint" * "AppendMenu",m_file%,0,103,"&Resign" & "AppendMenu",m_file%,2048,104,"" ( "AppendMenu",m_file%,0,105,"E&xit" : $ "CreatePopupMenu" ¸ m_options% - "AppendMenu",m_options%,0,300,"Deck &1" - "AppendMenu",m_options%,0,301,"Deck &2" - "AppendMenu",m_options%,0,302,"Deck &3" - "AppendMenu",m_options%,0,303,"Deck &4" - "AppendMenu",m_options%,0,304,"Deck &5" - "AppendMenu",m_options%,0,305,"Deck &6" - "AppendMenu",m_options%,0,306,"Deck &7" - "AppendMenu",m_options%,0,307,"Deck &8" - "AppendMenu",m_options%,0,308,"Deck &9" - "AppendMenu",m_options%,0,309,"Deck 10" - "AppendMenu",m_options%,0,310,"Deck 11" - "AppendMenu",m_options%,0,311,"Deck 12" : ! "CreatePopupMenu" ¸ m_help% 9 "AppendMenu",m_help%,0,400,"&About this program..." :  "CreateMenu" ¸ m_main% - "AppendMenu",m_main%,16,m_file%,"&Game" 3 "AppendMenu",m_main%,16,m_options%,"&Options" - "AppendMenu",m_main%,16,m_help%,"&Help"  "SetMenu",@hwnd%,m_main%  "DrawMenuBar",@hwnd% :  "CardLib.bbc" : ô Setup òcdtInit : ô Turn off screen update òcdtRedraw(£) : ô Create a deck of cards Þ deck%(51):Þ state%(51) : ô Misc back%=cdFaceDownFirst ? "CheckMenuItem", m_options%, back%+300-cdFaceDownFirst, 8 showtime%=0 showing%=0 board%=&FFFFFF resigned%=£ hints%=0 á : #Ý ò_Mouse(msg%,wparam%,lparam%) ê wlo%,whi%,llo%,lhi%,x%,y% 1whi%=wparam%>>16 € &FFFF:wlo%=wparam% € &FFFF 1lhi%=lparam%>>16 € &FFFF:llo%=lparam% € &FFFF : 4ç msg%=513 € wlo%=1 € showing%<2 € ¬ resigned% Œ )ô Convert mouse coords to grid coords x%=(llo%-2)/(cdtWidth%+2) y%=(lhi%-2)/(cdtHeight%+2) : +ô Is selection within the playing field $ç x%=>0 € x%<13 € y%=>0 € y%<4 Œ ô Flip card ç state%(¤GtoCd(x%,y%))=1 Œ 'state%(¤GtoCd(x%,y%))=2:showing%+=1 Í ô Update display òDrawCard(¤GtoCd(x%,y%)) (ô If showing two cards set the timer +ç showing%=2 òCheckPair:showtime%=‘+100 Í Í á : !Ý ò_Sys(msg%,wparam%,lparam%) ê wlo%,whi%,llo%,lhi% 1whi%=wparam%>>16 € &FFFF:wlo%=wparam% € &FFFF 1lhi%=lparam%>>16 € &FFFF:llo%=lparam% € &FFFF È msg% Ê É 273 È wparam% Ê É 100:ô m_file% > &New Game òNewGame É 102:ô m_file% > &Hint òHint É 103:ô m_file% > &Resign òResign É 105:ô m_file% > E&xit  ,É 400:ô m_help% > &About this program... v "MessageBox",@hwnd%,"Pairs vsn 0.10"+½13+"31-May-2005"+½13+"(C) Jon Ripley 2005","About this program...",64 ¸ r% Ë Ë : ô Handle Options menu #ç wparam%>=300 € wparam%<=311 Œ ? "CheckMenuItem", m_options%, back%+300-cdFaceDownFirst, 0 %back%=wparam%-300+cdFaceDownFirst - "CheckMenuItem", m_options%, wparam%, 8 òDraw Í á : ô Shuffle deck of cards Ý òShuffle(ø deck%()) ê i%,j%,k% +ã i%=0 ¸ 51:deck%(i%)=i%:state%(i%)=1:í ã i%=0 ¸ 8+³(16) ã j%=0 ¸ 51 k%=³(52)-1  deck%(k%),deck%(j%) í í á : ô Draw entire playing field Ý òDraw ê suit%,rank% ã suit%=0 ¸ 3 ã rank%=0 ¸ 12 #È state%(¤GtoCd(rank%,suit%)) Ê É 0: CòcdtDraw(@memhdc%,¤ConvW(rank%),¤ConvH(suit%),0,mdGhost,board%) É 1: EòcdtDraw(@memhdc%,¤ConvW(rank%),¤ConvH(suit%),back%,mdFaceDown,0) É 2: XòcdtDraw(@memhdc%,¤ConvW(rank%),¤ConvH(suit%),deck%(¤GtoCd(rank%,suit%)),mdFaceUp,0) Ë í í : (ô Redraw the screen to display cards 1òcdtRedrawArea(0,0,14*cdtWidth%,5*cdtHeight%) : òDrawScore á : ô Display the score Ý òDrawScore "ñ Š2,27)"Score: ";score%;‰(20) "ñ Š2,28)"Turns: ";turns%;‰(20) á : ô Redraw an individual card Ý òDrawCard(card%) ê rank%,suit% : "rank%=card%>>2:suit%=card% € 3 : È state%(card%) Ê É 0: CòcdtDraw(@memhdc%,¤ConvW(rank%),¤ConvH(suit%),0,mdGhost,board%) É 1: EòcdtDraw(@memhdc%,¤ConvW(rank%),¤ConvH(suit%),back%,mdFaceDown,0) É 2: JòcdtDraw(@memhdc%,¤ConvW(rank%),¤ConvH(suit%),deck%(card%),mdFaceUp,0) Ë DòcdtRedrawArea(¤ConvW(rank%),¤ConvH(suit%),cdtWidth%,cdtHeight%) á : ô Grid conversion functions Ý ¤ConvW(num%) =2+(cdtWidth%*num%)+(2*num%) : Ý ¤ConvH(num%) !=2+(cdtHeight%*num%)+(2*num%) : Ý ¤GtoCd(x%,y%) =y%+(x%<<2) : ô Setup new game Ý òNewGame ê tmp% ô Set random number seed tmp%=³(-‘) òShuffle(deck%()) *score%=0:turns%=0:resigned%=0:hints%=0 $ "EnableMenuItem",m_file%,102,0 òDraw á : %ô Check for user revealing a pair Ý òCheckPair ê c1%,c2%,i%,c% ô Find flipped cards ã i%=0 ¸ 51 ç state%(i%)=2 Œ ç c% Œ c2%=i% ‹ c1%=i%:c%=¹ Í Í í : 3ô If a pair then remove carads and update score 9ç ¤cdtRaFromCd(deck%(c1%))=¤cdtRaFromCd(deck%(c2%)) Œ score%+=2 state%(c1%)=0 state%(c2%)=0 òDrawCard(c1%) òDrawCard(c2%) Í !ô Update turn count and score turns%+=1 òDrawScore á : ô Resign from game Ý òResign ê i% ã i%=0 ¸ 51 ç state%(i%)=1 state%(i%)=2 resigned%=¹ í òDraw á : ô Display a hint Ý òHint õ card%=³(52)-1 ý state%(card%)=1 i%=0:card2%=-1 õ Nç i%<>card% € ¤cdtRaFromCd(deck%(i%))=¤cdtRaFromCd(deck%(card%)) card2%=i% i%+=1 ý card2%<>-1 „ i%=52 $state%(card%)=2:state%(card2%)=2 &òDrawCard(card%):òDrawCard(card2%) T%=‘:õý‘-T%>10 $state%(card%)=1:state%(card2%)=1 &òDrawCard(card%):òDrawCard(card2%) score%-=3:òDrawScore hints%+=1 /ç hints%=3 "EnableMenuItem",m_file%,102,1 á ÿÿ