史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   生活話題、日常閒聊、喇勒唬爛灌水區 (http://forum.slime.com.tw/f23.html)
-   -   挑戰接近魔術程式的程式魔術 (http://forum.slime.com.tw/thread288856.html)

魔術王子 2019-03-21 11:47 PM

挑戰接近魔術程式的程式魔術
 
這些程式設計已經有一年多了
從最簡單的不見的牌,到最近的程式,小王子都一直在挑戰讓程式更接近表演的感受
老實說在畫面上顯示這段字還真有點心虛
引用:

畫面上所看到的效果,確實是利用魔術手法藉由程式設計呈現的,而非單純利用電腦程式製造出來的

因為一開始的魔術仍舊採用寫程式的習慣,也就是用一個變數儲存牌的代號
語法:

  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]);

設計有一年了,自己沒想到居然有這麼多奇怪的想法,克服很多的困難,也不知道大家是否喜歡這些程式,所以不敢過於浪費論壇資源
很感謝論壇給我這個機會分享,也感謝設計期間提供許多寶貴意見的朋友們
謝謝大家

魔術王子 2019-04-01 09:10 PM

自我挑戰,翻牌的動態效果分享給大家

https://drive.google.com/file/d/1eOn...ew?usp=sharing

只是測試,所以並沒有任何防護
除了第一次會正反各翻一次
接著會再翻5張牌

魔術王子 2019-04-20 08:49 PM

"馬戲團騙術",一個撲克牌的生活魔術,跟上一個魔術運用同樣的關鍵牌的原理
只不過裡面加入"趣味性謊言"
程式已經盡量用魔術的表演方式設計,若有懂得程式語言的朋友,麻煩幫小弟檢查一下程式碼,是否有利用程式語言作弊的地方,或看起來是使用道具表演的
下面是連結:https://drive.google.com/file/d/1F5V...ew?usp=sharing

mini 2019-04-21 03:32 PM

沒有安裝開發軟體
這類互動式程式真的很難去有效了解
不過還是花了點時間去追了下程式碼步驟

幸好有關鍵台詞可了解關鍵點程式碼
感覺這個魔術是以~ 前一張牌為魔術師記憶牌 (不知對不對?)
那至於有沒有用程式碼作弊?
作弊的地方是記憶牌
並非最後直接把選定的牌 用變數直接替換 亮出
也不是用程式先記憶其序號,再用if比對 亮出
所以...
因為魔術手法就是技巧性作弊?
但作弊手法必須用程式碼變數來實現
所以...嚴格來講不能說有用程式直接作弊亮牌

這是個認知問題
沒有相當的魔術認知 與 對這個程式的設計理念了解
可能沒有幾個人能給魔王明確答覆
沒有用開發軟體追蹤程式
更是如此
不過認為 如能把 Panel4->Tag 好好地解說其設計理念是何
應該比較能釋疑...是否作弊

魔術王子 2019-04-21 10:28 PM

引用:

作者: mini (文章 2376504)
沒有安裝開發軟體
這類互動式程式真的很難去有效了解
不過還是花了點時間去追了下程式碼步驟

幸好有關鍵台詞可了解關鍵點程式碼
感覺這個魔術是以~ 前一張牌為魔術師記憶牌 (不知對不對?)
那至於有沒有用程式碼作弊?
作弊的地方是記憶牌
並非最後直接把選定的牌 用變數直接替換 亮出
也不是用程式先記憶其序號,再用if比對 亮出
所以...
因為魔術手法就是技巧性作弊?
但作弊手法必須用程式碼變數來實現
所以...嚴格來講不能說有用程式直接作弊亮牌

這是個認知問題
沒有相當的魔術認知 與 對這個程式的設計理念了解
可能沒有幾個人能給魔王明確答覆
沒有用開發軟體追蹤程式
更是如此
不過認為 如能把 Panel4->Tag 好好地解說其設計理念是何
應該比較能釋疑...是否作弊

謝謝
其實有人願意下載測試就已經足夠了
對程式設計者來說,當觀眾選擇一張牌,最重要的下一步就是記住物件的陣列號碼
但這就等於是現實表演魔術時,在撲克牌上面做了記號
當然啦如果設計過程中,在任何的控制都沒使用這個機制,那是還好,因為這麼做可以便於控制畫面的繪製
所以,我一直盡量避開這種邏輯
但相信仍就會有習慣或便於設計的念頭,讓我用類似超能力的手段來設計控制牌的程式碼
所以如果真有人好奇,看了一下程式碼,畢竟有些人會想知道這樣的魔術究竟是如何進行的程式碼如何設計,如果真有人這麼做,就是希望他們可以嚴謹的找出程式裡面無法在現實生活中做到的效果
小弟的意思大概是這樣,謝謝


所有時間均為台北時間。現在的時間是 09:39 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1