git » fp-git.git » commit dd53edc

not working

author peter_k
2005-11-05 23:32:36 UTC
committer peter_k
2005-11-05 23:32:36 UTC
parent 773e284690f66b2f156fc3b8f24598fb1833c721

not working

poprecog/connect4/Makefile.win +11 -8
poprecog/connect4/boards.c +241 -43
poprecog/connect4/boards.hpp +16 -0
poprecog/connect4/boards.o +0 -0
poprecog/connect4/connect4.cpp +142 -0
poprecog/connect4/connect4.dev +79 -0
poprecog/connect4/connect4.exe +0 -0
poprecog/connect4/connect4.o +0 -0
poprecog/connect4/genboard.cpp +146 -26
poprecog/connect4/genboard.exe +0 -0
poprecog/connect4/genboard.o +0 -0

diff --git a/poprecog/connect4/Makefile.win b/poprecog/connect4/Makefile.win
index ee7da40..bf5546a 100644
--- a/poprecog/connect4/Makefile.win
+++ b/poprecog/connect4/Makefile.win
@@ -1,30 +1,33 @@
-# Project: genboard
+# Project: connect4
 # Makefile created by Dev-C++ 4.9.9.2
 
 CPP  = g++.exe
 CC   = gcc.exe
 WINDRES = windres.exe
 RES  = 
-OBJ  = genboard.o $(RES)
-LINKOBJ  = genboard.o $(RES)
+OBJ  = connect4.o boards.o $(RES)
+LINKOBJ  = connect4.o boards.o $(RES)
 LIBS =  -L"D:/dcpp/lib"  
 INCS =  -I"D:/dcpp/include" 
 CXXINCS =  -I"D:/dcpp/lib/gcc/mingw32/3.4.2/include"  -I"D:/dcpp/include/c++/3.4.2/backward"  -I"D:/dcpp/include/c++/3.4.2/mingw32"  -I"D:/dcpp/include/c++/3.4.2"  -I"D:/dcpp/include" 
-BIN  = genboard.exe
+BIN  = connect4.exe
 CXXFLAGS = $(CXXINCS)  
 CFLAGS = $(INCS)  
 RM = rm -f
 
 .PHONY: all all-before all-after clean clean-custom
 
-all: all-before genboard.exe all-after
+all: all-before connect4.exe all-after
 
 
 clean: clean-custom
 	${RM} $(OBJ) $(BIN)
 
 $(BIN): $(OBJ)
-	$(CPP) $(LINKOBJ) -o "genboard.exe" $(LIBS)
+	$(CPP) $(LINKOBJ) -o "connect4.exe" $(LIBS)
 
-genboard.o: genboard.cpp
-	$(CPP) -c genboard.cpp -o genboard.o $(CXXFLAGS)
+connect4.o: connect4.cpp
+	$(CPP) -c connect4.cpp -o connect4.o $(CXXFLAGS)
+
+boards.o: boards.c
+	$(CPP) -c boards.c -o boards.o $(CXXFLAGS)
diff --git a/poprecog/connect4/boards.c b/poprecog/connect4/boards.c
index 0dd89f3..552f92c 100644
--- a/poprecog/connect4/boards.c
+++ b/poprecog/connect4/boards.c
@@ -1,93 +1,291 @@
-/* Code below was generated by a machine, so please don't edit */
+/**
+ * Code below was generated by a machine, so please don't edit
+ */
+ 
+#include <iostream.h>
 
-class board {
+class classBoard {
 	public:
 	unsigned long long board[2];
 	int actualPlayer;
+	unsigned long long operationsNumber;
 
-	inline void clear() {
+	void clear() {
 		board[0] = 0;
 		board[1] = 0;
 		actualPlayer = 0;
-	}
-	inline int putToken44(int column);
-	inline int removeToken44(int column);
+		operationsNumber = 0;
+	};
+	int putToken44(int column);
+	int removeToken44(int column);
+	int miniMax44(int depth);
 };
 
-inline board::putToken44(int column) {
+inline int classBoard::putToken44(int column) {
+	//cout << "p" << column << " ";
+	register unsigned long long *b=&board[actualPlayer];
 	switch(column) {
 		case 0:
 			switch((board[0]|board[1])&4369) {
-				case 1048576:
-					board[actualPlayer]|=65536;
+				case 0:
+					*b|=1;
+					if (((*b&=15)==15) ||
+					    ((*b&=4369)==4369) ||
+					    ((*b&=33825)==33825))
+						return 2;
 					break;
-				case 1048576:
-					board[actualPlayer]|=4096;
+				case 1:
+					*b|=16;
+					if (((*b&=240)==240) ||
+					    ((*b&=4369)==4369))
+						return 2;
 					break;
-				case 1052672:
-					board[actualPlayer]|=256;
+				case 17:
+					*b|=256;
+					if (((*b&=3840)==3840) ||
+					    ((*b&=4369)==4369))
+						return 2;
 					break;
-				case 1052928:
-					board[actualPlayer]|=16;
+				case 273:
+					*b|=4096;
+					if (((*b&=61440)==61440) ||
+					    ((*b&=4369)==4369) ||
+					    ((*b&=4680)==4680))
+						return 2;
 					break;
-				case 1052929:
+				default:
 					return -2;
 					break;
+			};
 			break;
 		case 1:
 			switch((board[0]|board[1])&8738) {
-				case 2097152:
-					board[actualPlayer]|=131072;
+				case 0:
+					*b|=2;
+					if (((*b&=15)==15) ||
+					    ((*b&=8738)==8738))
+						return 2;
 					break;
-				case 2097152:
-					board[actualPlayer]|=8192;
+				case 2:
+					*b|=32;
+					if (((*b&=240)==240) ||
+					    ((*b&=8738)==8738) ||
+					    ((*b&=33825)==33825))
+						return 2;
 					break;
-				case 2105344:
-					board[actualPlayer]|=512;
+				case 34:
+					*b|=512;
+					if (((*b&=3840)==3840) ||
+					    ((*b&=8738)==8738) ||
+					    ((*b&=4680)==4680))
+						return 2;
 					break;
-				case 2105856:
-					board[actualPlayer]|=32;
+				case 546:
+					*b|=8192;
+					if (((*b&=61440)==61440) ||
+					    ((*b&=8738)==8738))
+						return 2;
 					break;
-				case 2105858:
+				default:
 					return -2;
 					break;
+			};
 			break;
 		case 2:
 			switch((board[0]|board[1])&17476) {
-				case 4194304:
-					board[actualPlayer]|=262144;
+				case 0:
+					*b|=4;
+					if (((*b&=15)==15) ||
+					    ((*b&=17476)==17476))
+						return 2;
 					break;
-				case 4194304:
-					board[actualPlayer]|=16384;
+				case 4:
+					*b|=64;
+					if (((*b&=240)==240) ||
+					    ((*b&=17476)==17476) ||
+					    ((*b&=4680)==4680))
+						return 2;
 					break;
-				case 4210688:
-					board[actualPlayer]|=1024;
+				case 68:
+					*b|=1024;
+					if (((*b&=3840)==3840) ||
+					    ((*b&=17476)==17476) ||
+					    ((*b&=33825)==33825))
+						return 2;
 					break;
-				case 4211712:
-					board[actualPlayer]|=64;
+				case 1092:
+					*b|=16384;
+					if (((*b&=61440)==61440) ||
+					    ((*b&=17476)==17476))
+						return 2;
 					break;
-				case 4211716:
+				default:
 					return -2;
 					break;
+			};
 			break;
 		case 3:
 			switch((board[0]|board[1])&34952) {
-				case 8388608:
-					board[actualPlayer]|=524288;
+				case 0:
+					*b|=8;
+					if (((*b&=15)==15) ||
+					    ((*b&=34952)==34952) ||
+					    ((*b&=4680)==4680))
+						return 2;
 					break;
-				case 8388608:
-					board[actualPlayer]|=32768;
+				case 8:
+					*b|=128;
+					if (((*b&=240)==240) ||
+					    ((*b&=34952)==34952))
+						return 2;
 					break;
-				case 8421376:
-					board[actualPlayer]|=2048;
+				case 136:
+					*b|=2048;
+					if (((*b&=3840)==3840) ||
+					    ((*b&=34952)==34952))
+						return 2;
 					break;
-				case 8423424:
-					board[actualPlayer]|=128;
+				case 2184:
+					*b|=32768;
+					if (((*b&=61440)==61440) ||
+					    ((*b&=34952)==34952) ||
+					    ((*b&=33825)==33825))
+						return 2;
 					break;
-				case 8423432:
+				default:
 					return -2;
 					break;
+			};
 			break;
 	};
+	actualPlayer=!actualPlayer;
+	// totalNumberOfRows=10
+	return 0;
 }
 
+inline int classBoard::removeToken44(int column) {
+	//cout << "r" << column << " ";
+	actualPlayer=!actualPlayer;
+	switch(column) {
+		case 0:
+			switch((board[0]|board[1])&4369) {
+				case 1:
+					board[actualPlayer]&=1048574;
+					break;
+				case 17:
+					board[actualPlayer]&=1048559;
+					break;
+				case 273:
+					board[actualPlayer]&=1048319;
+					break;
+				case 4369:
+					board[actualPlayer]&=1044479;
+					break;
+			};
+			break;
+		case 1:
+			switch((board[0]|board[1])&8738) {
+				case 2:
+					board[actualPlayer]&=1048573;
+					break;
+				case 34:
+					board[actualPlayer]&=1048543;
+					break;
+				case 546:
+					board[actualPlayer]&=1048063;
+					break;
+				case 8738:
+					board[actualPlayer]&=1040383;
+					break;
+			};
+			break;
+		case 2:
+			switch((board[0]|board[1])&17476) {
+				case 4:
+					board[actualPlayer]&=1048571;
+					break;
+				case 68:
+					board[actualPlayer]&=1048511;
+					break;
+				case 1092:
+					board[actualPlayer]&=1047551;
+					break;
+				case 17476:
+					board[actualPlayer]&=1032191;
+					break;
+			};
+			break;
+		case 3:
+			switch((board[0]|board[1])&34952) {
+				case 8:
+					board[actualPlayer]&=1048567;
+					break;
+				case 136:
+					board[actualPlayer]&=1048447;
+					break;
+				case 2184:
+					board[actualPlayer]&=1046527;
+					break;
+				case 34952:
+					board[actualPlayer]&=1015807;
+					break;
+			};
+			break;
+	};
+};
+
+inline int classBoard::miniMax44(int depth) {
+	register short move;
+	register short best = 0;
+	register int res;
+	
+	//cout << " m" << depth << " ";
+	
+	operationsNumber++;
+
+	if (!depth)
+	  return 1;
+	for (move=0; move<4; move++) {
+		//cout << "m";// << move << " b" << best << " ";
+		//cout << "b";
+		//cout << "";
+		res = putToken44(move);
+		if (res == -2) {
+			//cout << "X ";
+		  continue;
+		}
+		if (res == 2) {
+ 			actualPlayer = !actualPlayer;
+			removeToken44(move);
+			return 2;
+		}
+		//cout << "^";
+		/*if (!(depth-1))
+		  best = 1;
+		else*/
+		//if (depth-1==0)
+		//  best = 1;
+		//else
+		//cout << depth-1 << "! ";
+		if (depth-1==0)
+		  best=1;
+		else {
+		switch (miniMax44(depth-1)) {
+			case -2: // won
+			  //cout << "-2\"";
+				removeToken44(move);
+				return 2;
+			case 2: // lose
+			  //cout << "2\"";
+				if (!best)
+				  best = -2;
+			default: //draw
+			  //cout << "d\"";
+				best = 1;
+		}
+	}
+		removeToken44(move);
+	}
+	//cout << "ret" << best << " ";
+	return best;
+}
diff --git a/poprecog/connect4/boards.hpp b/poprecog/connect4/boards.hpp
new file mode 100644
index 0000000..5b15e39
--- /dev/null
+++ b/poprecog/connect4/boards.hpp
@@ -0,0 +1,16 @@
+class classBoard {
+	public:
+	unsigned long long board[2];
+	int actualPlayer;
+	unsigned long long operationsNumber;
+
+	void clear() {
+		board[0] = 0;
+		board[1] = 0;
+		actualPlayer = 0;
+		operationsNumber = 0;
+	};
+	int putToken44(int column);
+	int removeToken44(int column);
+	int miniMax44(int depth);
+};
diff --git a/poprecog/connect4/boards.o b/poprecog/connect4/boards.o
new file mode 100644
index 0000000..97436d3
Binary files /dev/null and b/poprecog/connect4/boards.o differ
diff --git a/poprecog/connect4/connect4.cpp b/poprecog/connect4/connect4.cpp
new file mode 100644
index 0000000..cb31c19
--- /dev/null
+++ b/poprecog/connect4/connect4.cpp
@@ -0,0 +1,142 @@
+#include <cstdlib>
+#include <iostream>
+
+#include "boards.c"
+
+using namespace std;
+
+int getBit(unsigned long long number, int bit) {
+	unsigned long long tmp = 1;
+
+	if (!((bit>=0)&&(bit<=63)))
+	  return -1;
+	while(bit--)
+	  tmp*=2;
+	//cout << "[number=" << number << ", mask=" << tmp << " " << "]";
+	tmp&=number;
+	//cout << "XX:" << tmp;
+	return tmp!=0;
+}
+
+void displayBoard(classBoard board) {
+	int x, y;
+
+	cout << "\n";
+	for (y=3; y>=0; y--) {
+		for (x=0; x<4; x++) {
+			if (getBit(board.board[0], x+y*4)==1)
+				cout << "W ";
+			else if (getBit(board.board[1], x+y*4)==1)
+				cout << "B ";
+			else
+			  cout << ". ";
+		}
+		cout << "\n";
+	}
+	cout << "\n";
+}
+
+int main(int argc, char *argv[])
+{
+	classBoard board;
+	int move;
+	int i;
+	
+	board.clear();
+	
+	//board.putToken44(0);
+	//board.putToken44(0);
+	//board.putToken44(0);
+	//board.putToken44(1);
+	//board.putToken44(2);
+	//board.putToken44(2);
+	//board.putToken44(0);
+	//board.actualPlayer = !board.actualPlayer;
+	/*displayBoard(board);
+	board.removeToken44(2);
+	displayBoard(board);
+	
+	system("pause");
+	return 0;*/
+
+	while (1) {
+		displayBoard(board);
+		for (i = 1; i < 11; i++) {
+			board.operationsNumber = 0;
+			cout << i << ") evaluate: " << board.miniMax44(15) << " operationsNumber: " << board.operationsNumber << endl;
+		}
+		/*for (i=0; i<4; i++) {
+			short res;
+			res = board.putToken44(i);
+			if (res == -2) {
+				cout << "  ";
+				continue;
+			}
+			if (res == 2) {
+				board.actualPlayer=!board.actualPlayer;
+				board.removeToken44(i);
+				cout << "W!";
+				continue;
+			}
+			switch(board.miniMax44(1)) {
+				case 2: cout << "L "; break;
+				case 1: cout << "D "; break;
+				case -2: cout << "W "; break;
+			}
+			board.removeToken44(i);
+		}*/
+		cout << endl << endl;
+		cout << board.board[0] << " & " << board.board[1] << endl;
+		cin >> move;
+		switch (board.putToken44(move)) {
+			case -2:
+				cout << "busy row\n";
+				break;
+			case 2:
+				cout << "won\n";
+				break;
+			case 3:
+				cout << "#\n";
+				break;
+			default:
+				cout << "nothing\n";
+				break;
+		}
+	}
+ 	system("PAUSE");
+	return EXIT_SUCCESS;
+}
+
+/*
+inline int classBoard::miniMax44(int depth) {
+	register short move;
+	register short best = 0;
+	register short res;
+
+	if (!depth)
+	  return 1;
+
+	for (move=0; move<4; move++) {
+		res = putToken44(move);
+		if (res == -2)
+		  continue;
+		if (res == 2) {
+			removeToken44(move);
+ 			actualPlayer = !actualPlayer;
+			return 2;
+		}
+		switch (miniMax44(depth-1)) {
+			case -2: // won
+				removeToken44(move);
+				return 2;
+			case 2: // lose
+				if (!best)
+				  best = -2;
+			default: //draw
+				best = 1;
+		}
+		removeToken44(move);
+		return best;
+	}
+}
+*/
diff --git a/poprecog/connect4/connect4.dev b/poprecog/connect4/connect4.dev
new file mode 100644
index 0000000..d75d9fa
--- /dev/null
+++ b/poprecog/connect4/connect4.dev
@@ -0,0 +1,79 @@
+[Project]
+FileName=connect4.dev
+Name=connect4
+UnitCount=3
+Type=1
+Ver=1
+ObjFiles=
+Includes=
+Libs=
+PrivateResource=
+ResourceIncludes=
+MakeIncludes=
+Compiler=
+CppCompiler=
+Linker=
+IsCpp=1
+Icon=
+ExeOutput=
+ObjectOutput=
+OverrideOutput=0
+OverrideOutputName=
+HostApplication=
+Folders=
+CommandLine=
+UseCustomMakefile=0
+CustomMakefile=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=0
+CompilerSettings=
+
+[Unit1]
+FileName=connect4.cpp
+CompileCpp=1
+Folder=
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Developed using the Dev-C++ IDE
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
+[Unit2]
+FileName=boards.c
+CompileCpp=1
+Folder=connect4.cpp/main.cpp
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit3]
+FileName=boards.hpp
+CompileCpp=1
+Folder=
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
diff --git a/poprecog/connect4/connect4.exe b/poprecog/connect4/connect4.exe
new file mode 100644
index 0000000..9efddb5
Binary files /dev/null and b/poprecog/connect4/connect4.exe differ
diff --git a/poprecog/connect4/connect4.o b/poprecog/connect4/connect4.o
new file mode 100644
index 0000000..b6a6cf0
Binary files /dev/null and b/poprecog/connect4/connect4.o differ
diff --git a/poprecog/connect4/genboard.cpp b/poprecog/connect4/genboard.cpp
index 874827d..ca53b1a 100644
--- a/poprecog/connect4/genboard.cpp
+++ b/poprecog/connect4/genboard.cpp
@@ -26,31 +26,40 @@ void setBit(unsigned long long &number, int bit) {
 	number |= tmp;
 }
 
+int field(tBoardSize board, int y, int x) {
+	return x+y*board.height;
+}
+
 int main(int argc, char *argv[])
 {
 	const int boardNumber = 1;
-	const tBoardSize boardList[boardNumber] = {{4, 4}/*, {7, 6}, {7, 7}, {8, 7}*/};
+	const tBoardSize board[boardNumber] = {{4, 4}/*, {7, 6}, {7, 7}, {8, 7}, {8, 8}*/};
 	ofstream output;
 	int actualBoard;
 	int column;
 	int line;
 	int height;
+	int linex;
+	int liney;
+	int i;
+	int firstRow;
 	unsigned long long longNumber;
 	unsigned long long longNumber2;
+	int totalNumberOfRows;
+	
+	//longNumber=0;
+	//setBit(longNumber, 2);
+	//setBit(longNumber, 6);
+	//setBit(longNumber, 10);
+	//setBit(longNumber, 14);
+	//cout << longNumber << endl;
+	//system("pause");
+	//return 0;
 	
-	/*longNumber=0;
-	setBit(longNumber, 3);
-	setBit(longNumber, 7);
-	setBit(longNumber, 11);
-	setBit(longNumber, 15);
-	cout << longNumber << endl;
-	system("pause");
-	return 0;*/
-
 	output.open("boards.c");
 	output
-	<< "/* Code below was generated by a machine, so please don't edit */\n\n"
-	<< "class board {\n"
+	<< "/**\n * Code below was generated by a machine, so please don't edit\n */\n\n"
+	<< "class classBoard {\n"
 	<< "	public:\n"
 	<< "	unsigned long long board[2];\n"
 	<< "	int actualPlayer;\n\n"
@@ -59,8 +68,8 @@ int main(int argc, char *argv[])
 	<< "	}\n";
 	for (actualBoard=0; actualBoard<boardNumber; actualBoard++) {
 		output
-		<< "	inline int putToken" << boardList[actualBoard].width << boardList[actualBoard].height << "(int column);\n"
-		<< "	inline int removeToken" << boardList[actualBoard].width << boardList[actualBoard].height << "(int column);\n";
+		<< "	int putToken" << board[actualBoard].width << board[actualBoard].height << "(int column);\n"
+		<< "	int removeToken" << board[actualBoard].width << board[actualBoard].height << "(int column);\n";
 	}
 	output
 	<< "};\n\n";
@@ -69,35 +78,146 @@ int main(int argc, char *argv[])
 	 * putToken
 	 */
 	for (actualBoard=0; actualBoard<boardNumber; actualBoard++) {
+    totalNumberOfRows=0;
 		output
-		<< "inline board::putToken" << boardList[actualBoard].width << boardList[actualBoard].height << "(int column) {\n"
+		<< "inline int classBoard::putToken" << board[actualBoard].width << board[actualBoard].height << "(int column) {\n"
 		<< "	switch(column) {\n";
-		for (column = 0; column < boardList[actualBoard].width; column++) {
+		for (column = 0; column < board[actualBoard].width; column++) {
 			longNumber = 0;
-			for (line=0; line<boardList[actualBoard].height; line++)
-			  setBit(longNumber, line*boardList[actualBoard].height+column);
+			for (line=0; line<board[actualBoard].height; line++)
+			  setBit(longNumber, field(board[actualBoard], line, column));
 			output
 			<< "		case " << column << ":\n"
 			<< "			switch((board[0]|board[1])&" << longNumber << ") {\n";
-			longNumber=0;
-			for (height=0; height<boardList[actualBoard].height; height++) {
+			for (height=0; height<board[actualBoard].height; height++) {
+				longNumber=0;
    			for (line=0; line<height; line++)
-				  setBit(longNumber, line*boardList[actualBoard].height+column);
+				  setBit(longNumber, field(board[actualBoard], line, column));
 				longNumber2=0;
-				setBit(longNumber2, height*boardList[actualBoard].height+column);
+				setBit(longNumber2, field(board[actualBoard], height, column));
 				output
 				<< "				case " << longNumber << ":\n"
 				<< "					board[actualPlayer]|=" << longNumber2 << ";\n"
+				<< "					if (";
+				firstRow=1;
+				// poziome
+				for (linex=column-3; linex<column+1; linex++)
+				  if ((linex>=0)&&(linex<=board[actualBoard].width-4)) {
+						longNumber2=0;
+						for (i=0; i<4; i++)
+						  setBit(longNumber2, field(board[actualBoard], height, linex+i));
+						if (firstRow)
+							firstRow=0;
+						else
+						  output
+							<< " || \n					    ";
+					  output
+						<< "((board[actualPlayer]&" << longNumber2 << ")==" << longNumber2 << ")";
+						totalNumberOfRows++;
+					}
+				// pionowe
+				for (liney=height-3; liney<height+1; liney++)
+				  if ((liney>=0)&&(liney<=board[actualBoard].height-4)) {
+						longNumber2=0;
+						for (i=0; i<4; i++)
+						  setBit(longNumber2, field(board[actualBoard], liney+i, column));
+						if (firstRow)
+							firstRow=0;
+						else
+						  output
+							<< " || \n					    ";
+					  output
+						<< "((board[actualPlayer]&" << longNumber2 << ")==" << longNumber2 << ")";
+						totalNumberOfRows++;
+					}
+				// rosnace
+				for (linex=column-3, liney=height-3; linex<column+1; linex++, liney++)
+				  if ((linex>=0)&&(linex<=board[actualBoard].width-4)&&
+					    (liney>=0)&&(liney<=board[actualBoard].height-4)&&
+							(abs(linex-column)==abs(liney-height))) {
+						longNumber2=0;
+						for (i=0; i<4; i++)
+						  setBit(longNumber2, field(board[actualBoard], linex+i, liney+i));
+						if (firstRow)
+							firstRow=0;
+						else
+						  output
+							<< " || \n					    ";
+					  output
+						<< "((board[actualPlayer]&" << longNumber2 << ")==" << longNumber2 << ")";
+						totalNumberOfRows++;
+					}
+				// malejace
+				for (linex=column-3, liney=height; linex<column+1; linex++, liney--)
+				  if ((linex>=0)&&(linex<=board[actualBoard].width-4)&&
+					    (liney>=0)&&(liney<=board[actualBoard].height-4)&&
+							(abs(linex-column)+abs(liney-height))==3) {
+						longNumber2=0;
+						for (i=0; i<4; i++)
+						  setBit(longNumber2, field(board[actualBoard], linex+i, liney+3-i));
+						if (firstRow)
+							firstRow=0;
+						else
+						  output
+							<< " || \n					    ";
+					  output
+						<< "((board[actualPlayer]&" << longNumber2 << ")==" << longNumber2 << ")";
+						totalNumberOfRows++;
+					}
+				output
+				<< ")\n"
+				<< "						return 2;\n"
 				<< "					break;\n";
 			}
-			/* if row is busy */
-			setBit(longNumber, column);
 			output
-			<< "				case " << longNumber << ":\n"
+			<< "				default:\n"
 			<< "					return -2;\n"
 			<< "					break;\n";
-			/* - */
 			output
+			<< "			};\n"
+			<< "			break;\n";
+		}
+		output
+		<< "	};\n"
+		<< "	actualPlayer=!actualPlayer;\n"
+		<< "	// totalNumberOfRows=" << totalNumberOfRows/4 << "\n"
+		<< "}\n\n";
+	}
+	
+	/**
+	 * removeToken
+	 */
+	for (actualBoard=0; actualBoard<boardNumber; actualBoard++) {
+		output
+		<< "inline int classBoard::removeToken" << board[actualBoard].width << board[actualBoard].height << "(int column) {\n"
+		<< "	actualPlayer=!actualPlayer;\n"
+		<< "	switch(column) {\n";
+		for (column = 0; column < board[actualBoard].width; column++) {
+			longNumber = 0;
+			for (line=0; line<board[actualBoard].height; line++)
+			  setBit(longNumber, field(board[actualBoard], line, column));
+			output
+			<< "		case " << column << ":\n"
+			<< "			switch((board[0]|board[1])&" << longNumber << ") {\n";
+			for (height=1; height<=board[actualBoard].height; height++) {
+				longNumber=0;
+   			for (line=0; line<height; line++)
+				  setBit(longNumber, field(board[actualBoard], line, column));
+				longNumber2=0;
+				for (i=0; i<field(board[actualBoard], board[actualBoard].height, board[actualBoard].width); i++)
+				  if (i != field(board[actualBoard], height-1, column))
+					setBit(longNumber2, i);
+				output
+				<< "				case " << longNumber << ":\n"
+				<< "					board[actualPlayer]&=" << longNumber2 << ";\n"
+				<< "					break;\n";
+			}
+			/*output
+			<< "				default:\n"
+			<< "					return -2;\n"
+			<< "					break;\n";*/
+			output
+			<< "			};\n"
 			<< "			break;\n";
 		}
 		output
diff --git a/poprecog/connect4/genboard.exe b/poprecog/connect4/genboard.exe
index 15ed40b..81dff2a 100644
Binary files a/poprecog/connect4/genboard.exe and b/poprecog/connect4/genboard.exe differ
diff --git a/poprecog/connect4/genboard.o b/poprecog/connect4/genboard.o
index 4c4d262..3570afb 100644
Binary files a/poprecog/connect4/genboard.o and b/poprecog/connect4/genboard.o differ