全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2773
推到 Plurk!
推到 Facebook!

不重覆亂數發牌延伸的問題

答題得分者是:dllee
brange
一般會員


發表:6
回覆:9
積分:3
註冊:2007-07-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-27 00:49:33 IP:61.61.xxx.xxx 訂閱
小弟利用下面不重覆亂數的程式來發牌
有一個問題是 比如一開始要把牌發玩家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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-27 08:27:36 IP:59.105.xxx.xxx 訂閱
看過這篇嗎?[C ]6個亂數互不重複

現在電腦很快,重複的比對也許浪費不了太多時間,但可參考一下別人的快速的洗牌作法。
關於 randomize 可以放在建構元或 FormCreate。
另外也可以用亂數或時間配合 srand 每次以不同的種子產生亂數也可以。

發出去的牌要全部按花色排,可以把發出去的牌放在一個 TStringList 內,設定它要排序(Sorted=true)
它就會幫你排了。如果是發出去的牌要按每一玩家的花色排,就每一位玩家的牌放在一個 TStringList
同樣設排序,即可。只要您的花色編法是要您的要方式即可。

底牌使用抽牌法,玩家翻牌或補牌時可以由底牌去找到玩家需要的牌,很容易就可以達到電腦耍千的目的
------
http://www.ViewMove.com
brange
一般會員


發表:6
回覆:9
積分:3
註冊:2007-07-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-28 00:38:15 IP:61.61.xxx.xxx 訂閱
有去看過了
謝謝dell大大的解說
有關快速的洗牌作法 我會再研究看看
而您說把發出去的牌放在TStringList內的
這個觀念我懂,但要怎麼做呢?
搜尋StringLis後 發現它好像大多用於字串耶 請問t可以放圖片嗎? 怎麼加入啊?
StringList->Add() @#$%.....??
編輯記錄
brange 重新編輯於 2007-08-28 00:38:40, 註解 無‧
brange 重新編輯於 2007-08-28 00:42:41, 註解 無‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-28 17:06:27 IP:220.134.xxx.xxx 訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-29 23:31:11 IP:61.61.xxx.xxx 訂閱
非常謝謝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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-30 11:18:08 IP:220.134.xxx.xxx 訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-31 01:29:34 IP:61.61.xxx.xxx 訂閱
感謝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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-31 08:35:01 IP:220.134.xxx.xxx 訂閱
請您要去找本 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
系統時間:2024-05-02 20:24:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!