這些程式設計已經有一年多了
從最簡單的不見的牌,到最近的程式,小王子都一直在挑戰讓程式更接近表演的感受
老實說在畫面上顯示這段字還真有點心虛
引用:
畫面上所看到的效果,確實是利用魔術手法藉由程式設計呈現的,而非單純利用電腦程式製造出來的
|
因為一開始的魔術仍舊採用寫程式的習慣,也就是用一個變數儲存牌的代號
語法:
if(Card1->Tag==0) return;
PanelClick(Sender);
TImage *Images=(TImage *) Sender;
Card1->Tag=0;
CardPanel1->Visible=false;
// Tag=-1;
for(int i=0;i<52;i++) if(Order[i]==Images->Tag) { Panel->Tag=i; Tag=0; break; }
CardClick();
而這種做法等於是在觀眾選的牌上偷偷的做記號(利用程式是很容易做到的)
然後最後在比對這個號碼,就可以知道觀眾選的牌了
語法:
Panel1->Caption="最後這是我找的牌\""+Card[Order[Panel2->Tag]]->Hint+"\"...";
最近在設計某個程式時發生了一個小插曲
就是在反覆展現洗牌的動作下造成記牌的困擾
語法:
p=0;
while(1){
rr=random(3)+1;
if(kr+rr>26) rr=26-kr;
for(int i=0;i<rr;i++){
Card[Order[kr]]->Left = Card[Order[kr]]->Left+60;
Card[Order[kr]]->Top=Loc2+p;
Card[Order[kr]]->SendToBack();
kr++;
p++;
}
if(p==52) break;
rl=random(3)+1;
if(kl+rl>52) rl=52-kl;
for(int i=0;i<rl;i++){
Card[Order[kl]]->Left = Card[Order[kl]]->Left-60;
Card[Order[kl]]->Top=Loc2+p;
Card[Order[kl]]->SendToBack();
kl++;
p++;
}
if(p==52) break;
}
這種方式就不容易將牌記住
最嚴重的就是牌的順序,當然現實表演,魔術師本來就不可能會知道牌的順序
但程式設計上卻必須知道才能控制秀牌的畫面
所以就有了這段程式
語法:
Order[0]=Order[51];
for(int i=1;i<52;i++) {
for(int j=0;j<52;j++) {
if(Card[j]->Top==Card[Order[0]]->Top+i) { Order[i]=j; break; }
}
}
不過重要的仍是要掌握觀眾選到的那張牌
只是小王子沒想到最後竟然可以用這種方式處理
語法:
for(int i=0;i<52;i++) if(Card[Order[i]]->Transparent) Panel->Tag=i;
Card[Order[Panel->Tag]]->Top=Loc3;
Delay(1000);
Card[Order[Panel->Tag]]->Left=Screen->Width/2;
GetCard(Order[Panel->Tag]);
設計有一年了,自己沒想到居然有這麼多奇怪的想法,克服很多的困難,也不知道大家是否喜歡這些程式,所以不敢過於浪費論壇資源
很感謝論壇給我這個機會分享,也感謝設計期間提供許多寶貴意見的朋友們
謝謝大家