#include
#include
#include
#include
struct monsterdata//怪物屬性資料型態
{
char type[5];
int life;//怪物生命值
int attack;//怪物攻擊力
int exp;//怪物經驗值
};
void initialmonster(monsterdata *ms)//怪物屬性初始化函式
{
srand((unsigned int)time(NULL));
ms->life=150+rand()%21;//生命值隨機亂數取150-170
ms->attack=20+rand()%11;//攻擊力隨機亂數取20-30
ms->exp=15;
}
void printMonsterStatus(monsterdata ms)//列印怪物屬性函式
{
printf("---怪物屬性---\n");
printf("怪物屬性:%s\n",ms.type);
printf("生命:%d\n",ms.life);
printf("攻擊力:%d\n",ms.attack);
printf("經驗值:%d\n",ms.exp);
}
void main()
{
monsterdata monster[2];//宣告2個monsterdata型態的怪物
int i;
for(i=0;i<2;i++)
{
initialmonster(&monster[i]);//初始2隻怪物屬性
printMonsterStatus(monster[i]);//將產生的2隻怪物的屬性都列印出來
}
}
只用c語言寫
VC++6.0開發
為了開發一套rpg遊戲程式
再撰寫怪物屬性這方面出了點問題
卡就卡卡在這裡了進行不下去= =
最奇怪的地方就是
我列應出來的兩個怪物屬性均都一模一樣try了100次都是這樣|y01|
怎麼會這樣...又不是雙胞胎
函式呼叫也是分別傳址過去呼叫阿
請大大幫我看我寫的程式有什麼bug沒注意到嗎
謝謝
2007-12-28 19:56:25 · 4 個解答 · 發問者 fbiwbi 3 in 電腦與網際網路 ➔ 程式設計
9527 大大
照妳這樣寫出來的話
程式的確是會印出兩個不同的怪物說
可是如果是時間相近的問題的話
我剛剛測試一下用無限迴圈跑
全部的數值也是顯示一樣耶~~
那怎麼還會是這樣呢??~_~
2007-12-28 20:56:08 · update #1
因為助教有用msdn幫我看
發現其實怪物屬性並不一樣
但是我回家測候發現...列印出來的卻是一樣
所以在想是不是屬性其實不一樣
但是printMonsterStatus這個function寫錯了呢
感謝大大幫忙
有請大大了
2007-12-29 09:22:13 · update #2
永恆的破壞 大大
妳好像搞錯了
struct 內並不能填入數值
應該是無法把這兩個函式寫在一起
還是得在寫個function來填入怪物數值
妳可能忘記了吧
2008-01-01 20:28:17 · update #3
到下面的網址看看吧
▶▶http://*****
2014-09-03 11:05:13 · answer #1 · answered by Anonymous · 0⤊ 0⤋
意見不讓我發
我直接跟你說
只是不要鬧雙胞而已
兩位何必搞成這麼麻煩
不出現同樣怪物跟數據
表示出來的亂數不要重複
既然如此參考Jacob大師的那個亂數不重複的技術就好了
速度快可設定最大重複數量
程式碼簡短道理簡單
兩位專家都在這幫你解答
問他們就對啦
還有那兩個函式不該分開寫
根據正常的架構應該是寫在一起
一般都是物件創見完成後
接著填入屬性
再進行下一個物件的創造,第一上頭有用過的數據可以設定不再重複或者是n%的重複率
第二可以避免數據與怪物ID跟索引值重複
第三成是比較短也比較好看
2008-01-02 17:55:06 補充:
結構很少用
因為我都是混在一起寫的
C++封裝後可以這樣子搞
但是C要用一個函式把功能包起來
我說是把結構用一個函式包起來填
全部寫成一個函式
2007-12-30 20:53:54 · answer #2 · answered by 永恆的破壞 5 · 0⤊ 0⤋
我有個建議你可以參考看看..
會使用srand通常是希望每次執行程式時要產生不一樣的亂數
但是你沒有必要在每次初始化怪物的時候都重設亂數種子
因為時間相隔很短..所以你每次初始化怪物的時候應該都
是用到同一組亂數種子..也因此在初始化的時候都會產生那組亂數
種子的第一個值..所以如果把srand放在main裡應該
就能解決這個問題了..參考看看吧^^
2007-12-29 22:31:30 · answer #3 · answered by 假扣哩馬斯 3 · 0⤊ 0⤋
我看了題目,想:哪位大大能在這麼短時給這種題目答案。
一看:9527,難怪!
再看了問題內容,啊,小問題,委曲 9257 大大了!
另外,你若要大量的怪物 rand( )%21 不好!它使用了 低 bits!
建議使用高 bits。
方法: (int) (rand( ) * 21 / (float) RAND_MAX);
詳參: http://www.phpbbserver.com/graphicsparalle/viewtopic.php?t=129
(註:
小量的話,你的方法還比較快!
大量的話,我建議的方法比較不會有雙胞胎!)
2007-12-29 06:35:33 補充:
不好意思,
你換成 9527 後 約一個月之久,我一直以為你換成 9257!
後來才發現:我錯了! ~>.<~
好險,沒有漏餡過!
今天,終於破功了! ~T.T~
抱歉啊~ Orz
2007-12-29 06:51:12 補充:
9527 大的方法(srand( time ) 只跑一次)是標準做法。
你的 21 和 11 數值不算極小,改用 9527 大的方法,應該不會有重覆才對。
你要是一定不要有雙胞胎,可以考慮把 21 和 11 換大一點的數值。
2007-12-29 06:51:21 補充:
不過,我太懂你『2007-12-29 01:56:08 補充』的問題。
如果你是指:〝執行 Game 的時間是兩天同一時間〞;
那下列方法可以考慮:
0. 改用 Linux:它有提供東東讓程式師用,亂數較不會重覆!
1. 餵食 srand( ) 時,不要單用 time,加料後才餵食:
a. 日期(包括 年、月,time.h 裡有一些函數可用)。
b. 千分秒(#include ftime( ); 函數)。
如果是其它的問題,可能要請你說明白一點;
或看 9527 大能不能了解你要問的是什麼了。
2007-12-28 21:25:21 · answer #4 · answered by ? 7 · 0⤊ 0⤋