2015-12-02 91 views
2

請把它給我簡單而簡單。我試圖用一個哨兵節點來實現一個循環雙向鏈表,並且提出了一些更高或更低的遊戲,它們往返前進,並循環播放。它工作正常....除了我意識到我必須有兩個單獨的文件的環模塊(一個.h和一個.c),然後單獨的主文件。代碼很長,在我意識到我的錯誤之後,我沒有整理它,因爲它是毫無意義的。所以即時通訊不要求你閱讀它或檢查錯誤或任何東西。但是如果你能以1-10的分數告訴我這種情況有多糟糕,那麼我會非常感激。只是這樣我就可以讓我的頭周圍的什麼IM將不得不做...謝謝我是否必須重新開始?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <time.h> 
#define PLAYERLIMIT 5 

//Doubly linked list implementation 
struct Node { 
    char data[20]; 
    struct Node* next; 
    struct Node* prev; 
}; 
struct Node* sentinel; //global pointer to the sentinel node 
struct Node* head; 
struct Node* tail; 

// Create sentinel node, originally it just points to itself 

struct Node* MakeSentinel() { 
struct Node* SentinelNode = 
(struct Node*)malloc(sizeof(struct Node)); 
SentinelNode->next = SentinelNode->next; 
SentinelNode->prev = SentinelNode->prev; 
return SentinelNode; 
} 

//Creation of a node takes an int and returns a node 
struct Node* GetNewNode (char *x) { 
    struct Node* newNode = 
    (struct Node*)malloc(sizeof(struct Node)); //created node in the dynamic memory 
strcpy (newNode->data, x); //temp->data is same as (*temp).data 
newNode->prev = NULL; 
newNode->next = NULL; 
return newNode; 
} 

//Returning a pointer to newly created node, inserts next to sentinel 
void InsertAtHead (char *x){ 
    struct Node* newNode = GetNewNode(x); 
if (sentinel == NULL) { 
    sentinel = MakeSentinel(); 
    head = newNode; 
    sentinel->next = head; 
    sentinel->prev = head; 
    head->next = sentinel; 
    head->prev = sentinel; 
    return; 
} 
head->prev = newNode; 
newNode->next = head; 
newNode->prev = sentinel; 
sentinel->prev = newNode; 
head = newNode; 
} 

void PrintHead() { 
// printf("Sentinel prev is %s\n", sentinel->prev->data); 
struct Node* temp = sentinel->prev; 
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 
printf("The players in the game are\n\n"); 
while (temp != sentinel) { 
    printf ("%s ", temp->data); 
    temp = temp->next; 

} 
printf("\n"); 
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 
} 

//Removing a name from the linked list 
void DeleteEntry (struct Node* del) { 
    if ((del->next != sentinel) && (del->prev != sentinel)) { 
del->next->prev = del->prev; 
del->prev->next = del->next; 
} 
else if (del->next == sentinel) { 
    del->next->next = del->prev; 
    del->prev->next = del->next; 
} 
else if(del->prev == sentinel) { 
    del->next->prev = del->prev; 
    del->prev->prev = del->next; 
} 
// printf("Sentinel prev is now%s\n", sentinel->prev->data); 

return; 
} 



int main(int argc, char *argv[]) { 

//Entering all player names into the doubly linked list 
printf ("Enter the names of the players. Press Enter after each new player\n"); 
printf ("Must have 5 Players'.'\n\n"); 

int i = 1; 
char name[20]; 


while ((i <= PLAYERLIMIT)) { 

    printf("Player: "); 
    scanf ("%s", name); 
    InsertAtHead(name); 
    i++; 

} 
PrintHead(); 

//Starting the Game 

//Initialising Variables for the game 
int nextCard; 
int currentCard; 
int score; 
char oppositeGuess[20]; 
int userChoice; 
int playGame = 1; 
struct Node* CurrentPlayer = head; 
struct Node* PlayerBefore; 

//Setting up the random cards 
int range; 
srand(time(NULL)); 
range = (13 - 1) + 1; 

nextCard = rand() % range + 2; 
currentCard = rand() % range + 2; 

while (playGame == 1) { 

    //Change current card to past card before creating a new current card 
    currentCard = nextCard; 

    //generate a random int for card 

    nextCard = rand() % range + 2; 

    if (currentCard < 11) { 
     printf("\nThe current card is a %d.\n", currentCard); 
    } 
    else if (currentCard == 11) { 
     printf("\nThe current card is a jack.\n"); 
    } 
    else if (currentCard == 12) { 
     printf("\nThe current card is a queen.\n"); 
    } 
    else if (currentCard == 13) { 
     printf("\nThe current card is a king.\n"); 
    } 
    else if (currentCard == 14) { 
     printf("\nThe current card is an ace.\n"); 
    } 

    printf ("***%s it is your go!***\n", CurrentPlayer->data); 
    if (CurrentPlayer->prev != sentinel) { 
     PlayerBefore = CurrentPlayer->prev; 

    } 
    else { 
     PlayerBefore = sentinel->next; 

    } 
//  printf("\nThe CurrentPlayer is %s\n", CurrentPlayer->data); 
//  printf("The PlayerBefore is %s\n\n", PlayerBefore->data); 
    printf("Will the next card be higher(1) or lower(2)?\n"); 
    scanf("%d", &userChoice); 
    printf("\n"); 
    printf ("***%s would you like to guess the opposite?***\n", PlayerBefore->data); 
    scanf("%s", oppositeGuess); 
    if (strncmp(oppositeGuess, "Yes", 4) == 0) { 

     if (userChoice == 1) { 
      if (currentCard < nextCard) { 
       printf("\nSorry, %s was correct. You are out!\n", CurrentPlayer->data); 
//     printf ("\n IM GONNA DELETE %s\n", PlayerBefore->data); 
       DeleteEntry(PlayerBefore); 

      } 
      else if (currentCard > nextCard) { 
       printf ("Congratulations! player %s was wrong and is now out!\n", CurrentPlayer->data); 
//     printf ("\n IM GONNA DELETE %s\n", CurrentPlayer->data); 
       DeleteEntry(CurrentPlayer); 

      } 
      else if (currentCard == nextCard){ 
       printf("\nCards were equal. Next players turn.\n"); 
      } 
     } 
     else if (userChoice == 2) { 
      if (currentCard < nextCard) { 
       printf("Congratulations! player %s was wrong and is now out!\n", CurrentPlayer->data); 
//     printf ("\n IM GONNA DELETE %s\n", CurrentPlayer->data); 
       DeleteEntry(CurrentPlayer); 

      } 
      else if (currentCard > nextCard) { 
       printf ("\nSorry, %s was correct. You are out!\n", CurrentPlayer->data); 
//     printf ("\n IM GONNA DELETE %s\n", PlayerBefore->data); 
       DeleteEntry(PlayerBefore); 

      } 
      else if (currentCard == nextCard){ 
       printf("\nCards were equal. Next players turn.\n"); 
      } 
     } 
    } 
    if (strncmp(oppositeGuess, "No", 4) == 0) { 

     if (userChoice == 1) { 
      if (currentCard > nextCard) { 
       printf ("\nSorry you have guessed incorrectly, you are out!\n"); 
//     printf ("\n IM GONNA DELETE %s\n", CurrentPlayer->data); 
       DeleteEntry(CurrentPlayer); 

      } 

      else if (currentCard < nextCard) { 
       printf("\nCongratualtions you were correct, next players turn.\n"); 
      } 
      else if (currentCard == nextCard) { 
       printf("\nThe cards are the same. Next players turn.\n"); 
      } 
     } 
     else if (userChoice == 2) { 
      if (currentCard > nextCard) { 
       printf ("\nCongratualtions you were correct, next players turn.\n"); 

      } 
      else if (currentCard < nextCard) { 
       printf("\nSorry you have guessed incorrectly, you are out!\n"); 
//     printf ("\n IM GONNA DELETE %s\n", CurrentPlayer->data); 
       DeleteEntry(CurrentPlayer); 


      } 
      else if (currentCard == nextCard) { 
       printf("\nThe cards are the same. Next players turn.\n"); 
      } 
     } 
     else { 
      printf("\nPlease enter a valid choice.\n"); 
     } 
    } 

     PrintHead(); 
    if (CurrentPlayer->next != sentinel) { 
     CurrentPlayer = CurrentPlayer->next; 
    } 
    else { 
     CurrentPlayer = sentinel->prev; 
    } 

    if ((CurrentPlayer->next == sentinel) && (CurrentPlayer->prev == sentinel)) { 
     playGame = 0; 
    } 
} 
printf("%s you are the Winner!\n", CurrentPlayer->data); 
} 
+0

我不認爲你需要重新開始:你可以使用這個機會來重構和測試你的代碼。 –

回答

0

在1-10分,我認爲這個代碼是值得保存的規模:你已經採取了相當單調乏味的練習(製作一張圓形列表)並將其變成有趣的東西。

對於爲不同模塊分開文件沒有問題,可以使用#include命令包含它們。例如,如果你把所有的鏈接列表的東西,在mydllist.c

//Doubly linked list implementation 
struct Node { 
    char data[20]; 
    struct Node* next; 
    struct Node* prev; 
}; 

struct Node* sentinel; //global pointer to the sentinel node 
struct Node* head; 
struct Node* tail; 

// Create sentinel node, originally it just points to itself 

struct Node* MakeSentinel() { 
    struct Node* SentinelNode = (struct Node*)malloc(sizeof(struct Node)); 
    SentinelNode->next = SentinelNode->next; 
    SentinelNode->prev = SentinelNode->prev; 
    return SentinelNode; 
} 

//Creation of a node takes an int and returns a node 
struct Node* GetNewNode (char *x) { 
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); //created node in the dynamic memory 
    strcpy (newNode->data, x); //temp->data is same as (*temp).data 
    newNode->prev = NULL; 
    newNode->next = NULL; 
    return newNode; 
} 

//Returning a pointer to newly created node, inserts next to sentinel 
void InsertAtHead (char *x){ 
    struct Node* newNode = GetNewNode(x); 
    if (sentinel == NULL) { 
     sentinel = MakeSentinel(); 
     head = newNode; 
     sentinel->next = head; 
     sentinel->prev = head; 
     head->next = sentinel; 
     head->prev = sentinel; 
     return; 
    } 

head->prev = newNode; 
newNode->next = head; 
newNode->prev = sentinel; 
sentinel->prev = newNode; 
head = newNode; 
} 

void PrintHead() { 
// printf("Sentinel prev is %s\n", sentinel->prev->data); 
    struct Node* temp = sentinel->prev; 
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 
    printf("The players in the game are\n\n"); 
    while (temp != sentinel) { 
    printf ("%s ", temp->data); 
    temp = temp->next; 

    } 
    printf("\n"); 
    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); 
} 

//Removing a name from the linked list 
void DeleteEntry (struct Node* del) { 
    if ((del->next != sentinel) && (del->prev != sentinel)) { 
     del->next->prev = del->prev; 
     del->prev->next = del->next; 
    } 
    else if (del->next == sentinel) { 
     del->next->next = del->prev; 
     del->prev->next = del->next; 
    } 
    else if(del->prev == sentinel) { 
     del->next->prev = del->prev; 
     del->prev->prev = del->next; 
    } 
    // printf("Sentinel prev is now%s\n", sentinel->prev->data); 

    return; 
} 

可以將其包含在dllist_game.c文件中像這樣的頂部:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <time.h> 
#include "mydllist.c" 

我然後做一些啓動簡單的重構,特別是main()函數的重構,使代碼更易於理解。

隨着你#define PLAYERLIMIT 5我想添加一個#define NUMBER_OF_CARDS 13(或其他卡的最大數量爲)與枚舉類型布爾值

typedef enum {true, false} bool; 

這樣一起當你定義的範圍,而不是寫的:

int range; 
srand(time(NULL)); 
range = (13 - 1) + 1 //n.b. (13 - 1) + 1 = 13 is there some reason you wrote it like this? 

你可以寫

int range = NUMBER_OF_CARDS; 
srand(time(NULL)); 

它總是一個好主意來初始化變量的默認值:你可能會忘記他們是未初始化,並嘗試使用它們(這有可能是壞的):

int nextCard = 0; 
int currentCard = 0; 
int score = 0; 
char oppositeGuess[20] = ""; 
int userChoice = 0 ; 
bool playGame = true; 
struct Node* CurrentPlayer = head; 
struct Node* PreviousPlayer = head->prev; 

我會改變環路的名稱計數器從inum_entered_players,所以它更容易看到的變量是什麼時,它的使用:

int num_entered_players = 1; 
char name[20]; 

while ((entered_players <= PLAYERLIMIT)) { 
    printf("Player: "); 
    scanf ("%s", name); 
    InsertAtHead(name); 
    num_entered_players++; 
} 

最後,我會開始提取大while環路的部分成更小的功能,這說明這是怎麼回事。例如,行:

if (currentCard < 11) { 
    printf("\nThe current card is a %d.\n", currentCard); 
} 
else if (currentCard == 11) { 
    printf("\nThe current card is a jack.\n"); 
} 
else if (currentCard == 12) { 
    printf("\nThe current card is a queen.\n"); 
} 
else if (currentCard == 13) { 
    printf("\nThe current card is a king.\n"); 
} 
else if (currentCard == 14) { 
    printf("\nThe current card is an ace.\n"); 
} 

將成爲:

void printCurrentCard(int currentCard){ 

    if (currentCard < 11) { 
     printf("\nThe current card is a %d.\n", currentCard); 
    } 
    else if (currentCard == 11) { 
     printf("\nThe current card is a jack.\n"); 
    } 
    else if (currentCard == 12) { 
     printf("\nThe current card is a queen.\n"); 
    } 
    else if (currentCard == 13) { 
     printf("\nThe current card is a king.\n"); 
    } 
    else if (currentCard == 14) { 
     printf("\nThe current card is an ace.\n"); 
    } 
} 

,並會被稱爲是這樣的:

while (playGame == true) { 

    //Change current card to past card before creating a new current card 
    currentCard = nextCard; 

    //generate a random int for card 
    nextCard = rand() % range + 2; 

    printCurrentCard(currentCard); 

.... 
} 

等,所以如果你改變在一個特定的遊戲規則一步,只有一個地方需要更改代碼 - 而且不應該影響遊戲的其餘部分。

一旦你完成了這些改變 - 你的遊戲的邏輯可以進入另一對.c和.h文件,你可以直接從一個單獨的main()中調用它!

相關問題