面向接口封装案例

案例背景:在这里插入图片描述
案例需求:
在这里插入图片描述
案例要求:
在这里插入图片描述
编程提示:
在这里插入图片描述

甲方实现代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/m0_53157173/article/details/114188210