用c语言编写原神中的元素伤害机制,要求用到指针,结构函数,链表等相关知识
时间: 2023-08-15 12:22:05 浏览: 86
C语言程序(链表,指针,数组)
元素伤害机制是原神中非常重要的一个机制,它负责处理不同元素之间的相克关系和伤害计算。下面是一份用C语言编写的元素伤害机制的示例代码,其中用到了指针、结构体、函数、链表等相关知识。
首先,我们需要定义一些基本的数据结构,如下所示:
```c
// 元素类型
typedef enum {
ELEMENT_TYPE_PYRO, // 火
ELEMENT_TYPE_HYDRO, // 水
ELEMENT_TYPE_CRYO, // 冰
ELEMENT_TYPE_ELECTRO, // 雷
ELEMENT_TYPE_ANEMO, // 风
ELEMENT_TYPE_GEO, // 岩
ELEMENT_TYPE_DENDRO // 草
} ElementType;
// 元素属性
typedef struct {
ElementType type; // 元素类型
int damage; // 元素伤害值
} ElementProperty;
// 元素相克关系
typedef struct {
ElementType source; // 被攻击者的元素类型
ElementType target; // 攻击者的元素类型
float factor; // 相克系数
} ElementRelation;
```
然后,我们需要定义一些处理元素伤害的函数,如下所示:
```c
// 计算元素相克系数
float calculateElementFactor(ElementType source, ElementType target, ElementRelation *relations, int count) {
for (int i = 0; i < count; i++) {
if (relations[i].source == source && relations[i].target == target) {
return relations[i].factor;
}
}
return 1.0f;
}
// 计算元素伤害值
int calculateElementDamage(ElementType source, ElementType target, ElementProperty *properties, ElementRelation *relations, int count) {
float factor = calculateElementFactor(source, target, relations, count);
for (int i = 0; i < count; i++) {
if (properties[i].type == target) {
return (int)(properties[i].damage * factor);
}
}
return 0;
}
```
最后,我们可以使用链表来存储所有的元素属性和相克关系,如下所示:
```c
// 元素属性链表节点
typedef struct _ElementPropertyNode {
ElementProperty property; // 元素属性
struct _ElementPropertyNode *next; // 下一个节点
} ElementPropertyNode;
// 元素相克关系链表节点
typedef struct _ElementRelationNode {
ElementRelation relation; // 元素相克关系
struct _ElementRelationNode *next; // 下一个节点
} ElementRelationNode;
// 添加元素属性到链表
void addElementPropertyToList(ElementPropertyNode **list, ElementProperty property) {
ElementPropertyNode *newNode = (ElementPropertyNode*) malloc(sizeof(ElementPropertyNode));
newNode->property = property;
newNode->next = NULL;
if (*list == NULL) {
*list = newNode;
} else {
ElementPropertyNode *p = *list;
while (p->next != NULL) {
p = p->next;
}
p->next = newNode;
}
}
// 添加元素相克关系到链表
void addElementRelationToList(ElementRelationNode **list, ElementRelation relation) {
ElementRelationNode *newNode = (ElementRelationNode*) malloc(sizeof(ElementRelationNode));
newNode->relation = relation;
newNode->next = NULL;
if (*list == NULL) {
*list = newNode;
} else {
ElementRelationNode *p = *list;
while (p->next != NULL) {
p = p->next;
}
p->next = newNode;
}
}
// 从链表中删除元素属性
void removeElementPropertyFromList(ElementPropertyNode **list, ElementType type) {
ElementPropertyNode *p = *list;
ElementPropertyNode *prev = NULL;
while (p != NULL) {
if (p->property.type == type) {
if (prev == NULL) {
*list = p->next;
} else {
prev->next = p->next;
}
free(p);
break;
}
prev = p;
p = p->next;
}
}
// 从链表中删除元素相克关系
void removeElementRelationFromList(ElementRelationNode **list, ElementType source, ElementType target) {
ElementRelationNode *p = *list;
ElementRelationNode *prev = NULL;
while (p != NULL) {
if (p->relation.source == source && p->relation.target == target) {
if (prev == NULL) {
*list = p->next;
} else {
prev->next = p->next;
}
free(p);
break;
}
prev = p;
p = p->next;
}
}
// 释放元素属性链表的内存
void freeElementPropertyList(ElementPropertyNode *list) {
ElementPropertyNode *p = list;
while (p != NULL) {
ElementPropertyNode *tmp = p->next;
free(p);
p = tmp;
}
}
// 释放元素相克关系链表的内存
void freeElementRelationList(ElementRelationNode *list) {
ElementRelationNode *p = list;
while (p != NULL) {
ElementRelationNode *tmp = p->next;
free(p);
p = tmp;
}
}
```
这样,我们就可以使用上述代码来处理元素伤害了。需要注意的是,这只是一份基础的示例代码,实际应用中还需要考虑更多的因素,如元素增幅、暴击率等等。
阅读全文