• 본 게시판은 수업시간에 학생들 실습을 위한 게시판입니다.
  • 본 게시판에 올라와 있는 프로그램은 대부분 올바르지 않은 프로그램입니다.
        윤형식
        asdff



    #include <stdio.h>

    #include <string.h>

    #include <stdlib.h>

     

    // 해시맵의 각 엔트리를 나타내는 구조체

    struct HashEntry {

        char playerName[20];

        double balance;

    };

     

    // 해시맵 구조체

    struct HashMap {

        struct HashEntry entries[100];

        int size;

    };

     

    // 중립계좌

    struct HashEntry neutralAccount;

     

    // 나만의 해시 함수(murmur3 참고)

    unsigned int myHash(const char *key, unsigned int len) {

        const unsigned int c1 = 0xdeadbeef;

        const unsigned int c2 = 0xfaceb00c;

        const unsigned int seed = 0xabcdef01;

     

        unsigned int hash = seed;

     

        const int nblocks = len / 4;

        const unsigned int *blocks = (const unsigned int *)(key);

        int i;

        unsigned int k;

     

        for (i = 0; i < nblocks; i++) {

            k = blocks[i];

            k *= c1;

            k = (k << 15) | (k >> (32 - 15));

            k *= c2;

     

            hash ^= k;

            hash = (hash << 13) | (hash >> (32 - 13));

            hash = hash * 5 + 0xe6546b64;

        }

     

        const unsigned char *tail = (const unsigned char *)(key + nblocks * 4);

        unsigned int k1 = 0;

     

        switch (len & 3) {

            case 3:

                k1 ^= tail[2] << 16;

            case 2:

                k1 ^= tail[1] << 8;

            case 1:

                k1 ^= tail[0];

     

                k1 *= c1;

                k1 = (k1 << 15) | (k1 >> (32 - 15));

                k1 *= c2;

                hash ^= k1;

        }

     

        hash ^= len;

        hash ^= (hash >> 16);

        hash *= 0x85ebca6b;

        hash ^= (hash >> 13);

        hash *= 0xc2b2ae35;

        hash ^= (hash >> 16);

     

        return hash % 100;

    }

     

    // 계좌를 해시맵에 추가하는 함수

    void addAccount(struct HashMap *hashMap, const char *playerName, double balance) {

        if (hashMap->size < 100) {

            unsigned int index = myHash(playerName, (unsigned int)strlen(playerName)) % 100;

            struct HashEntry *entry = &(hashMap->entries[index]);

            

            // 중복된 플레이어 이름인 경우, 해당 플레이어의 계좌를 업데이트

            while (entry->balance != 0 && strcmp(entry->playerName, playerName) != 0) {

                index = (index + 1) % 100;

                entry = &(hashMap->entries[index]);

            }

            if (entry->balance != 0) {

                // 이미 존재하는 플레이어의 계좌를 업데이트

                entry->balance = balance;

            } else {

                // 새로운 플레이어의 계좌를 추가

                strncpy(entry->playerName, playerName, 19);

                entry->playerName[19] = '\0';

                entry->balance = balance;

                hashMap->size++;

            }

        }

    }

     

     

     

    void addBetToNeutralAccount(double betAmount) {

        neutralAccount.balance += betAmount;

    }

     

    void endGame(struct HashMap *hashMap) {

        if (neutralAccount.balance <= 0) {

            printf("중립 계좌 잔액이 부족합니다.\n");

            return;

        }

     

        // 게임 결과 계산하고 이긴 플레이어의 이름을 winningPlayer에 설정

        char winningPlayer[20];

     

        // 게임 결과 계산 및 이긴 플레이어 설정 코드 추가

     

        // 이긴 플레이어에게 배팅 이체

        unsigned int winningIndex = myHash(winningPlayer, (unsigned int)strlen(winningPlayer));

        if (winningIndex >= 100) {

            fprintf(stderr, "Error: Index out of bounds.\n");

            exit(EXIT_FAILURE);

        }

     

        struct HashEntry *winningEntry = &(hashMap->entries[winningIndex]);

        winningEntry->balance += neutralAccount.balance;

        printf("%s이(가) 이긴 플레이어로 선정되었습니다. %.2f가 이체되었습니다.\n", winningPlayer, neutralAccount.balance);

     

        // 중립 계좌 초기화

        printf("중립 계좌에 저장된 총 배팅 금액: %.2f\n", neutralAccount.balance);

        addBetToNeutralAccount(0);

    }

     

    double getBalance(struct HashMap *hashMap, const char *playerName) {

        if (hashMap == NULL) {

            fprintf(stderr, "Error: hashMap is NULL.\n");

            exit(EXIT_FAILURE);

        }

     

        unsigned int index = myHash(playerName, (unsigned int)strlen(playerName));

        if (index >= 100) {

            fprintf(stderr, "Error: Index out of bounds.\n");

            exit(EXIT_FAILURE);

        }

     

        struct HashEntry *entry = &(hashMap->entries[index]);

        int i = 1;

     

        // 선형 탐사를 통해 충돌 처리

        while (entry->balance != 0 && strcmp(entry->playerName, playerName) != 0) {

            index = (index + i) % 100;

            entry = &(hashMap->entries[index]);

            i++;

     

            // 모든 엔트리를 확인한 경우

            if (i > 100) {

                fprintf(stderr, "Error: Player not found.\n");

                return -1// 플레이어를 찾지 못한 경우 -1 반환

            }

        }

     

        return entry->balance;

    }

     

    void makeBet(struct HashMap *hashMap, const char *playerName, double betAmount) {

        if (hashMap == NULL) {

            fprintf(stderr, "Error: hashMap is NULL.\n");

            exit(EXIT_FAILURE);

        }

     

        double playerBalance = getBalance(hashMap, playerName);

     

        if (playerBalance == -1) {

            // 존재하지 않는 플레이어의 경우 오류 메시지 출력

            printf("플레이어를 찾을 수 없습니다.\n");

        } else if (betAmount > 0 && betAmount <= playerBalance) {

            unsigned int index = myHash(playerName, (unsigned int)strlen(playerName));

            if (index >= 100) {

                fprintf(stderr, "Error: Index out of bounds.\n");

                exit(EXIT_FAILURE);

            }

     

            struct HashEntry *entry = &(hashMap->entries[index]);

     

            // 이미 존재하는 플레이어의 계좌를 찾아 업데이트

            while (entry->balance != 0 && strcmp(entry->playerName, playerName) != 0) {

                index = (index + 1) % 100;

                entry = &(hashMap->entries[index]);

            }

     

            entry->balance -= betAmount;  // 이미 존재하는 플레이어의 계좌를 업데이트

            printf("%s이(가) %.2f를 배팅했습니다.\n", playerName, betAmount);

            addBetToNeutralAccount(betAmount);

        } else {

            printf("배팅할 금액이 유효하지 않거나 잔액이 부족합니다. 다시 시도하세요.\n");

        }

    }

     

     

    int main(void) {

        struct HashMap hashMap;

        hashMap.size = 0;

     

        addAccount(&hashMap, "Player1", 1000.0);

        addAccount(&hashMap, "Player2", 1000.0);

     

        while (1) {

            

            // 잔액 표시

            printf("플레이어 1 잔액: %.2f\n", getBalance(&hashMap, "Player1"));

            printf("플레이어 2 잔액: %.2f\n", getBalance(&hashMap, "Player2"));

            char playerName[20];

            // 초기 베팅

            makeBet(&hashMap, "Player1", 100.0);

            makeBet(&hashMap, "Player2", 100.0);

            printf("현재까지의 총 배팅 금액: %.2f\n", neutralAccount.balance);

            

          

            // playerName을 입력으로 받습니다.

                   printf("플레이어의 이름을 입력하세요: ");

                   if (scanf("%s", playerName) != 1) {

                       fprintf(stderr, "Error: Failed to read playerName.\n");

                       exit(EXIT_FAILURE);

                   }

     

                   // 수정된 부분 시작

                   double playerBalance = getBalance(&hashMap, playerName);

                   if (playerBalance == -1) {

                       printf("플레이어를 찾을 수 없습니다.\n");

                   } else {

                       printf("플레이어 %s 잔액: %.2f\n", playerName, playerBalance);

                   }

                   // 수정된 부분 끝

     

                   // 케이스 선택

                   printf("1. 콜\n2. 따당\n3. 쿼터\n4. 하프\n5. 풀\n6. 맥스\n");

                   int betOption;

                   printf("배팅 옵션을 선택하세요 (1-6): ");

                   if (scanf("%d", &betOption) != 1) {

                       fprintf(stderr, "Error: Failed to read betOption.\n");

                       exit(EXIT_FAILURE);

                   }

     

            // 추가 베팅

            switch (betOption) {

                case 1// 콜

                    makeBet(&hashMap, playerName, 100.0);

                    break;

                case 2// 따당

                    makeBet(&hashMap, playerName, 200.0);  // 100원 * 2

                    break;

                case 3// 쿼터

                    makeBet(&hashMap, playerName, neutralAccount.balance / 4);

                    break;

                case 4// 하프

                    makeBet(&hashMap, playerName, neutralAccount.balance / 2);

                    break;

                case 5// 풀

                    makeBet(&hashMap, playerName, neutralAccount.balance);

                    break;

                case 6// 맥스

                    makeBet(&hashMap, playerName, getBalance(&hashMap, playerName));

                    break;

                default:

                    printf("잘못된 선택입니다. 다시 시도하세요.\n");

                    continue;

            }

        }

     

        return 0;

    }

     

     

      등록일 : 2023-11-28 [14:57] 조회 : 76 다운 : 0   
     
    △ 이전글도전문제
    ▽ 다음글야구게임
    학생실습 게시판
    번호 제 목 이름 조회 등록일
    95 조건문 도전과제1 프로그래밍언어 최현우 24 04-12
    94 4월12일 세수 비교 실습 프로그래밍언어 윤영민 32 04-12
    93 도전문제 프로그래밍언어 이윤환 34 04-12
    92 asdff 비공개 프로그래밍언어 윤형식 76 11-28
    91 야구게임 프로그래밍언어 윤형식 73 11-28
    90 ddd 프로그래밍언어 윤형식 128 10-31
    89 실습2 프로그래밍언어 서성은 443 03-16
    88 └❶ 실습2 프로그래밍언어 정성훈 384 03-16
    87 야구 프로그래밍언어 백현민 625 10-31
    86 거꾸로 프로그래밍언어 김경회 627 09-26
    85 ㅁㄴㅇ 프로그래밍언어 조문근 752 06-13
    84 로또 프로그래밍언어 김상우 772 05-30
    83 함수 프로그래밍언어 김경회 851 05-23
    82 proto 프로그래밍언어 이현식 725 05-23
    81 함수 프로그래밍언어 박병민 714 05-23

    [1][2][3][4][5][6][7]