不重覆亂數發牌延伸的問題 |
答題得分者是:dllee
|
brange
一般會員 發表:6 回覆:9 積分:3 註冊:2007-07-04 發送簡訊給我 |
小弟利用下面不重覆亂數的程式來發牌
有一個問題是 比如一開始要把牌發玩家7張牌時 要如何將發出去牌 按照花色與大小來排列 還有每一開始執行時發的牌 亂數都一樣 小弟知道個 randomize; 可以防止這樣的事情發生 但試了好多次 就是不知道要放在哪邊 //----------------------------------------------------------------------------------------------------- int X_rand[107]; for(int i_rand = 1;i_rand < 107;i_rand ){ X_rand[i_rand] = random(107); //產生0~107之間的亂數 for(int j = 1;j < i_rand;j ){ if(X_rand[j] == X_rand[i_rand]){ //如果比對發現重複,則重新產生 X_rand[i_rand] = 1 random(107); //這樣應該比較簡單明瞭一點 j=0; //至少不會跳來跳去的 } } ImageList1->Draw(Image[i_rand]->Canvas,0,0,X_rand[i_rand],true); } |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
看過這篇嗎?[C ]6個亂數互不重複
現在電腦很快,重複的比對也許浪費不了太多時間,但可參考一下別人的快速的洗牌作法。 關於 randomize 可以放在建構元或 FormCreate。 另外也可以用亂數或時間配合 srand 每次以不同的種子產生亂數也可以。 發出去的牌要全部按花色排,可以把發出去的牌放在一個 TStringList 內,設定它要排序(Sorted=true) 它就會幫你排了。如果是發出去的牌要按每一玩家的花色排,就每一位玩家的牌放在一個 TStringList 同樣設排序,即可。只要您的花色編法是要您的要方式即可。 底牌使用抽牌法,玩家翻牌或補牌時可以由底牌去找到玩家需要的牌,很容易就可以達到電腦耍千的目的
------
http://www.ViewMove.com |
brange
一般會員 發表:6 回覆:9 積分:3 註冊:2007-07-04 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
TStringList 可以放圖, 可以放任何東西
SourceCards->Add("101",Image101);SourceCards->Add("413",Image413); 以上假設 Image101 是黑桃(100) A (01) 以 101 代號表示 ... Image413 是梅花(400) K (13) 以 413 代號表示 (花色代號可自定, 我只是舉例) 這樣就有一付牌了。這一付牌不要動它的內容。 每次要用,就再建一個新的,原始的那個不要動它。 for(int i=0;i<4;i ) { TStringList *Player[i]=new TStringList; Player[i]->Sorted=true; // 自動排序 } 如一開始每人發 5 張牌 cards->Delete(index); // 底牌-1 } 之後,再按 Player[i] 把每一家的牌繪出來即可。 如 TImage *img=(TImage*)Player[0]->Objects[0]; // 取出第 1 位玩家的第 1 張牌的圖片 ... 其餘的,請自行想像吧 :P
------
http://www.ViewMove.com
編輯記錄
dllee 重新編輯於 2007-08-28 17:09:08, 註解 增加排序說明‧
|
brange
一般會員 發表:6 回覆:9 積分:3 註冊:2007-07-04 發送簡訊給我 |
非常謝謝dllee大大的詳解
但新手的我試了大大說的方法還是出現了幾個問題 1.SourceCards->Add()與SourceCards->AddObject()有何不用呢 小弟借用大大的程式 寫下如下的程式碼 SourceCards->AddObject("1",Image[1]); SourceCards->AddObject("2",Image[2]); SourceCards->AddObject("3",Image[3]); SourceCards->AddObject("4",Image[4]); SourceCards->AddObject("5",Image[5]); 而刮號內的"1"是物件Image[1]的 索引吧? 小弟試用SourceCards->Add()的結果不行耶 會出現錯誤 所以用了SourceCards->AddObject() 2.cards->AddStrings(SourceCards);這行不懂 cards裡面是加入了什麼 是SourceCards的 索引嗎 3.小弟要將TStringList 內的物件取時 也錯了 出現Pointer to structure required on left side of->or->* for(int i=0;i<7;i ) { TImage *img[i]=(TImage*)Player[i]->Objects[i]; img[i]->Parent =Form1; img[i]->Top =170*i; img[i]->Left =0; img[i]->Height =170; img[i]->Width =140; img[i]->Show(); } |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
Add("1") 只加入一個字串 "1"
AddObject("1", Image1) 是加入一個字串 "1",同時此字串與一個物件 Image1 綁在一起 cards->AddStrings(SourceCards); 表示 把 SourceCards 這個 StringList 加到 cards 內 又因為 cards 是空的, 所以 cards 就等於有 SrouceCards 的全部內容,包含 Strings 及 Objects。 在此也就是 COPY 一份的意思。 TImage *img=(TImage*)Player[i]->Objects[i]; img->Parent =Form1; ... 這樣去操作就可以了,img 是取出 Objects[i] 的指標來使用,不必再用陣列。
------
http://www.ViewMove.com |
brange
一般會員 發表:6 回覆:9 積分:3 註冊:2007-07-04 發送簡訊給我 |
感謝dllee大大
小弟知道大大已經說的再明白不過了 但 一輪到小弟這邊就出現問題了 >_<" 1. 請問TStringList可以設定成陣列的型式嗎 小弟依下面的打法 它一直說錯耶 試過只要把*Player[i] 改成非陣列型式*Player 就都ok 但就變成只有一個玩家了 >///<" for(int i=0;i<4;i )//四個玩家 { TStringList *Player[i]=new TStringList; Player[i]->Sorted=true; // 自動排序 } 2. TImage *img=(TImage*)Player[j]->Objects[j]; (這行有縮寫嗎 不太懂它的意思) 為什麼不可以再用陣列呢 如果要把玩家的牌都顯示出來 不是用陣列加上for 就可以一次把這個玩家所得到的牌顯示出來嗎 不懂為什麼 設成TImage *img[i]會錯 難道有功能可以直接把Player裡面存的圖片物件全部顯示出來.... |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
請您要去找本 C/C++ 入門的書來看了。
您的問題在於變數宣告的位置錯誤。 for(int i=0;i<4;i )//四個玩家 { TStringList *Player[i]=new TStringList; Player[i]->Sorted=true; // 自動排序 } 以上如果真的可以宣告,那個 Player[i] 只在 for 的 { } 內有效。 正確的方法,請在 .h TForm1 內宣告 TStringList *Player[4]; 或是宣告在 .cpp 的最上面。 在 TForm1 的建構元或 FormCreate 時,建立它們 for(int i=0;i<4;i )//四個玩家 { Player[i]=new TStringList; Player[i]->Sorted=true; // 自動排序 } 另外,如果看不懂 Player[i]->Objects[j] 只是對 TStringList 不熟,請多使用,看久就習慣了, 就像練英文,常說就習慣了,也不用去記文法。 Player[0]->Strings[2] 是指第 一位玩家手中(已排序好的)第 3 張牌的代號它是一個字串(AnsiString) Player[0]->Objects[2] 是指第 一位玩家手中(已排序好的)第 3 張牌所對應的物件它是一個 TObject 指標 但因為我們存的是 TImage (我假設的,真的存的是什麼由您自行決定) 所以在使用使把它轉成 TImage 類型 因此在前面加上 (TImage*)Player[0]->Objects[2] 接著為了不用每次使用都打那麼長一串,所以把它暫存到另一個指標變數 img 也就是 TImage *img=(TImage*)Player[0]->Objects[2] ; 如此,就可以用 img->Visible=true; 去操作它了。
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |