File: faileplayer.cpp

package info (click to toggle)
brutalchess 0.5.2%2Bdfsg-7
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 7,392 kB
  • sloc: cpp: 7,561; sh: 2,707; makefile: 73; ansic: 9
file content (145 lines) | stat: -rw-r--r-- 2,622 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/***************************************************************************
 * Brutal Chess
 * http://brutalchess.sf.net
 *
 * File : faileplayer.cpp
 * Authors : Mike Cook, Joe Flint, Neil Pankey
 **************************************************************************/
#ifndef WIN32

#include "board.h"
#include "chessgamestate.h"
#include "chessplayer.h"

#include <cassert>
#include <sstream>
#include <string>

#include <unistd.h>

using namespace std;

FailePlayer::FailePlayer()
{
	m_trustworthy = true;
}

FailePlayer::~FailePlayer()
{
	write(m_to[1], "exit\n", 5);
}

void FailePlayer::newGame()
{
	runChessEngine();
}

void FailePlayer::loadGame(const ChessGameState& cgs)
{
}

void FailePlayer::startGame()
{
	if(m_is_white)
		write(m_to[1], "go\n", 3);
}

// Set up gnuchess
void FailePlayer::runChessEngine()
{
	pipe( m_to );
	pipe( m_from );

	if (fork() == 0) {
		// Child Process
		nice( 20 );
		dup2( m_to[0], 0 );
		dup2( m_from[1], 1 );
		close( m_to[0] );
		close( m_to[1] );
		close( m_from[0] );
		execvp( "./faile", NULL );
		cerr << "Couldn't run faile" << endl;
	}
	write( m_to[1], "xboard\n", 7);
	m_initialized = true;
}

// Get a move from GnuChess
void FailePlayer::think(const ChessGameState & cgs)
{
	if (!m_initialized)
		runChessEngine();
	
	string output;
	char c;
	while ( output.substr(0, 5) != "move ") {
		output = "";
		while ( read( m_from[0], &c, 1 ) ) {
			if ( c == '\n' )
				break;
			output += c;
		}
		cout << output << endl;
	}
	output = output.substr(5, 5);

	cout << output << endl;
	
	// Construct a BoardMove from the move string.
	stringstream oss(output);
	int rank;
		
	oss >> c;
	oss >> rank;
	BoardPosition origin(c, rank);
	
	oss >> c;
	oss >> rank;
	BoardPosition dest(c, rank);
	
//	BoardMove move(origin, dest);

	char promote;
	oss >> promote;

	Board b = cgs.getBoard();
	BoardMove move(origin, dest, b.getPiece(origin));
	printf("Pawn promotion: %d\n", promote);
	cout << promote << endl;
	m_move = move;
}

// Send your move to GnuChess
void FailePlayer::opponentMove(const BoardMove & move, const ChessGameState & cgs)
{
	if (!m_initialized)
		runChessEngine();

	Board board = cgs.getBoard();
	
	Piece * piece = board.getPiece(move.dest());	
	assert(piece);
			
	string movestr = "";
	movestr += move.origin().filec();
	movestr += '0' + move.origin().rank();
	movestr += move.dest().filec();
	movestr += '0' + move.dest().rank();
	movestr += '\n';

	cout << movestr << endl;

	write( m_to[1], movestr.c_str(), 5);
}

void FailePlayer::undoMove()
{
	string undo = "undo\n";
	write(m_to[1], undo.c_str(), 5);
}

#endif

// end of file xboardplayer.cpp