AI四人で回す七並べ
AI四人で回す七並べ
#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=1isGameOut=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#modfunc plSelectCard var _field,int _indexfield=_field:index=_indexgosub selectCardFnreturn*selectCard;カード選択処理return#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"wait 100return}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)s=""foreach itemss+=items(cnt)+","loopmes swait 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"loopcolor $FF,$FF,$FFboxf 20,20,500,180color $FF,0,0pos 20,20mes 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 maincolor $FF,0,0mes "【全自動七並べ】"new@TrumpDeck trptdShuffle trpdimtype p,5,4;news@Player p,"Player"repeat length(p),1news@AIPlayer p,"CPU "+cntlooprepeat tdCount(trp)tdNext trp,cardplAddCard p(cnt\4),cardloopforeach pplSortDeck p(cnt)loopnew@Sevens field,pdimtype deck,5*selectLooppos 0,0color $FF,$FF,$FFboxf 0,20,ginfo_sizex,ginfo_sizeycolor $FF,0,0pos 10,180foreach pposx=ginfo_cx:posy=ginfo_cysvView fieldpos posx,posyplSelectCard p(cnt),field,cntif svCheckGameEnd(field): goto*exitSelectloopwait 100goto*selectLoop*exitSelectpos 0,0color $FF,$FF,$FFboxf 0,20,ginfo_sizex,ginfo_sizeycolor 0,0,0svView fieldsvResult field,preturn#globalmain