1、案例背景
一般的企业信息系统都有成熟的框架。软件框架一般不发生变化,能自由的集成第三方厂商的产品。
2、案例需求
要求在企业信息系统框架中集成第三方厂商的游戏功能产品。软件设计要求:能够满足用户需求,完成的产品可以与用户完美对接。
3、案例要求
1)能支持多个厂商的游戏功能产品入围
2)能够实现第三方产品和用户产品的对接
3)系统整体框架不轻易发生改变
4、编程提示
1)抽象游戏中玩家结构体设计(struct Player)
2)框架接口设计(playGame)
- 初始化游戏
- 核心功能战斗
- 查看玩家信息
- 结束游戏
3)a、游戏厂商1入围(GameCompany1)
b、游戏厂商2入围(GameCompany2)
4)框架接口分文件编写
5、代码实现
//--------------- GameCompany.h ---------------//
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Player
{
char name[64]; //玩家姓名
int level; //玩家等级
int exp; //玩家经验
};
//初始化游戏
void INIT_GAME_COMPANY(void ** gameHandle, char * name);
//游戏战斗 返回游戏战斗结果 如果是1 代表游戏胜利 返回 0代表战斗失败
int FIGHT_GAME_COMPANY(void * gameHandle, int gameLevel);
//查看玩家信息
void PRINT_GAME_COMPANY(void * gameHandle);
//离开游戏
void CLOSE_GAME_COMPANY(void * gameHandle);
//判断游戏是否胜利 参数1 胜率 参数2 难度 返回值 胜利后的经验,如果返回的是0 代表战斗失败
int isWin(int winRate, int diff);
//--------------- GameCompany.c ---------------//
#include "GameCompany.h"
//初始化游戏
void INIT_GAME_COMPANY(void ** gameHandle, char * name)
{
struct Player * player = malloc(sizeof(struct Player));
if (player == NULL)
{
return;
}
//玩家进行初始化操作
strcpy(player->name, name);
player->level = 0;
player->exp = 0;
*gameHandle = player;
}
//游戏战斗 返回游戏战斗结果 如果是1 代表游戏胜利 返回 0代表战斗失败
int FIGHT_GAME_COMPANY(void * gameHandle, int gameLevel)
{
struct Player * player = gameHandle;
int addExp = 0; //累积的经验值
switch (gameLevel)
{
case 1:
//内部提供一个函数 判断游戏是否胜利
addExp = isWin(90, 1);
break;
case 2:
addExp = isWin(50, 2);
break;
case 3:
addExp = isWin(30, 3);
break;
default:
break;
}
//将获取的经验 给人物身上
player->exp += addExp;
player->level = player->exp / 10;
if (addExp == 0)
{
return 0; //战斗失败
}
else
{
return 1; //战斗胜利
}
}
//查看玩家信息
void PRINT_GAME_COMPANY(void * gameHandle)
{
struct Player * player = gameHandle;
printf("玩家 <%s> --------- 当前等级 <%d> ------ 当前经验 ------ <%d>\n", player->name, player->level, player->exp);
}
//离开游戏
void CLOSE_GAME_COMPANY(void * gameHandle)
{
if (gameHandle == NULL)
{
return;
}
free(gameHandle);
gameHandle = NULL;
}
//判断游戏是否胜利 参数1 胜率 参数2 难度 返回值 胜利后的经验,如果返回的是0 代表战斗失败
int isWin(int winRate, int diff)
{
int random = rand() % 100 + 1; // 1 ~ 100
if (random <= winRate)
{
//代表胜利
return 10 * diff;
}
else
{
//战斗失败 返回 0
return 0;
}
}
//-------------------- main.c -------------------//
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "GameCompany.h"
#include <time.h>
//初始化游戏
typedef void(*INIT_GAME)(void ** gameHandle, char * name);
//游戏战斗 返回游戏战斗结果 如果是1 代表游戏胜利 返回 0代表战斗失败
typedef int(*FIGHT_GAME)(void * gameHandle, int gameLevel);
//查看玩家信息
typedef void(*PRINT_GAME)(void * gameHandle);
//离开游戏
typedef void(*CLOSE_GAME)(void * gameHandle);
void playGame(INIT_GAME init, FIGHT_GAME fight, PRINT_GAME printGame, CLOSE_GAME closeGame)
{
//初始化游戏
void * gameHandel = NULL;
printf("请输入玩家的姓名:\n");
char name[64];
scanf("%s", name);
init(&gameHandel, name);
//游戏战斗
int level = -1;
while (1)
{
getchar();
system("cls"); //清屏
printf("请选择游戏难度:\n");
printf("1、普通\n");
printf("2、中等\n");
printf("3、困难\n");
scanf("%d", &level);
getchar();
int ret = fight(gameHandel, level);
if (ret == 0)
{
printf("挑战失败\n");
break;
}
else
{
printf("挑战成功\n");
printGame(gameHandel);
}
}
//离开游戏
closeGame(gameHandel);
}
int main(){
srand((unsigned int)time(NULL));
playGame(INIT_GAME_COMPANY, FIGHT_GAME_COMPANY, PRINT_GAME_COMPANY, CLOSE_GAME_COMPANY);
system("pause");
return EXIT_SUCCESS;
}
}
}
//离开游戏
closeGame(gameHandel);
}
int main(){
srand((unsigned int)time(NULL));
playGame(INIT_GAME_COMPANY, FIGHT_GAME_COMPANY, PRINT_GAME_COMPANY, CLOSE_GAME_COMPANY);
system("pause");
return EXIT_SUCCESS;
}