伊莉討論區

標題: 撲克牌遊戲設計 [打印本頁]

作者: pcion123    時間: 2011-4-3 01:28 AM     標題: 撲克牌遊戲設計

本帖最後由 pcion123 於 2011-4-3 01:29 AM 編輯

想要寫個簡單的遊戲設計Console模式下基本上你只要會變數,陣列+指標,迴圈,函式...等等
這樣就可以寫個有模有樣的東西出來了

當然如果想要寫個視窗的東西出來 那除了以上那些你還要會一些基本的物件的應用
那你也能夠寫個像樣一點的東西出來 當然這些東西網路上都有很多教學才是

裡面有用到class如果不會class也可以把裡面的參數,函式獨立出來也可以使用
再不行稍微研究一下也可以 class也不難不會花太多時間
寫的也算簡單 裡面有個pork.h是我把發牌洗牌的功能包在class中再弄成標頭檔使用求方便而已
class中一些成員函式的說明
void init();//初始化,它會呼叫Shuffling()進行洗牌
void show();//當初先寫在Dev C++上用的沒意義
void Shuffling();  //洗牌
void Reshuffling();//52張抽完之後扣掉雙方手上10張牌剩餘的再重新洗牌
void Use(int);//每打一張牌要使用這個函式釋放這張牌
int Dealing();//從洗好的牌堆中抽一張牌

pork.h中還有幾個函式的說明
int Match(int,int);//你打出的牌使用這個函式去對應應該做什麼動作 例如:加減,pass...等等
//AI其實寫的很簡陋,因為當初只是要讓程式能順利的進行下去最後的目標是要寫成連線版而已
//所以不需要寫的太複雜以下是兩個函式的多載,當中的值都是隨機變數而已
int AI(int);//輸入AI使用哪張牌
int AI();//AI進行10,12的加減

當以上這些你都會了我們就可以進行連線版的製作了
Socket的東西請參考 網路程式設計心得 這篇文章

連線版的概念也不難 你只要想辦法告訴對方你今天出了什麼牌,點數現在是多少,剩幾張牌...等等
對方收到你的資料之後把上面這些參數輸出來再換他出牌由我方接收它的參數即可

例如:
我今天出了一張黑桃K 那經我的程式運作之後 點數變為99 剩下30張牌
我把這些參數放到一個陣列中package[10]不一定要把陣列都塞滿只要對方知道參數在哪個元素中即可
package[0]            package[1]           package[2]
    12                         99                        30

//我的圖檔黑桃K的檔名是card12
對方只要把上面這些值代入應用即可

基本上連線版也都是在做這樣的事而已
所以如果單機版能夠完成那連線版其實也不是很難

99只是相當簡單的東西
如果要製作其它撲克牌遊戲或者其它遊戲
那演算法就需要自己去發揮創意囉

範例程式 開啟檔案請用VC++

再附上連線版 執行檔

寫的有點簡陋 謝謝收看
作者: yp7346    時間: 2011-4-3 08:40 AM

不知道你的洗牌程式有模擬真實洗牌的方式嗎?
還是純粹用亂數...
作者: pcion123    時間: 2011-4-3 11:30 AM

純粹亂數洗 並非輪盤式洗牌
作者: ponchi96    時間: 2011-4-3 02:28 PM

回復 3# pcion123

請問什麼是輪盤式洗牌
作者: pcion123    時間: 2011-4-3 11:53 PM

電腦的隨機亂數永遠只是由亂數表產生
不能真正的產生亂數
所以利用俄羅斯輪盤的方式去模擬真正的亂數
詳見GOOGLE 或者網路或機率的書會有介紹吧
作者: goodbye_mylove    時間: 2011-4-5 02:51 AM

回復 5# pcion123


觀念只對一半。
的確電腦用的亂數大多是用偽亂數,但實際上也不是建表,而是用 Y2=(AY1+B) MOD C 去算(非絕對,但就是一組亂數公式),這也是為什麼在使用亂數前要調用 srand((unsigned)time(NULL)); 之因。

其它要探討的的確很多,手邊測過 VC 的亂數週期 - INT_MAX 開始重覆 (非 RAND_MAX 開始重覆),其它的有興趣再看相關書籍。

如果不是案子/作業/專題/論文 有需求,亂數產生器的確還沒必要深入研究。
作者: sh7162c    時間: 2011-4-6 03:42 PM

有時用time來抓亂數還會出現時間太短抓到一樣的數XD
作者: goodbye_mylove    時間: 2011-4-7 02:31 PM

樓上說的沒錯

所以有人說調用 srand() 後,再直接丟掉一個 rand() 會較好。




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!