案例背景:
案例需求:
案例要求:
编程提示:
甲方实现代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//初始化游戏 参数1 玩家指针 参数2 玩家姓名
typedef void(*INIT_GAME)(void** player, char* name);
//副本战斗 返回战斗是否胜利 1 代表胜利 0代表失败 参数1 玩家 参数2 游戏副本难度
typedef int(*FIGHT_GAME)(void* player, int gameDiff);
//查看玩家信息
typedef void(*PRINT_GAME)(void* player);
//离开游戏
typedef void(*EXIT_GAME)(void* player);
void playGame(INIT_GAME init,FIGHT_GAME fight,PRINT_GAME print,EXIT_GAME exitGame)
{
//初始化游戏
void* player = NULL;
char userName[64];
printf("请输入玩家的姓名:");
scanf("%s", userName);
init(&player, userName);
//副本难度
int diff = -1;
printf("副本难度:\n");
printf("1.简单\n");
printf("2.中等\n");
printf("3.困难\n");
scanf("%d", &diff);
//战斗
int ret = fight(player, diff);
if (ret == 0)
{
printf("游戏失败\n");
}
else
{
printf("挑战成功,玩家当前信息如下:\n");
print(player);
}
//关闭游戏
exitGame(player);
}
int main()
{
return 0;
}
乙方实现代码
company1.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
struct person
{
char name[64];//玩家姓名
int level; //玩家等级
int exp; //玩家经验
};
//初始化游戏 参数1 玩家指针 参数2 玩家姓名
void INTI_GAME_COMPANY1(void** player, char* name);
//副本战斗 返回战斗是否胜利 1 代表胜利 0代表失败 参数1 玩家 参数2 游戏副本难度
int FIGHT_GAME_COMPANY1(void* player, int gameDiff);
//查看玩家信息
void PRINT_GAME_COMPANY1(void* player);
//离开游戏
void EXIT_GAME_COMPANY1(void* player);
//判断是否胜利
int isWin(int winRate,int diff);
company1.cpp
#include"company1.h"
//初始化游戏 参数1 玩家指针 参数2 玩家姓名
void INTI_GAME_COMPANY1(void** player, char* name)
{
person* player1 = (person*)malloc(sizeof(person));
*player = player1;
strcpy(player1->name, name);
player1->exp = 0;
player1->level = 0;
}
//副本战斗 返回战斗是否胜利 1 代表胜利 0代表失败 参数1 玩家 参数2 游戏副本难度
int FIGHT_GAME_COMPANY1(void* player, int gameDiff)
{
struct person *player1 = (person*)player;
//增加的经验值
int addExp = 0;
switch (gameDiff)
{
case 1:
//简答难度:0.9的胜率
addExp = isWin(90, 1);
break;
case 2:
//普通难度:0.5的胜率
addExp = isWin(50, 2);
break;
case 3:
//困难难度:0.3的胜率
addExp = isWin(30, 3);
break;
default:
break;
}
player1->exp += addExp;
player1->level += addExp / 10;
//判断战斗是否成功
if (addExp == 0)
{
return 0;
}
else
{
return 1;
}
}
//查看玩家信息
void PRINT_GAME_COMPANY1(void* player)
{
struct person* player1 = (person*)player;
printf("玩家的姓名[%s]\t当前等级:%d\t当前经验:%d",player1->name,player1->level,player1->exp);
}
//离开游戏
void EXIT_GAME_COMPANY1(void* player)
{
if (player == NULL)
{
return;
}
free(player);
player= NULL;
}
//判断是否胜利:返会的是增加的经验值
int isWin(int winRate,int diff)
{
//随机数种子
srand((unsigned int)time(NULL));
//随机值
int random = rand() % 100 + 1;//0~100
if (random <= winRate)
{
//成功返回对应难度等级*10的经验值
return diff * 10;
}
else
{
//失败0经验
return 0;
}
}
只需要对甲方代码进行乙方代码的头文件添加即可 这里对甲方代码进行了优化
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include"company1.h"
//初始化游戏 参数1 玩家指针 参数2 玩家姓名
typedef void(*INIT_GAME)(void** player, char* name);
//副本战斗 返回战斗是否胜利 1 代表胜利 0代表失败 参数1 玩家 参数2 游戏副本难度
typedef int(*FIGHT_GAME)(void* player, int gameDiff);
//查看玩家信息
typedef void(*PRINT_GAME)(void* player);
//离开游戏
typedef void(*EXIT_GAME)(void* player);
void playGame(INIT_GAME init,FIGHT_GAME fight,PRINT_GAME print,EXIT_GAME exitGame)
{
//初始化游戏
void* player = NULL;
char userName[64];
printf("请输入玩家的姓名:");
scanf("%s", userName);
init(&player, userName);
//副本难度
int diff = -1;
while (1)
{
//阻塞一下
_getch();
system("cls");
printf("副本难度:\n");
printf("1.简单\n");
printf("2.中等\n");
printf("3.困难\n");
scanf("%d", &diff);
//这里的换行符可以不取走
//因为这里没有字符输入
//getchar();//取走换行符
//战斗
int ret = fight(player, diff);
if (ret == 0)
{
printf("游戏失败\n");
break;
}
else
{
printf("挑战成功,玩家当前信息如下:\n");
print(player);
}
}
//关闭游戏
exitGame(player);
}
int main()
{
playGame(INTI_GAME_COMPANY1, FIGHT_GAME_COMPANY1, PRINT_GAME_COMPANY1, EXIT_GAME_COMPANY1);
return 0;
}