实验练习和要求
1、给出世界杯足球点球大战的规则。
前5轮式比较总进球数,5轮之后将继续按照名单顺序进行,但变为1球决胜制,即一旦一方罚进点球而另一方罚失!
2、给出世界杯足球点球大战的算法设计。
利用随机数来模拟不确定性和随机性,以模拟真实点球大战中的各种可能情况。通过重复多次的随机选择,模拟了点球的射门结果,并根据进球数来判断比赛的胜负。
3、给出世界杯足球点球大战的C程序代码。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义球队名称和数量
#define Teams 2
#define Team1 "球队 1"
#define Team2 "球队 2"
// 定义轮数
#define Rounds 5
// 定义比赛结果
enum Result {
WIN, // 赢
LOSS, //输
DRAW //平局
};
// 定义点球结果
enum PenaltyResult {
GOAL, //进球
MISS //失手
};
// shootPenalty 函数用于模拟一次点球。它使用随机数来决定点球的结果,并根据结果输出相应的消息。
enum PenaltyResult shootPenalty(const char *team) {
// 随机决定点球结果
int random = rand() % 2;
// 进球或失手
enum PenaltyResult result = (random == 0)? GOAL : MISS;
// 输出点球结果
printf("%s %s ", team, (result == GOAL)? "进球" : "失手");
if (result == GOAL) {
printf("噢耶,进球了,进球了!\n");
}
else {
printf("哎!差一点,加油!\n");
}
return result;
}
// 模拟点球大战
void playPenaltyShootout() {
int sum1=0;
int sum2=0;
int i;
// 模拟每一轮点球
for (i = 0; i < Rounds; i++) {
//球队1点球
enum PenaltyResult result1 = shootPenalty(Team1);
sum1 += result1 == GOAL? 1 : 0;
//球队2点球
enum PenaltyResult result2 = shootPenalty(Team2);
sum2 += result2 == GOAL? 1 : 0;
printf("\n");
if(i==4){
printf("五轮执行结束!\n");
}
if(abs(sum1-sum2)> 4-i){
break;
}
}
// 如果前五轮是平局,进行下一轮点球
while (sum1 == sum2) {
// 球队 1 进行下一轮轮点球
enum PenaltyResult result1 = shootPenalty(Team1);
sum1 += result1 == GOAL? 1 : 0;
// 球队 2 进行下一轮点球
enum PenaltyResult result2 = shootPenalty(Team2);
sum2 += result2 == GOAL? 1 : 0;
}
enum Result gameResult = (sum1 > sum2)? WIN : (sum1 < sum2)? LOSS : DRAW;
// 输出比赛结果
printf("比赛结果: %s : %s = %d : %d %s 获胜\n", Team1, Team2, sum1, sum2, (gameResult == WIN)? Team1 : Team2);
}
int main() {
//初始化随机数生成器
srand(time(NULL));
printf("双方开始准备点球!\n\n");
playPenaltyShootout();
return 0;
}
4、给出世界杯足球点球大战的测试结果截图
用一下三种截图,才能完成所有功能,包含三种截图:
1、提前结束 如4:1
提前结束,即五轮以内就完成了比赛!
截图如下:
2、 正常结束 如2:3
正常结束,即到第五轮才比出胜负!
截图如下:
3、 加时先进球获胜 如 6:5 4:3(至少6轮)
五轮结束后,两队比分仍然是平局,需要进行下一轮!
截图如下:
觉得还行的朋友可以点个赞,谢谢啦!