Home   MosaicPresentation format
<http://cnfolio.com/Mastermind>

Mastermind Game




PLAY NOW

Player name

More explanation of the game is available at Wikipedia.



RESPONSE AND MOST RECENT GUESSES

keta                                  
     
public                                  
     
public                                  
           
public                                  
           
Winner – public                                  
 
public                                  
 
public                                  
 
public                                  
 
hehe                                  
 
hehe                                  
 
public                                  
 
public                                  
 
Winner – 2                                  
 
2                                  
 
2                                  
 
2                           undefined      
 
2                           undefined      
 
2                           undefined      
 
2                   undefined       undefined      
 
2                   undefined       undefined      
 
2                   undefined       undefined      
 
2                   undefined       undefined      
 
2                   undefined       undefined      
 
2           undefined       undefined       undefined      
 
2           undefined       undefined       undefined      
 



C SOURCE CODE TO COMMUNICATE WITH THE MASTERMIND SERVER

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>

/* Name of player must be equal to or less than 50 characters in length */
#define MAX_NAME_LENGTH 50

/* Integer values of colors when sending a code guess to the server */
#define COLOR_EMPTY  0
#define COLOR_RED    1
#define COLOR_BLUE   2
#define COLOR_YELLOW 3
#define COLOR_GREEN  4
#define COLOR_WHITE  5
#define COLOR_ORANGE 6

/* Possible return values from the send_code function */
#define SEND_STATUS_SUCCESS             0
#define SEND_STATUS_ERROR_NULL_USER     1
#define SEND_STATUS_ERROR_NULL_REQUEST  2
#define SEND_STATUS_ERROR_NULL_RESPONSE 3
#define SEND_STATUS_ERROR_LONG_USER     4
#define SEND_STATUS_ERROR_HOST_DNS      5
#define SEND_STATUS_ERROR_SOCKET_OPEN   6
#define SEND_STATUS_ERROR_NO_SERVER     7
#define SEND_STATUS_ERROR_SEND          8
#define SEND_STATUS_ERROR_RECEIVE       9

/* Server information */
#define GAME_SERVER_HOST     "cnfolio.com"
#define GAME_SERVER_PORT     80
#define GAME_SERVER_COMMAND  "GET /Mastermind?A=%d&B=%d&C=%d&D=%d&E=%s HTTP/1.0\r\nHost: %s\r\n\r\n"
#define GAME_SERVER_API      ":API:"

/*

 user     :   Array of characters that contain the name of the player.
              Must contain only alphanumeric characters.
              Must be 50 or less characters in length.
 request  :   Array of 4 integers that contain the colors of the guess code.
              The first array element is the leftmost peg of the row.
 response :   Array of 4 integers for storing the response from the server.
              The first array element is the leftmost peg of the row.
 session  :   Address of an integer variable to toggle between 1 and 0 when a new game starts.

 The function returns an integer value that indicates success or type of error.

*/

int send_code( char* user, int* request, int* response, int* session )
{
  int sock_fail = -1;
  int cmd_success = sock_fail + 1;
  int cmd_fail = cmd_success + 1;
  char cmd[ 512 ] = { '\0' };
  int cmdsize = 512;
  char buffer[ 768 ] = { '\0' };
  int bufsize = 767;
  struct hostent *server_info = NULL;
  struct sockaddr_in server_addr;
  int sock_id, sock_stat, counter;
  char *api_data = NULL;

  /* Reject NULL parameters */
  if ( user == NULL ) return cmd_fail;
  if ( request == NULL ) return ( cmd_fail + 1 );
  if ( response == NULL ) return ( cmd_fail + 2 );

  /* Reject user names longer than 50 in length */
  if ( strlen( user ) > MAX_NAME_LENGTH ) return ( cmd_fail + 3 );

  /* Replace non alphanumeric characters in user name */
  for ( counter = 0; counter < strlen( user ); counter++ )
    if ( ! isalnum( user[ counter ] ) ) user[ counter ] = '_';

  /* DNS resolution of site name */
  server_info = gethostbyname( GAME_SERVER_HOST );
  if ( server_info == NULL ) return ( cmd_fail + 4 );

  /* Open network socket */
  sock_id = socket( AF_INET, SOCK_STREAM, 0 );
  if ( sock_id == sock_fail ) return ( cmd_fail + 5 );

  /* Open connection to remote host */
  memset( &server_addr, 0, sizeof( server_addr ) );
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons( GAME_SERVER_PORT );
  server_addr.sin_addr = *(struct in_addr *) server_info->h_addr;
  sock_stat = connect( sock_id, (void *) &server_addr, sizeof( server_addr ) );
  if ( sock_stat == sock_fail )
  {
    close( sock_id );
    return ( cmd_fail + 6 );
  }

  /* Send request to remote host */
  snprintf( cmd, cmdsize, GAME_SERVER_COMMAND, request[0], request[1], request[2], request[3], user, GAME_SERVER_HOST );
  sock_stat = send( sock_id, (void*) cmd, strlen( cmd ), 0 );
  if ( sock_stat == sock_fail )
  {
    close( sock_id );
    return ( cmd_fail + 7 );
  }

  /* Initialize response to zero */
  response[ 0 ] = response[ 1 ] = response[ 2 ] = response[ 3 ] = 0;

  /* Wait for response from remote host and save data to buffer */
  while ( ( sock_stat != sock_fail ) && ( sock_stat != 0 ) )
  {
    sock_stat = recv( sock_id, (void*) buffer, bufsize, 0 );
    buffer[ sock_stat ] = '\0';

    /* Extract response from buffer */
    api_data = strstr( buffer, ":API:" );
    if ( api_data != NULL )
    {
      if ( strlen( api_data ) >= 9 )
      {
        for ( counter = 0; counter < 4; counter++ )
        {
          sprintf( cmd, "%c", api_data[ counter + 5 ] );
          response[ counter ] = atoi( cmd );
        }

        /* Game session toggle is last */
        if ( session != NULL )
        {
          sprintf( cmd, "%c", api_data[ counter + 5 ] );
          *session = atoi( cmd );
        }

        /* Success */
        close( sock_id );
        return cmd_success;
      }
      else
        break;
    }
  }

  /* Could not find API response */
  close( sock_id );
  return ( cmd_fail + 8 );
}

 VisitorsPage views
Today12
Recent week47
Recent month1438