Post by huangno1 on Feb 25, 2017 6:55:50 GMT -8
程式說明
剪刀、石頭、布!不囉嗦,遊戲規則:剪刀勝布、布勝石頭、石頭勝剪刀。
本功能需四個支援函式:
(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) 支援函式 GenerateSSP()
(2.1) 該函式無參數 (no parameter)。
(2.2) 該函式的回傳值為整數型態,且為 0, 2, 和5 中的任一值(相等機率)(return 0, 2, or 5 in equal probability)。
(2.3) 本函式中不可使用任何控制敘述如 if 和 switch。(Don’t use if and switch.)
(2.4) 提示:使用陣列和 random() 函式。(Hint: Use arrays and random().)
(3) 支援函式 PrintSSP()
(3.1) 該函式有一個參數 (one parameter) f,為整數型態。
(3.2) 該函式無回傳值 (no return value)。
(3.3) 假設傳入的值只會是 {0, 2, 5} 其中一個值 (f {0, 2, 5})。若傳入值為0,列印 Rock;傳入值為2,列印 Scissors,傳入值為 5,列印 Paper。
(4) 支援函式 WinOrLose()
(4.1) 該函式有兩個參數lhs和rhs,均為整數型態。假設 lhs 和 rhs 的值均只會是 {0, 2, 5} 其中一個值 (lhs/rhs {0, 2, 5}),且 0, 2, 5 分別代表石頭、剪刀和布。
(4.2) 該函式的回傳值為整數型態,代表lhs 與 rhs 的勝負結果。
(4.3) 若 lhs 勝,回傳 1;若 lhs 敗,回傳 -1;若平手,回傳 0。(lhs wins, return 1; lhs loses, return -1; otherwise, return 0.)
(4.4) 呼叫 WinOrLose(2, 5) 應傳回 1;
呼叫 WinOrLose(5, 5) 應傳回 0;
呼叫 WinOrLose(0, 5) 應傳回 -1。
(5) 主函式中的功能:
當使用者選擇此功能,程式將呼叫 GenerateSSP() 自動產生兩方的拳形(剪刀 (2) /石頭 (0) /布 (5)),以 WinOrLose() 判斷勝負並藉助 PrintSSP() 列印勝負結果,若平手就反覆進行 (repeats when in a draw),直到分出勝負為止。(列印格式請參照範例。)
[範例1]
Rock, Paper, Scissors!
Stone vs. Scissors -> Left wins!
[範例2]
Rock, Paper, Scissors!
Paper vs. Paper -> Draw game!
Stone vs. Stone -> Draw game!
Paper vs. Paper -> Draw game!
Paper vs. Stone -> Left wins!
#include <stdio.h>
#include <stdlib.h>
constexpr int ROCK = 0, SCISSORS = 2, PAPER = 5;
int random(int lb, int ub)
{
return rand ( ) % ( ub - lb + 1 ) + lb ;
}
// --------------------------------------------------------
int GenerateSSP()
{
int fingers[3] = { 0 , 2 , 5 };
return fingers [ rand ( ) % 3 ];
}
// --------------------------------------------------------
void PrintSSP(int f)
{
if ( f == 0 ) printf ( "Rock" ) ;
else if ( f == 2 ) printf ( "Scissors" ) ;
else if ( f == 5 ) printf ( "Paper" ) ;
}
// --------------------------------------------------------
int WinOrLose(int lhs, int rhs)
{
if ( lhs == 0 )
{
if ( rhs == 0 ) return 0 ;
else if ( rhs == 2 ) return 1 ;
else if ( rhs == 5 ) return -1 ;
}
else if ( lhs == 2 )
{
if ( rhs == 0 ) return -1 ;
else if ( rhs == 2 ) return 0 ;
else if ( rhs == 5 ) return 1 ;
}
else if ( lhs == 5 )
{
if ( rhs == 0 ) return 1 ;
else if ( rhs == 2 ) return -1 ;
else if ( rhs == 5 ) return 0 ;
}
}
// --------------------------------------------------------
int main()
{
int seed = 0;
scanf("%d", &seed);
srand(seed); // 以上三行是為了檢查程式答案是否正確而寫的,正常應為 srand(time(0));
printf("Rock, Paper, Scissors!\n");
bool end_game = false;
do{
int lhs = GenerateSSP( ), rhs = GenerateSSP( );
PrintSSP ( lhs ) ;
printf(" vs. ");
PrintSSP ( rhs ) ;
printf(" -> ");
int result = WinOrLose ( lhs , rhs );
if (result > 0)
{
printf("Left wins!\n");
end_game = true;
}
else if (result < 0)
{
printf("Right wins!\n");
end_game = true;
}
else
{
printf("Draw game!\n");
}
}while ( ! ( end_game ));
return 0;
}
剪刀、石頭、布!不囉嗦,遊戲規則:剪刀勝布、布勝石頭、石頭勝剪刀。
本功能需四個支援函式:
(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) 支援函式 GenerateSSP()
(2.1) 該函式無參數 (no parameter)。
(2.2) 該函式的回傳值為整數型態,且為 0, 2, 和5 中的任一值(相等機率)(return 0, 2, or 5 in equal probability)。
(2.3) 本函式中不可使用任何控制敘述如 if 和 switch。(Don’t use if and switch.)
(2.4) 提示:使用陣列和 random() 函式。(Hint: Use arrays and random().)
(3) 支援函式 PrintSSP()
(3.1) 該函式有一個參數 (one parameter) f,為整數型態。
(3.2) 該函式無回傳值 (no return value)。
(3.3) 假設傳入的值只會是 {0, 2, 5} 其中一個值 (f {0, 2, 5})。若傳入值為0,列印 Rock;傳入值為2,列印 Scissors,傳入值為 5,列印 Paper。
(4) 支援函式 WinOrLose()
(4.1) 該函式有兩個參數lhs和rhs,均為整數型態。假設 lhs 和 rhs 的值均只會是 {0, 2, 5} 其中一個值 (lhs/rhs {0, 2, 5}),且 0, 2, 5 分別代表石頭、剪刀和布。
(4.2) 該函式的回傳值為整數型態,代表lhs 與 rhs 的勝負結果。
(4.3) 若 lhs 勝,回傳 1;若 lhs 敗,回傳 -1;若平手,回傳 0。(lhs wins, return 1; lhs loses, return -1; otherwise, return 0.)
(4.4) 呼叫 WinOrLose(2, 5) 應傳回 1;
呼叫 WinOrLose(5, 5) 應傳回 0;
呼叫 WinOrLose(0, 5) 應傳回 -1。
(5) 主函式中的功能:
當使用者選擇此功能,程式將呼叫 GenerateSSP() 自動產生兩方的拳形(剪刀 (2) /石頭 (0) /布 (5)),以 WinOrLose() 判斷勝負並藉助 PrintSSP() 列印勝負結果,若平手就反覆進行 (repeats when in a draw),直到分出勝負為止。(列印格式請參照範例。)
[範例1]
Rock, Paper, Scissors!
Stone vs. Scissors -> Left wins!
[範例2]
Rock, Paper, Scissors!
Paper vs. Paper -> Draw game!
Stone vs. Stone -> Draw game!
Paper vs. Paper -> Draw game!
Paper vs. Stone -> Left wins!
#include <stdio.h>
#include <stdlib.h>
constexpr int ROCK = 0, SCISSORS = 2, PAPER = 5;
int random(int lb, int ub)
{
return rand ( ) % ( ub - lb + 1 ) + lb ;
}
// --------------------------------------------------------
int GenerateSSP()
{
int fingers[3] = { 0 , 2 , 5 };
return fingers [ rand ( ) % 3 ];
}
// --------------------------------------------------------
void PrintSSP(int f)
{
if ( f == 0 ) printf ( "Rock" ) ;
else if ( f == 2 ) printf ( "Scissors" ) ;
else if ( f == 5 ) printf ( "Paper" ) ;
}
// --------------------------------------------------------
int WinOrLose(int lhs, int rhs)
{
if ( lhs == 0 )
{
if ( rhs == 0 ) return 0 ;
else if ( rhs == 2 ) return 1 ;
else if ( rhs == 5 ) return -1 ;
}
else if ( lhs == 2 )
{
if ( rhs == 0 ) return -1 ;
else if ( rhs == 2 ) return 0 ;
else if ( rhs == 5 ) return 1 ;
}
else if ( lhs == 5 )
{
if ( rhs == 0 ) return 1 ;
else if ( rhs == 2 ) return -1 ;
else if ( rhs == 5 ) return 0 ;
}
}
// --------------------------------------------------------
int main()
{
int seed = 0;
scanf("%d", &seed);
srand(seed); // 以上三行是為了檢查程式答案是否正確而寫的,正常應為 srand(time(0));
printf("Rock, Paper, Scissors!\n");
bool end_game = false;
do{
int lhs = GenerateSSP( ), rhs = GenerateSSP( );
PrintSSP ( lhs ) ;
printf(" vs. ");
PrintSSP ( rhs ) ;
printf(" -> ");
int result = WinOrLose ( lhs , rhs );
if (result > 0)
{
printf("Left wins!\n");
end_game = true;
}
else if (result < 0)
{
printf("Right wins!\n");
end_game = true;
}
else
{
printf("Draw game!\n");
}
}while ( ! ( end_game ));
return 0;
}