我正在try 制作一个游戏,其中每个玩家都有 struct ,并将这些玩家 struct 存储在一个数组中.现在,我试图在游戏中添加一个保存/加载功能,保存玩家的数量和每个玩家的 struct ,但由于某些原因,我不知道如何正确地存储数据.我正在使用一个二进制文件,并try 将整个数组读入变量,这样游戏就可以继续,但它要么根本不加载文件,要么游戏将playercount读取为0并直接结束.有什么建议吗?谢谢你的帮助.抱歉,代码太长了.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct {
    int active;
    int team;
    int number;
    int health;
    char type;
    int speed;
    int stunned;
    int move1effect;
    int move2effect;
    int move3effect;
    int move4effect;
    int move1dmg;
    int move2dmg;
    int move3dmg;
    int move4dmg;
    int move1hitchance;
    int move2hitchance;
    int move3hitchance;
    int move4hitchance;
    char move1name[50];
    char move2name[50];
    char move3name[50];
    char move4name[50];
    char move1type;
    char move2type;
    char move3type;
    char move4type;
} playerdata;

playerdata addPlayer(int selection, int team, int number){

}

void moveprompt(playerdata* p){

}

void moveeffect(playerdata* cP, int target, playerdata* pptr[], int damagemultiplier, int miss, int movehitchance, int movedmg, char movename[], int moveeffect){

}

}
void maketurn(playerdata* cP, int currentP, int sel, int target, playerdata* pptr[]){

}

void printplayerstatus(playerdata* pptr[], int playercount){
       
}


int main(){
int c= 1;
srand(time(NULL));
FILE* file = fopen("file.bin", "wb");
if (file == NULL){
printf("Error opening file");
return 1;
}
int playercount=0;
int numofplayers=0;
int numofcpus=0;

int gametype;
playerdata* ptr[50];
playerdata p[50];
printf(
    "Start new game or load previous save?\n"
    "1: Start new game\n"
    "2: Load previous save\n"
);
scanf("%d",&gametype);

if(gametype == 1){
int selection = 0, team = 0;
 
    printf("How many player characters?(1-5)\n");
    scanf("%d", &numofplayers);

    printf("How many computer players?(1-5)\n");
    scanf("%d", &numofcpus);
    
    playercount = numofplayers + numofcpus;
    //playerdata p[playercount];
    for(int i = 0; i<playercount; i++){
        ptr[i] = &p[i];
    }
    for(int i = 0; i<numofplayers; i++){
    printf("Player %d: Select a Character\n"
            "1: Charmander (Fire type, 2x Damage to Bulbasaur)\n"
            "2: Bulbasaur (Grass type, 2x Damage to Squirtle)\n"
            "3: Squirtle (Water Type, 2x Damage to Charmander)\n", i+1
            );
    scanf("%d", &selection);
    team = 1;
     p[i] = addPlayer(selection, team, i+1);
    }
   
    for(int i = 0; i<numofcpus; i++){
    selection = 0, team = 0;

    int r = rand() % 3;
    selection = (r+1);
    team = 2; 
     p[i+numofplayers] = addPlayer(selection, team, (i+1)+numofplayers);
    }
}

if(gametype == 2){
    int eof=0;
    while(!eof){
        fread(&playercount, sizeof(int),1,file);
        //playerdata p[playercount];
        printf("Playercount: %d\n",playercount);
        
        for(int i = 0; i<playercount; i++){
            ptr[i]=&p[i];
        }
        fread(p, sizeof(playerdata),playercount,file);
        eof=feof(file);
    }
}

playerdata* pptr[playercount];
    for(int i = 0; i<playercount; i++){
        pptr[i] = ptr[i];
    }

playerdata* turnptr[playercount];

for(int i = 0; i<playercount; i++){
turnptr[i]= pptr[i];
}


while(c==1){//main game loop as long as 1 team is alive
int team1Alive = 0;
int team2Alive = 0;
for(int i = 0; i<playercount; i++){
    if(turnptr[i]->active == 1){
        if(turnptr[i]->health > 0){
             if(turnptr[i]->team == 1){
                team1Alive = 1;
            }else if (turnptr[i]->team==2){
                team2Alive= 1;
            }
            printplayerstatus(pptr, playercount);  
            
            if(turnptr[i]->stunned != 1){
                    
                int sel = 0;
                int target = 0;
                printf("\nPLAYER %d'S TURN:\n",turnptr[i]->number);
                moveprompt(turnptr[i]);
                if(turnptr[i]->team == 1){
                    
                    scanf("%d", &sel);
                   if(sel==5){
                    printf("saving...\n");
                    fwrite(&playercount, sizeof(int), 1, file);
                    for(int i = 0; i<playercount; i++){
                        fwrite(pptr[i],sizeof(playerdata),1,file);
                    }
                    
                    printf("Wrote to file successfully.\n");
                    return 0;
                   }
                    if(sel!=4){
                        printf("Who to attack? (Enter player number) \n");
                        scanf("%d",&target);
                    }
                }else if (turnptr[i]->team == 2){
                    sel = ((rand() % 4)+1);
                    target = ((rand() % 2)+1);
                }

            maketurn(turnptr[i],turnptr[i]->number, sel, target, pptr);
        
            }else if(turnptr[i]->stunned == 1){
                printf("Player %d is stunned and cannot move!\n",turnptr[i]->number);
                turnptr[i]->stunned = 0;
            }
        }//end if hp>0 loop
    }
}

     if(team1Alive != 1){
        printf("Team 2 Wins!\n");
        c=5;
    }
    if(team2Alive != 1){
        printf("Team 1 Wins!\n");
        c=5;
    }
    
}

fclose(file);
return 0;
}


我try 逐个存储和读取每个 struct ,并在加载时调试打印playercount,但每次playercount读取为0,所以我想知道它是否没有正确保存,或者是否通过 struct 保存了整数.

推荐答案

在程序开始时打开文件,如下所示:

FILE* file = fopen("file.bin", "wb");

请注意,作为模式参数的"w"(以及带有二进制选项的"wb")将销毁文件内容(如果它已经存在),因此您无法加载任何内容.

https://en.cppreference.com/w/c/io/fopen

C++相关问答推荐

问关于C中的指针和数组

想了解 struct 指针和空指针转换

GCC:try 使用—WError或—pedantic using pragmas

当main函数调用被重构时,C函数给出错误的结果

为什么复合文字(C99)的返回会生成更多的汇编代码?

*p[num]和(*p)num的区别

为什么cudaFree不需要数据 struct 的地址?

将数据移动到寄存器时出现分段故障

为什么我的Hello World EFI程序构建不正确?

getline()从c中的外部函数传递指针时输出null

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

在C中创建任意类型的只读指针参数

在C++中允许使用字符作为宏参数

为什么WcrTomb只支持ASCII?

C++中PUTS函数的返回值

为什么我的旧式&q;函数在传递浮点数时会打印2?

C:面筋蛋白';为什么不刷新窗口?

生成的头文件不包括用户定义的文件

如何正确探测平台设备?

我如何(合规地)从 tmpfile() 读取?