#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 tcName
return name
#modcfunc tcPower
return power
#modcfunc tcSuit
return suit
#define news(%1,%2,%3) newmod %1,TrumpCard,%2,%3
#modinit int _suit,int _power
name=suitStrs(_suit)+powerStrs(_power)
power=_power
suit=_suit
return
#global
;トランプの束モジュール
#module TrumpDeck co,i,deck,count,hash
#modcfunc tdCount
return count
#define new(%1) dimtype %1,5:newmod %1,TrumpDeck
#modinit
randomize
#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*/
deckDefine
foreach suits
news@TrumpCard deck,suits(cnt),powers(cnt)
hash(cnt)=cnt
loop
count=length(deck)
newlab co,1:return
gosub*trumpIter
return
#modfunc tdShuffle
foreach deck
r=rnd(count)
tmp=hash(cnt)
hash(cnt)=hash(r)
hash(r)=tmp
loop
return
*trumpIter
for i,0,length(suits)
_card=deck(hash(i))
newlab co,1:return
next
return
#modfunc local tdNext var card
gosub co
card=_card
return
#define global tdNext(%1,%2) dimtype %2,5:tdNext@TrumpDeck %1,%2
#global
;プレイヤーモジュール
#module Player deck,cardCnt,pass,isGameOut,name
#modcfunc plName
return name
#modcfunc plCardCnt
return cardCnt
#modcfunc plPass
return pass
#modcfunc plIsGameOut
return isGameOut
#modfunc plRefDeck array _deck
if cardCnt!=0 {
dimtype _deck,5,cardCnt
repeat cardCnt
_deck(cnt)=deck(cnt)
loop
}
else: dim _deck
return
#define news(%1,%2) newmod %1,Player,%2
#modinit str _name
name=_name
cardCnt=0
pass=0;3
isGameOut=1
return
#modfunc plSortDeck
repeat cardCnt
i=cnt
repeat cardCnt-i
n=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
}
loop
loop
return
#modfunc plAddCard var card
deck(cardCnt)=card
cardCnt++
return
#modfunc plRemoveCard str cardName
repeat cardCnt
if tcName(deck.cnt)=cardName {
delID=cnt
repeat cardCnt-delID-1
deck(delID+cnt)=deck(delID+cnt+1)
loop
cardCnt--
break
}
loop
return
#modcfunc plExistCard str cardName
existCard=-1
repeat cardCnt
if tcName(deck.cnt)=cardName {
existCard=cnt
break
}
loop
return existCard
#modfunc plUsePass
pass--
return
#modfunc plGameOut
isGameOut=0
return
#global
;トランプの場モジュール
#module TrumpField deck,cardCnt
#define new(%1) dimtype %1,5:newmod %1,TrumpField
#modfunc tfUseCard var _player,var card
deck(cardCnt)=card
plRemoveCard _player,tcName(card)
cardCnt++
return
#define global tfSortField(%1) plSortDeck %1
#modfunc tfView
foreach deck
mes tcName(deck.cnt)+" ",1
loop
return
#global
;七並べの列モジュール
#module SevensLine cardLine
#const jokerIndex 13
#const sevenIndex 6
#modfunc slRefCardLine array _cardLine
dimtype _cardLine,5,length(cardLine)
foreach cardLine
_cardLine(cnt)=cardLine(cnt)
loop
return
#define news(%1) newmod %1,SevensLine
#modinit
dim cardLine,13
cardLine(sevenIndex)=1
return
#modcfunc rangeMin
i=sevenIndex
repeat sevenIndex
i--
if cardLine(i)=0: break
loop
return i
#modcfunc rangeMax
i=sevenIndex
repeat sevenIndex,sevenIndex
i++
if cardLine(i)=0: break
loop
return i
#modcfunc slCheckUseCard int power
switch power
case jokerIndex
return 1
case rangeMin(thismod)
case rangeMax(thismod)
return 1
swend
return 0
#modfunc slUseCard int power
cardLine(power)=1
return
#global
;七並べモジュール
#module Sevens field,cardCnt,lines,rank,clearCnt
#define new(%1,%2) dimtype %1,5:newmod %1,Sevens,%2
#modinit array players
dimtype lines,5,4
repeat length(lines)
news@SevensLine lines
loop
dimtype deck,5
dimtype cardSevens,5,4
repeat 4
cardSevenName=suitStrs@TrumpCard(cnt)+powerStrs@TrumpCard(6)
foreach players
cardSevenIndex=plExistCard(players.cnt,cardSevenName)
if -1<cardSevenIndex {
plRefDeck players(cnt),deck
tfUseCard thismod,players(cnt),deck(cardSevenIndex)
break
}
loop
loop
dim rank,length(players)
clearCnt=0
return
#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 card
if 1!svCheckUseCard(card): return 0
svUseCard _player,card
return 1
#modcfunc svCheckPlayNext var _player
if 0<plPass(_player): return 1
dimtype deck,5
plRefDeck _player,deck
isPlayGame=0
foreach deck
if svCheckUseCard(deck.cnt) {
isPlayGame=1
break
}
loop
return isPlayGame
#modfunc svGameClear array players,int index
clearCnt++
rank(index)=clearCnt
plGameout players(index)
return
#modfunc svGameOver array players,int index
rank(index)=-1
dimtype deck,5
plRefDeck players(index),deck
foreach deck
svUseCard players(index),deck(cnt)
loop
plGameout players(index)
return
#modcfunc svCheckGameEnd
isGameEnd=1
foreach rank
if rank(cnt)=0 {
isGameEnd=0
break
}
loop
return isGameEnd
#modfunc svView
dim cardLine,13
s=""
foreach lines
i=cnt
ss=""
slRefCardLine lines(i),cardLine
repeat 13
if cardLine(cnt) {
s+=suitStrs@TrumpCard(i)
ss+=powerStrs@TrumpCard(cnt)
}
else {
s+="◇"
ss+="◇"
}
loop
s+="\n"+ss+"\n"
loop
mes s
return
#modfunc svResult array players
mes ""
foreach rank
if 0<rank(cnt): rankStr=strf("%d位",rank.cnt): else: rankStr="GameOver..."
mes strf("%s: %s",plName(players.cnt),rankStr)
loop
return
#global
;メイン処理
#module Program
#uselib "crtdll"
#cfunc getch "_getch"
#cfunc kbhit "_kbhit"
;カーソルの移動
#defcfunc move int _ch,int _csl,int max
csl=_csl
if _ch=$4b :csl-- ;左
if _ch=$4d :csl++ ;右
if csl<0 :csl=0
if max-1<csl :csl=max-1
return csl
;カーソルの表示
#deffunc cursolShow array items,int _csl
dim slct,length(items)
slct(_csl)=1
s=""
foreach items
if slct(cnt): s+=strf("[%s]",items(cnt)): else: s+=strf("%s",items(cnt))
loop
mes strf("%s\r",s),1
return
#deffunc main
repeat 100
mes ""
loop
mes {"
/---------------------------------------/
/ 七並べ /
/---------------------------------------/
"}
new@TrumpDeck trp
tdShuffle trp
dimtype p,5,4
repeat length(p)
news@Player p,"Player "+(cnt+1)
loop
repeat tdCount(trp)
tdNext trp,card
plAddCard p(cnt\4),card
loop
foreach p
plSortDeck p(cnt)
loop
new@Sevens field,p
svView field
dimtype deck,5
*selectLoop
foreach p
if 1!plIsGameOut(p.cnt): continue
if 1!svCheckPlayNext(field,p.cnt) {
svGameOver field,p(cnt),cnt
svView field
mes plName(p.cnt)+" GameOver...\n"
continue
}
plRefDeck p(cnt),deck
mes "【"+plName(p.cnt)+"】Pass: "+plPass(p.cnt)
sdim items
foreach deck
items(cnt)=tcName(deck.cnt)
loop
if 0<plPass(p.cnt): items(length(items))="PS:"+plPass(p.cnt)
while 1
cursol=0
cursolShow items,cursol
repeat
if kbhit() {
ch=getch()
if ch=$0d {
mes ""
break
}
if ch=$e0 {
cursol=move(getch(),cursol,length(items))
cursolShow items,cursol
}
}
loop
if 0<plPass(p.cnt) & length(items)-1=cursol {
plUsePass p.cnt
svView field
mes strf("残りパスは%d回です。\n",plPass(p.cnt))
_break
}
else:if svTryUseCard(field,p(cnt),deck(cursol)) {
svView field
mes strf("俺の切り札!! >「%s」\n",items(cursol))
if plCardCnt(p.cnt)=0 {
mes plName(p.cnt)+" Congratulations!!"
svGameClear field,p(cnt),cnt
}
_break
}
else {
mes "そのカードは出せないのじゃ…\n"
_continue
}
wend
if svCheckGameEnd(field): goto*exitSelect
loop
goto*selectLoop
*exitSelect
svResult field,p
return
#global
main