Mastermind Game
PLAY NOW
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 );
}
| | Visitors | Page views |
| Today | 1 | 2 |
| Recent week | 4 | 7 |
| Recent month | 14 | 38 |