代码之家  ›  专栏  ›  技术社区  ›  catodd

C-试图将整数和结构数组存储到二进制文件中

  •  1
  • catodd  · 技术社区  · 2 年前

    我正在尝试制作一个游戏,为每个玩家提供结构,并将这些玩家结构存储在一个数组中。现在我正试图为游戏添加一个保存/加载功能,保存玩家数量和每个玩家的结构,但由于某种原因,我不知道如何正确存储数据。我使用的是一个二进制文件,并试图将整个数组转发到变量中,这样游戏就可以继续了,但它要么根本不加载文件,要么游戏将玩家计数读取为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;
    }
    
    
    

    我曾尝试单独存储每个结构并单独读取每个结构,并在加载时调试打印播放计数,但每次播放计数都读取为0,所以我想知道它是否保存不正确,或者它是否保存在结构的整数上。

    1 回复  |  直到 2 年前
        1
  •  1
  •   tinman    2 年前

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

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

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

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