モジュール変数を使いまくった七並べ。コルーチン、オーバーロードなども実装で使用。AIは全て出せる手の中から乱数で決める適当なものになっている。
モジュール変数を使いまくった七並べ。コルーチン、オーバーロードなども実装で使用。AIは全て出せる手の中から乱数で決める適当なものになっている。
#runtime "hsp3cl"#cmpopt varinit 1;トランプカードモジュールsuitStrs@TrumpCard="▲","▼","◆","■","JO"powerStrs@TrumpCard="A","2","3","4","5","6","7","8","9","10","J","Q","K","KR"#module TrumpCard name,suit,power#modcfunc tcNamereturn name#modcfunc tcPowerreturn power#modcfunc tcSuitreturn suit#define news(%1,%2,%3) newmod %1,TrumpCard,%2,%3#modinit int _suit,int _powername=suitStrs(_suit)+powerStrs(_power)power=_powersuit=_suitreturn#global;トランプの束モジュール#module TrumpDeck co,i,deck,count,hash#modcfunc tdCountreturn count#define new(%1) dimtype %1,5:newmod %1,TrumpDeck#modinitrandomize#define deckDefine \suits= \0,0,0,0,0, 0,0,0,0,0, 0,0,0, \1,1,1,1,1, 1,1,1,1,1, 1,1,1, \2,2,2,2,2, 2,2,2,2,2, 2,2,2, \3,3,3,3,3, 3,3,3,3,3, 3,3,3 \/*,4,4*/ :\powers= \0,1,2,3,4,5, 6,7,8,9,10, 11,12, \0,1,2,3,4,5, 6,7,8,9,10, 11,12, \0,1,2,3,4,5, 6,7,8,9,10, 11,12, \0,1,2,3,4,5, 6,7,8,9,10, 11,12 \/*,13,13*/deckDefineforeach suitsnews@TrumpCard deck,suits(cnt),powers(cnt)hash(cnt)=cntloopcount=length(deck)newlab co,1:returngosub*trumpIterreturn#modfunc tdShuffleforeach deckr=rnd(count)tmp=hash(cnt)hash(cnt)=hash(r)hash(r)=tmploopreturn*trumpIterfor i,0,length(suits)_card=deck(hash(i))newlab co,1:returnnextreturn#modfunc local tdNext var cardgosub cocard=_cardreturn#define global tdNext(%1,%2) dimtype %2,5:tdNext@TrumpDeck %1,%2#global;プレイヤーモジュール#module Player deck,cardCnt,pass,isGameOut,name,selectCardFn#modcfunc plNamereturn name#modcfunc plCardCntreturn cardCnt#modcfunc plPassreturn pass#modfunc plRefDeck array _deckif cardCnt!=0 {dimtype _deck,5,cardCntrepeat cardCnt_deck(cnt)=deck(cnt)loop}else: dim _deckreturn#define news(%1,%2) newmod %1,Player,%2#modinit str _namesuper@Player thismod,_nameselectCardFn=*selectCardreturn#modfunc local super str _namename=_namecardCnt=0pass=3isGameOut=1return#modfunc plSortDeckrepeat cardCnti=cntrepeat cardCnt-in=i+cnt#define ctype sortValue(%1) tcSuit(deck(%1))*13+tcPower(deck(%1))if sortValue(n)<sortValue(i) {tmp=deck(i)deck(i)=deck(n)deck(n)=tmp}looploopreturn#modfunc plAddCard var carddeck(cardCnt)=cardcardCnt++return#modfunc plRemoveCard str cardNamerepeat cardCntif tcName(deck.cnt)=cardName {delID=cntrepeat cardCnt-delID-1deck(delID+cnt)=deck(delID+cnt+1)loopcardCnt--break}loopreturn#modcfunc plExistCard str cardNameexistCard=-1repeat cardCntif tcName(deck.cnt)=cardName {existCard=cntbreak}loopreturn existCard#modfunc plUsePasspass--return#modfunc plGameOutisGameOut=0return#uselib "crtdll"#cfunc getch "_getch"#cfunc kbhit "_kbhit";カーソルの移動#defcfunc local move int _ch,int _csl,int maxcsl=_cslif _ch=$4b :csl-- ;左if _ch=$4d :csl++ ;右if csl<0 :csl=0if max-1<csl :csl=max-1return csl;カーソルの表示#deffunc local cursolShow array items,int _csldim slct,length(items)slct(_csl)=1s=""foreach itemsif slct(cnt): s+=strf("[%s]",items(cnt)): else: s+=strf("%s",items(cnt))loopmes strf("%s\r",s),1return#modfunc plSelectCard var _field,int _indexfield=_field:index=_indexgosub selectCardFnreturn*selectCardif 1!isGameOut: returnif 1!svCheckPlayNext(field,thismod) {svGameOver field,thismod,indexsvView fieldmes name+" GameOver...\n"return}mes strf("【%s】Cards: %d Pass: %d",name,cardCnt,pass)sdim itemsrepeat cardCntitems(cnt)=tcName(deck.cnt)loopif 0<pass: items(cardCnt)="PS:"+passwhile 1cursol=0cursolShow@Player items,cursolrepeatif kbhit() {ch=getch()if ch=$0d {mes ""break}if ch=$e0 {cursol=move@Player(getch(),cursol,length(items))cursolShow@Player items,cursol}}loopif 0<pass & length(items)-1=cursol {pass--svView fieldmes strf("残りパスは%d回です。\n",pass)_break}else:if svTryUseCard(field,thismod,deck(cursol)) {svView fieldmes strf("俺の切り札!! >「%s」\n",items(cursol))if cardCnt=0 {mes name+" Congratulations!!\n"svGameClear field,thismod,index}_break}else {mes "そのカードは出せないのじゃ…\n"_continue}wendreturn#global;AIプレイヤーモジュール#module AIPlayer deck,cardCnt,pass,isGameOut,name,selectCardFn#define ctype pl(%1) %1@Player#define field field@Player#define index index@Player#define news(%1,%2) newmod %1,AIPlayer,%2#modinit str _namesuper@Player thismod,_nameselectCardFn=*selectCardreturn*selectCardif 1!pl(isGameOut): returnif 1!svCheckPlayNext(field,thismod) {svGameOver field,thismod,indexsvView fieldmes pl(name)+"> もうだめ...\n"return}mes strf("【%s】Cards: %d Pass: %d",pl(name),pl(cardCnt),pl(pass))sdim itemsrepeat pl(cardCnt)items(cnt)=tcName(pl(deck).cnt)loopif 0<pl(pass): items(pl(cardCnt))="PS:"+pl(pass)mes "考え中...\r",1wait 100passCharge=0while 1cursol=rnd(length(items))if 0<pl(pass) & length(items)-1=cursol {if passCharge<5 {passCharge++_continue}pl(pass)--mes strf("パスー (残り%d回)\n",pl(pass))_break}else:if svTryUseCard(field,thismod,pl(deck).cursol) {mes strf("これでも食らいなっ >「%s」\n",items(cursol))if pl(cardCnt)=0 {mes pl(name)+"> おっさき~\n"svGameClear field,thismod,index}_break}else :_continuewendreturn#global;トランプの場モジュール#module TrumpField deck,cardCnt#define new(%1) dimtype %1,5:newmod %1,TrumpField#modfunc tfUseCard var _player,var carddeck(cardCnt)=cardplRemoveCard _player,tcName(card)cardCnt++return#define global tfSortField(%1) plSortDeck %1#modfunc tfViewforeach deckmes tcName(deck.cnt)+" ",1loopreturn#global;七並べの列モジュール#module SevensLine cardLine#const jokerIndex 13#const sevenIndex 6#modfunc slRefCardLine array _cardLinedimtype _cardLine,5,length(cardLine)foreach cardLine_cardLine(cnt)=cardLine(cnt)loopreturn#define news(%1) newmod %1,SevensLine#modinitdim cardLine,13cardLine(sevenIndex)=1return#modcfunc rangeMini=sevenIndexrepeat sevenIndexi--if cardLine(i)=0: breakloopreturn i#modcfunc rangeMaxi=sevenIndexrepeat sevenIndex,sevenIndexi++if cardLine(i)=0: breakloopreturn i#modcfunc slCheckUseCard int powerswitch powercase jokerIndexreturn 1case rangeMin(thismod)case rangeMax(thismod)return 1swendreturn 0#modfunc slUseCard int powercardLine(power)=1return#global;七並べモジュール#module Sevens field,cardCnt,lines,rank,clearCnt#define new(%1,%2) dimtype %1,5:newmod %1,Sevens,%2#modinit array playersdimtype lines,5,4repeat length(lines)news@SevensLine linesloopdimtype deck,5dimtype cardSevens,5,4repeat 4cardSevenName=suitStrs@TrumpCard(cnt)+powerStrs@TrumpCard(6)foreach playerscardSevenIndex=plExistCard(players.cnt,cardSevenName)if -1<cardSevenIndex {plRefDeck players(cnt),decktfUseCard thismod,players(cnt),deck(cardSevenIndex)break}looploopdim rank,length(players)clearCnt=0return#define svUseCard(%1,%2) \slUseCard lines(tcSuit(%2)),tcPower(%2) :\tfUseCard thismod,%1,%2#define ctype svCheckUseCard(%1) \slCheckUseCard(lines(tcSuit(%1)),tcPower(%1))#modcfunc svTryUseCard var _player,var cardif 1!svCheckUseCard(card): return 0svUseCard _player,cardreturn 1#modcfunc svCheckPlayNext var _playerif 0<plPass(_player): return 1dimtype deck,5plRefDeck _player,deckisPlayGame=0foreach deckif svCheckUseCard(deck.cnt) {isPlayGame=1break}loopreturn isPlayGame#modfunc svGameClear var _player,int indexclearCnt++rank(index)=clearCntplGameout _playerreturn#modfunc svGameOver var _player,int indexrank(index)=-1dimtype deck,5plRefDeck _player,deckforeach decksvUseCard _player,deck(cnt)loopplGameout _playerreturn#modcfunc svCheckGameEndisGameEnd=1foreach rankif rank(cnt)=0 {isGameEnd=0break}loopreturn isGameEnd#modfunc svViewdim cardLine,13s=""foreach linesi=cntss=""slRefCardLine lines(i),cardLinerepeat 13if cardLine(cnt) {s+=suitStrs@TrumpCard(i)ss+=powerStrs@TrumpCard(cnt)}else {s+="◇"ss+="◇"}loops+="\n"+ss+"\n"loopmes sreturn#modfunc svResult array playersmes "\n【Game Result】"foreach rankif 0<rank(cnt): rankStr=strf("%d位",rank.cnt): else: rankStr="GameOver..."mes strf("%s: %s",plName(players.cnt),rankStr)loopreturn#global;メイン処理#module Program#deffunc mainrepeat 100mes ""loopmes {"/---------------------------------------// 七並べ //---------------------------------------/"}new@TrumpDeck trptdShuffle trpdimtype p,5,4news@Player p,"Player"repeat length(p)-1,1news@AIPlayer p,"CPU "+cntlooprepeat tdCount(trp)tdNext trp,cardplAddCard p(cnt\4),cardloopforeach pplSortDeck p(cnt)loopnew@Sevens field,pdimtype deck,5*selectLoopsvView fieldforeach pplSelectCard p(cnt),field,cntif svCheckGameEnd(field): goto*exitSelectloopgoto*selectLoop*exitSelectsvResult field,preturn#globalmain