Skip to content

Commit

Permalink
Initial commit from tarball.
Browse files Browse the repository at this point in the history
I've cleaned up the files a bit to live in this more modern, version-controlled world.
  • Loading branch information
bderrly committed Jun 19, 2015
1 parent 99299dd commit da92325
Show file tree
Hide file tree
Showing 6 changed files with 711 additions and 0 deletions.
23 changes: 23 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
CC=g++
CFLAGS=-Wall
CURSES_LIBS=-lncurses

ncurses: windows/windows.o braincurses.o
${CC} ${CFLAGS} windows/windows.o braincurses.o ${CURSES_LIBS} -o braincurses

windows.o: windows.cpp
${CC} ${CFLAGS} -c windows/windows.cpp

braincurses.o: braincurses.cpp
${CC} ${CFLAGS} -c braincurses.cpp

install:
install -o root -g root braincurses /usr/local/bin/

uninstall:
rm /usr/local/bin/braincurses

clean:
rm -f braincurses
rm -f *.o
rm -f curses/*.o
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
A simple code-breaking game.

The object of the game is to guess the correct colors in the correct order.
[WikiPedia][] has more details about game play, the history of the game, and
Donald Knuth's algorithm.

[WikiPedia]: https://en.wikipedia.org/wiki/Mastermind_(board_game)
"Mastermind"
207 changes: 207 additions & 0 deletions braincurses.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
/* braincurses.cpp
* Copyright © 2002, Brian Derr <[email protected]>
*/

#include "braincurses.h"

using namespace std;

Answer::
Answer()
{
getRdmNums();
}

Answer::
~Answer()
{ }

void Answer::
getRdmNums()
{
static bool ran = false;
int i;
if( ran == false ) {
srand( time( 0 ) * getpid() );
ran = true;
}

for( i = 0; i < 4; i++ )
answer[i] = 1 + (int) ( 6.0 * rand() / ( RAND_MAX + 1.0 ) );
}

int Answer::
grabAnswer( int x )
{
return( answer[x] );
}

Guess::
Guess()
{
// Initialize the variables
int i;
for( i = 0; i < 4; i++ ) {
guess[i] = 0;
markers[i] = 0;
}
}

Guess::
~Guess()
{ }

bool Guess::
isValid( string tmp )
{
bool done = false;
static int tracker = 0;
if( tracker == 4 )
tracker = 0;
if( tmp == "red" || tmp == "r" ) {
setInput( "red", tracker );
tracker++;
done = true;
} else if( tmp == "white" || tmp == "w" ) {
setInput( "white", tracker );
tracker++;
done = true;
} else if( tmp == "yellow" || tmp == "y" ) {
setInput( "yellow", tracker );
tracker++;
done = true;
} else if( tmp == "green" || tmp == "g" ) {
setInput( "green", tracker );
tracker++;
done = true;
} else if( tmp == "blue" || tmp == "b") {
setInput( "blue", tracker );
tracker++;
done = true;
} else if( tmp == "purple" || tmp == "p" ) {
setInput( "purple", tracker );
tracker++;
done = true;
} else if( tmp == "quit" ) {
quitGame();
} else
done = false;

return( done );
}

void Guess::
setInput( string str, int tracker )
{
if( str == "red" )
guess[tracker] = RED;
else if( str == "white" )
guess[tracker] = WHITE;
else if( str == "yellow" )
guess[tracker] = YELLOW;
else if( str == "green" )
guess[tracker] = GREEN;
else if( str == "blue" )
guess[tracker] = BLUE;
else if( str == "purple" )
guess[tracker] = PURPLE;
else {
cerr << "braincurses: incorrect input" << endl;
exit( 1 );
}
}

void Guess::
compareWithAnswer( Answer ans )
{
// Assertion: You will call this function with your current Answer object
// for it to correctly compare against user inputed guesses

int bMarker = 0, wMarker = 0;
// bMarker indicates that the guess is the correct color and placement
// wMarker indicates that a guess is correct color but not placement

int i;

for( i = 0 ; i < 4 ; i++ ) {
if( guess[i] == ans.grabAnswer(i) ){
bMarker++;
}
}

int num_len=10;
int guess_num[num_len];
int ans_num[num_len];

for( i = 0; i < num_len; i++ ) {
guess_num[i] = 0;
ans_num[i] = 0;
}

for( i = 0; i < 4; i++ ) {
guess_num[guess[i]]++;
ans_num[ans.grabAnswer(i)]++;
}

for( i = 0; i < num_len; i++ ) {
if( ans_num[i] <= guess_num[i] )
wMarker += ans_num[i];
else
wMarker += guess_num[i];
}

wMarker -= bMarker;
if( wMarker < 0 )
wMarker = 0;
// my thinking here is that there will be bMarker more wMarkers than
// needed since a bMarker is inherently a wMarker

setMarkers( bMarker, wMarker );
}

void Guess::
setMarkers( int bMarker, int wMarker )
{
int i;

if( bMarker > 0 )
for( i = 0; i < bMarker; i++ )
markers[i] = 0;

if( wMarker > 0 )
for(i = bMarker; i < wMarker + bMarker; i++ )
markers[i] = 1;

int count = bMarker + wMarker;

if( count == 0 )
for( i = count; i < 4; i++ )
markers[i] = 3;
else
for( i = count; i < 4; i++ )
markers[i] = 3;
}

void Guess::
showMarkers( int array[] )
{
int i;
for(i = 0; i < 4; i++ )
array[i] = markers[i];
}

void Guess::
showGuesses( int array[] )
{
int i;
for( i = 0; i < 4; i++ )
array[i] = guess[i];
}

void Guess::
quitGame()
{
system( "clear" );
cout << "Bye, thanks for playing." << endl;
exit( 0 );
}
62 changes: 62 additions & 0 deletions braincurses.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* braincurses.h
* Copyright © 2002, Brian Derr <[email protected]>
*/

#ifndef BRAINCURSES_H
#define BRAINCURSES_H

#include <cstddef>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <map>
#include <string>
#include <unistd.h>

using namespace std;

enum Colors { NONE, RED, WHITE, YELLOW, GREEN, BLUE, PURPLE };

class Answer
{
private:
int answer[4];
void getRdmNums();

protected:

public:
Answer();
~Answer();

int grabAnswer( int x );
};

class Guess
{
private:
int guess[4];
int markers[4]; // used to keep track if a guess is in the correct place
// 0 = black, 1 = white, 3 = none
typedef map<int,string> mGuess;
void setInput( string str, int tracker );
void setMarkers( int bMarker, int wMarker );

protected:

public:
Guess();
Guess( int guess1, int guess2, int guess3, int guess4 );
~Guess();

bool isValid( string tmp );
void compareWithAnswer( Answer ans );
void showMarkers( int array[] );
void showGuesses( int array[] );
void quitGame();

friend class Answer;
};


#endif // BRAINCURSES_H
Loading

0 comments on commit da92325

Please sign in to comment.