-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
I've cleaned up the files a bit to live in this more modern, version-controlled world.
- Loading branch information
Showing
6 changed files
with
711 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Oops, something went wrong.