14、面向接口编程

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek@Yang

码字不易,来点鼓励~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值