Circular LinkList Compatriot Game in Javascript

3 min read 06-10-2024
Circular LinkList Compatriot Game in Javascript


Cracking the Code: Implementing a Circular Linked List for the "Compatriot" Game in JavaScript

Understanding the Problem

Have you ever played a game where you need to identify if two people are from the same country? This classic game, often called "Compatriot," can be implemented using a circular linked list data structure in JavaScript. But how? Let's break down the challenge and explore how a circular linked list can help us build this fun game.

Setting the Scene: The "Compatriot" Game and Circular Linked Lists

The "Compatriot" game usually involves two players: one asks questions to guess the other's country of origin. To make this game dynamic, we can introduce a list of countries and shuffle it randomly. A circular linked list comes into play here, allowing us to efficiently cycle through the list of countries, ensuring each country has an equal chance of being selected for the game.

Here's a basic JavaScript code example demonstrating a circular linked list implementation:

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

class CircularLinkedList {
  constructor() {
    this.head = null;
  }

  // Insert a new node at the end of the list
  insert(data) {
    const newNode = new Node(data);
    if (this.head === null) {
      this.head = newNode;
      newNode.next = this.head; // Circular connection
    } else {
      let current = this.head;
      while (current.next !== this.head) {
        current = current.next;
      }
      current.next = newNode;
      newNode.next = this.head; 
    }
  }

  // Function to remove a node with a given data
  remove(data) {
    if (this.head === null) return;

    let current = this.head;
    let previous = null;
    do {
      if (current.data === data) {
        // If the head node needs to be removed
        if (previous === null) {
          this.head = current.next;
          current.next = null; // Break circular link
        } else {
          previous.next = current.next; 
          current.next = null; // Remove the node
        }
        return;
      }
      previous = current;
      current = current.next;
    } while (current !== this.head);
  }

  // Function to get a random node from the list
  getRandomNode() {
    if (this.head === null) return null;

    let count = 1;
    let current = this.head;
    while (current.next !== this.head) {
      count++;
      current = current.next;
    }

    let randomIndex = Math.floor(Math.random() * count) + 1;
    current = this.head;
    for (let i = 1; i < randomIndex; i++) {
      current = current.next;
    }
    return current.data;
  }
}

// Example usage
const countryList = new CircularLinkedList();
countryList.insert("India");
countryList.insert("USA");
countryList.insert("Canada");
countryList.insert("France");
countryList.insert("Germany");

console.log(countryList.getRandomNode()); // Will print a random country

Why Circular Linked Lists?

The circular linked list is a powerful tool for this game. Here's why:

  1. Efficient Random Selection: We can easily pick a random country from the list by using the getRandomNode function without needing to traverse the entire list every time.

  2. Looping Through Countries: The circular nature lets us cycle through the countries infinitely without encountering a null pointer exception, a common issue with traditional linked lists.

  3. Flexibility: As the game progresses, we can dynamically add or remove countries from the list using the insert and remove functions respectively, maintaining the circular structure.

Implementing the Game Logic

Now, let's outline the game logic using the circular linked list:

  1. Initialization: Create a circular linked list and populate it with a list of countries.
  2. Random Selection: Use the getRandomNode function to pick a random country for each player.
  3. Questioning: Player 1 asks questions to Player 2 to try and guess their country.
  4. Guesses: Player 2 can answer "yes" or "no" based on the question asked.
  5. Winning: If Player 1 correctly guesses Player 2's country, they win.
  6. Game Loop: Continue with steps 2 to 5 until a player wins.

Taking it Further

We can further enhance the game by:

  • Adding Difficulty: Introduce a limited number of questions per player.
  • Introducing Themes: Create themed country lists (e.g., European countries, Asian countries, etc.)
  • Adding Visuals: Use a graphical interface to display the selected countries and update the game state.

Conclusion

Implementing a circular linked list in JavaScript is a fun and practical way to create a dynamic "Compatriot" game. The efficiency and flexibility offered by this data structure make it a perfect choice for creating a game where random selection and seamless looping are essential.

Resources: