Post by huangno1 on Feb 25, 2017 7:19:11 GMT -8
程式說明
假設怪物有兩個屬性 (two attributes):攻擊力 (attack) 和防禦力 (defense)。我們說怪物A可以擊倒怪物B (A beats B),若且唯若 (if and only if) 下列三個條件同時成立:
(1) 若怪物A的攻擊力不低於怪物B的攻擊力; (A’s attack is not lower than B’s.)
(2) 若怪物A的防禦力不低於怪物B的防禦力; (A’s defense is not lower than B’s.)
(3) 若怪物A的攻擊力高於怪物B 或怪物A的防禦力高於怪物 B。(A’s attack OR defense is higher than B’s.)
本功能會隨機產生兩個怪物兵團 (generate two groups of monster randomly),並計算各兵團中不會被敵方任一隻怪物擊倒的怪物數目 (count the number of monsters not being beat) 。
(1) 支援函式 random()
(1.1) 該函式有兩個參數 (two parameters) lb 和 ub,均為整數型態。(可假設 lb <= ub。)
(1.2) 該函式的回傳值為整數型態,代表一個介於 lb 和 ub 之間的隨機值。(return a random value between lb and ub (including lb and ub))
(1.3) 呼叫 random(1, 10) 應以相等機率傳回 1~10 中的任一值。
(2) 支援函式 Beat()
(2.1) 該函式有四個參數atk1, def1, atk2, def2,均為整數型態。
(2.2) 該函式的回傳值為布林 (bool) 型態,代表怪物1是否能擊倒怪物2。
(2.3) 呼叫 Beat(6, 5, 5, 4) 會回傳true;
呼叫 Beat(6, 5, 5, 6) 會回傳false;
呼叫 Beat(5, 4, 6, 5) 會回傳 false;
呼叫 Beat(6, 5, 6, 4) 會回傳 true。
(3) 主函式中的功能:
(3.1) 產生兩個怪物兵團,每個兵團5隻怪物 (5 monsters in each group)。呼叫 random() 來設定怪物屬性。每隻怪物的攻擊力為介於 3~8 的隨機值 (attack is a random value in [3, 8]),防禦力為 1~5 的隨機值 (defense in [1, 5])。
(3.2) 列印出兩個兵團的怪物數值。
(3.3) 呼叫 Beat() 計算兩個兵團中不會被擊倒的怪物數量,輸出數量。
提示:定義一個三維陣列來儲存怪物資料 (stores monster data in a 3-D array),使用巢狀迴圈來產生、列印和計算 (use nested loops to generate, print, and calculate required values)。
[範例一]
Monster Battle
Monster 1 : ( 5 3) Monster 1 : ( 6 2)
Monster 2 : ( 7 4) Monster 2 : ( 4 4)
Monster 3 : ( 5 5) Monster 3 : ( 7 4)
Monster 4 : ( 8 4) Monster 4 : ( 5 1)
Monster 5 : ( 3 1) Monster 5 : ( 4 1)
3 0
[範例二]
Monster Battle
Monster 1 : ( 4 5) Monster 1 : ( 8 2)
Monster 2 : ( 3 4) Monster 2 : ( 7 3)
Monster 3 : ( 7 5) Monster 3 : ( 3 3)
Monster 4 : ( 3 2) Monster 4 : ( 7 4)
Monster 5 : ( 3 1) Monster 5 : ( 5 4)
2 1
#include <stdio.h>
#include <stdlib.h>
int random(int lb, int ub)
{
return rand()%(ub-lb+1)+lb;
}
// --------------------------------------------------------
bool Beat(int atk1, int def1, int atk2, int def2)
{
return ( atk1 >= atk2 && def1 >= def2 && ( atk1 > atk2 || def1 > def2 ) ) ? 1 : 0;
}
// --------------------------------------------------------
int main()
{
int seed = 0;
scanf("%d", &seed);
srand(seed); // 以上三行是為了檢查程式答案是否正確而寫的,正常應為 srand(time(0));
printf("Monster Battle\n");
constexpr int NumMonsters = 5;
int monsters[2][NumMonsters][2]= {};
constexpr int range[2][2] = {3,8,1,5};
// ----- generate monsters -----
for (int g=0; g<2; g+=1)
{
for (int m=0; m<NumMonsters; m+=1)
{
for (int a=0; a<2; a+=1)
{
monsters [ g ] [ m ] [ a ] = random ( range [ a ] [ 0 ] , range [ a ] [ 1 ] ) ;
}
}
}
// ----- print monsters -----
for (int m=0; m<NumMonsters; m+=1)
{
for (int g=0; g<2; g+=1) // group
{
printf("Monster %d : (", m+1);
for (int a=0; a<2; a+=1) // attribute
{
printf("%3d", monsters[ g ] [ m ] [ a ]);
}
printf(") ");
}
printf("\n");
}
// ----- calculate scores -----
for (int g=0; g<2; g+=1)
{
int score = 0;
int me = g, enemy = !g;
for (int m=0; m<NumMonsters; m+=1)
{
int survived = 1;
for (int n=0; n<NumMonsters; n+=1)
{
if (Beat ( monsters [ enemy ] [ n ] [ 0 ] , monsters [ enemy ] [ n ] [ 1 ] , monsters [ me ] [ m ] [ 0 ] , monsters [ me ] [ m ] [ 1 ] ) == 1)
{
survived = 0;
break;
}
}
score += survived;
}
printf("%d ", score);
}
printf("\n");
return 0;
}
假設怪物有兩個屬性 (two attributes):攻擊力 (attack) 和防禦力 (defense)。我們說怪物A可以擊倒怪物B (A beats B),若且唯若 (if and only if) 下列三個條件同時成立:
(1) 若怪物A的攻擊力不低於怪物B的攻擊力; (A’s attack is not lower than B’s.)
(2) 若怪物A的防禦力不低於怪物B的防禦力; (A’s defense is not lower than B’s.)
(3) 若怪物A的攻擊力高於怪物B 或怪物A的防禦力高於怪物 B。(A’s attack OR defense is higher than B’s.)
本功能會隨機產生兩個怪物兵團 (generate two groups of monster randomly),並計算各兵團中不會被敵方任一隻怪物擊倒的怪物數目 (count the number of monsters not being beat) 。
(1) 支援函式 random()
(1.1) 該函式有兩個參數 (two parameters) lb 和 ub,均為整數型態。(可假設 lb <= ub。)
(1.2) 該函式的回傳值為整數型態,代表一個介於 lb 和 ub 之間的隨機值。(return a random value between lb and ub (including lb and ub))
(1.3) 呼叫 random(1, 10) 應以相等機率傳回 1~10 中的任一值。
(2) 支援函式 Beat()
(2.1) 該函式有四個參數atk1, def1, atk2, def2,均為整數型態。
(2.2) 該函式的回傳值為布林 (bool) 型態,代表怪物1是否能擊倒怪物2。
(2.3) 呼叫 Beat(6, 5, 5, 4) 會回傳true;
呼叫 Beat(6, 5, 5, 6) 會回傳false;
呼叫 Beat(5, 4, 6, 5) 會回傳 false;
呼叫 Beat(6, 5, 6, 4) 會回傳 true。
(3) 主函式中的功能:
(3.1) 產生兩個怪物兵團,每個兵團5隻怪物 (5 monsters in each group)。呼叫 random() 來設定怪物屬性。每隻怪物的攻擊力為介於 3~8 的隨機值 (attack is a random value in [3, 8]),防禦力為 1~5 的隨機值 (defense in [1, 5])。
(3.2) 列印出兩個兵團的怪物數值。
(3.3) 呼叫 Beat() 計算兩個兵團中不會被擊倒的怪物數量,輸出數量。
提示:定義一個三維陣列來儲存怪物資料 (stores monster data in a 3-D array),使用巢狀迴圈來產生、列印和計算 (use nested loops to generate, print, and calculate required values)。
[範例一]
Monster Battle
Monster 1 : ( 5 3) Monster 1 : ( 6 2)
Monster 2 : ( 7 4) Monster 2 : ( 4 4)
Monster 3 : ( 5 5) Monster 3 : ( 7 4)
Monster 4 : ( 8 4) Monster 4 : ( 5 1)
Monster 5 : ( 3 1) Monster 5 : ( 4 1)
3 0
[範例二]
Monster Battle
Monster 1 : ( 4 5) Monster 1 : ( 8 2)
Monster 2 : ( 3 4) Monster 2 : ( 7 3)
Monster 3 : ( 7 5) Monster 3 : ( 3 3)
Monster 4 : ( 3 2) Monster 4 : ( 7 4)
Monster 5 : ( 3 1) Monster 5 : ( 5 4)
2 1
#include <stdio.h>
#include <stdlib.h>
int random(int lb, int ub)
{
return rand()%(ub-lb+1)+lb;
}
// --------------------------------------------------------
bool Beat(int atk1, int def1, int atk2, int def2)
{
return ( atk1 >= atk2 && def1 >= def2 && ( atk1 > atk2 || def1 > def2 ) ) ? 1 : 0;
}
// --------------------------------------------------------
int main()
{
int seed = 0;
scanf("%d", &seed);
srand(seed); // 以上三行是為了檢查程式答案是否正確而寫的,正常應為 srand(time(0));
printf("Monster Battle\n");
constexpr int NumMonsters = 5;
int monsters[2][NumMonsters][2]= {};
constexpr int range[2][2] = {3,8,1,5};
// ----- generate monsters -----
for (int g=0; g<2; g+=1)
{
for (int m=0; m<NumMonsters; m+=1)
{
for (int a=0; a<2; a+=1)
{
monsters [ g ] [ m ] [ a ] = random ( range [ a ] [ 0 ] , range [ a ] [ 1 ] ) ;
}
}
}
// ----- print monsters -----
for (int m=0; m<NumMonsters; m+=1)
{
for (int g=0; g<2; g+=1) // group
{
printf("Monster %d : (", m+1);
for (int a=0; a<2; a+=1) // attribute
{
printf("%3d", monsters[ g ] [ m ] [ a ]);
}
printf(") ");
}
printf("\n");
}
// ----- calculate scores -----
for (int g=0; g<2; g+=1)
{
int score = 0;
int me = g, enemy = !g;
for (int m=0; m<NumMonsters; m+=1)
{
int survived = 1;
for (int n=0; n<NumMonsters; n+=1)
{
if (Beat ( monsters [ enemy ] [ n ] [ 0 ] , monsters [ enemy ] [ n ] [ 1 ] , monsters [ me ] [ m ] [ 0 ] , monsters [ me ] [ m ] [ 1 ] ) == 1)
{
survived = 0;
break;
}
}
score += survived;
}
printf("%d ", score);
}
printf("\n");
return 0;
}