背景
企业信息系统一般都有各自成熟的框架,在软件框架不发生变化的前提下可以自由的集成第三方厂商的产品。
案例需求
在企业信息系统框架中集成第三方厂商的游戏功能产品。软件设计要求:能够满足用户需求,完成的产品可以与用户完美对接。
案例要求
- 能支持多个厂商的游戏功能产品入围
- 能够实现第三方产品和用户产品的对接
- 系统整体框架不轻易发生改变
编程提示
- 抽象游戏中玩家结构体设计(struct Player)
- 框架接口设计(playGame)
- 初始化游戏
- 核心功能战斗
- 查看玩家信息
- 结束游戏
- a游戏厂商1入围(GameCompany1), b 游戏厂商2入围(GameCompany2)
- 框架接口分文件编写
编程说明
甲方定义接口
#define _CRT_SECURE_NO_WARNINGS //VS下使用传统库函数 会建议用_s更安全函数,如果不用会报错误 C4996
#include<stdio.h> //标准 i input 输入 o output 输出
#include<string.h> //对字符串处理 strcat strstr strcmp strcpy
#include<stdlib.h> //malloc free
#include "gameCompany1.h" //引入接口实现
#include <time.h>
/***********************开始定义接口*************************/
//使用typedef声明函数指针变量
//指向函数的指针INIT_GAME变量,类型为 void(*)(void ** player , char * name)
//初始化游戏 参数1 玩家指针 参数2 玩家姓名
typedef void(*INIT_GAME)(void ** player , char * name);
//副本战斗 返回战斗是否胜利 1、代表胜利 0、代表失败 参数1 玩家 参数2 游戏副本难度
//指向函数的指针FIGHT_GAME变量,类型为 int(*)(void *, int)
typedef int(*FIGHT_GAME)(void * player, int gameDiff);
//指向函数的指针PRINT_GAME变量,类型为 void(*)(void * player)
//查看玩家信息
typedef void(*PRINT_GAME)(void * player);
//离开游戏
typedef void(*EXIT_GAME)(void * player);
/***********************完成接口定义*************************/
/***********************程序处理方法*************************/
/**
* INIT_GAME init
* FIGHT_GAME fight
* PRINT_GAME printGame
* EXIT_GAME exitGame
* 四个乙方提供的回调函数
*/
void playGame(INIT_GAME init, FIGHT_GAME fight, PRINT_GAME printGame, EXIT_GAME exitGame)
{
//初始化游戏
void * player = NULL;
printf("请输入姓名:\n");
char userName[64];
scanf("%s", userName);
//调用初始化函数
init(&player, userName);
//副本难度 变量
int diff = -1;
while (1)
{
getchar();
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");
//调用乙方打印函数
printGame(player);
}
}
//关闭游戏
exitGame(player);
}
/***********************主方法*************************/
int main(){
srand((unsigned int)time(NULL));
playGame(INIT_GAME_COMPANY1, FIGHT_GAME_COMPANY1, PRINT_GAME_COMPANY1, EXIT_GAME_COMPANY1);
system("pause");
return EXIT_SUCCESS;
}
乙方提供接口实现
gameCompany1.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; //玩家经验
};
//初始化游戏 参数1 玩家指针 参数2 玩家姓名
void INIT_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);
具体实现gameCompany1.c
#include "gameCompany1.h"
//初始化游戏 参数1 玩家指针 参数2 玩家姓名
void INIT_GAME_COMPANY1(void ** player, char * name)
{
struct Player * player1 = malloc(sizeof(struct Player));
if (player1 == NULL)
{
printf("初始化失败\n");
return;
}
*player = player1;
strcpy(player1->name, name);
player1->level = 0;
player1->exp = 0;
}
//副本战斗 返回战斗是否胜利 1、代表胜利 0、代表失败 参数1 玩家 参数2 游戏副本难度
int FIGHT_GAME_COMPANY1(void * p, int gameDiff)
{
struct Player * player = p;
int addExp = 0; //增加经验值
switch (gameDiff)
{
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 == (*player).exp == 结构体变量.exp
player->exp += addExp;
player->level = player->exp / 10;
if (addExp == 0)
{
return 0;
}
else
{
return 1;
}
}
//判断游戏是否胜利,winRate胜率,diff经验值
int isWin(int winRate, int diff)
{
int random = rand() % 100 + 1; // 1 ~ 100
//随机数在指定的胜率中,获胜
if (random <= winRate)
{
return diff * 10;
}
else
{
return 0;
}
}
//查看玩家信息
void PRINT_GAME_COMPANY1(void * p)
{
struct Player * player = p;
printf("玩家<%s> ------ 当前等级:<%d>级 ----- 当前经验: <%d> \n", player->name, player->level, player->exp);
}
//离开游戏
void EXIT_GAME_COMPANY1(void * player)
{
if ( player==NULL)
{
return;
}
free(player);
player = NULL;
}