author | peter_k
<peter_k> 2005-11-05 23:32:36 UTC |
committer | peter_k
<peter_k> 2005-11-05 23:32:36 UTC |
parent | 773e284690f66b2f156fc3b8f24598fb1833c721 |
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