📄 wzq.java
字号:
/* OK first of all, when I wrote this, I just copied my c code and translated to java.
I had never written any java code ever before, and now, three years later, I find this
code horrible.
But because of the many requests for the code I've decided to put out the code anyway,
but I warn you, don't code like this!
Note that this engine doesn't think ahead, it just evaluate the current position.
The best way to proceed is maybe to modify the Analyze function and use it with the
MiniMax algorithm. I actually started coding some think-ahead but I think i'ts
commented below.
Well that's it, and good luck!
Staffan Ekvall
pnyxtr@yahoo.com
*/
import java.awt.*;
import java.awt.image.*;
import java.net.*;
import java.applet.*;
//import java.util.math;
public
class Connect5 extends Applet
{
char Board[][][] = new char[32][32][2];
int PointBoard[][] = new int[32][32];
int x, y;
int startx = 15, endx = 15, starty = 15, endy = 15;
int white;
int black;
char cleararea = 1;
static final int PLAYING = 0;
static final int NOTPLAYING = 1;
static final int WAITING = 1;
static final int YOUWON = 2;
static final int YOULOST = 3;
int status = NOTPLAYING;
int picturestatus = WAITING;
int status2[] = { 0, 0 };
int fx, fy;
static final char EMPTY = 0;
static final char MARKX = 1;
static final char MARKO = 2;
static final char EDGE = 3;
static final int FIVE = 80000;
static final int FOUR = 12000;
static final int THREE = 500;
static final int THREEHOLE = 450;
static final int FOURBLOCK = 450;
static final int FOURBLOCKHOLE = 400;
static final int TWO = 50;
static final int TWOHOLE = 45;
static final int THREEBLOCK = 40;
static final int TWOBLOCK = 3;
void
CopyBoard(int from, int to)
{
for (x = 0; x < 32; x++)
for (y = 0; y < 32; y++)
Board[x][y][to] = Board[x][y][from];
}
int
ChkWin(int realcheck)
{
int x, y, mx[] = { 1, 0, 1, -1 }, my[] = { 0, 1, 1, 1 }, i, type;
for (x = startx - 4; x < endx + 4; x++)
for (y = starty - 4; y < endy + 4; y++)
{
if (Board[x][y][0] > 0)
{
type = Board[x][y][0];
if (type != EDGE)
for (i = 0; i < 4; i++)
if (Board[x + 1 * mx[i]][y + 1 * my[i]][0] == type &&
S(x + 2 * mx[i], y + 2 * my[i]) == type &&
S(x + 3 * mx[i], y + 3 * my[i]) == type &&
S(x + 4 * mx[i], y + 4 * my[i]) == type)
{
if (realcheck == 1)
{
status = NOTPLAYING;
if (type == MARKX)
{
picturestatus = YOUWON;
}
else
{
picturestatus = YOULOST;
}
}
return type;
}
}
}
return 0;
}
boolean
yourMove(int x, int y)
{
if (x < 1 || x > 30 || y < 1 || y > 30)
return false;
if (Board[x][y][0] != EMPTY)
return false;
MakeMark(x, y, MARKX);
return true;
}
int
S(int x, int y)
{
if (x < 0) return EDGE;
if (y < 0) return EDGE;
if (x > 31) return EDGE;
if (y > 31) return EDGE;
return (Board[x][y][0]);
}
int
Analyze(char type, float multiplier)
{
/*
# = EMPTY
_ = CURRENT SQUARE
X = OWN MARKS
O = OPP MARKS
* == X or #
*/
int x, y, mx[] = { 1, -1, 0, 0, 1, -1, 1, -1 }, my[] = { 0, 0, 1, -1, 1, 1, -1, -1 }, i;
int points = 0;
int blockmult[][] = new int[32][32];
for (x = 0; x < 32; x++)
for (y = 0; y < 32; y++)
blockmult[x][y] = 1;
for (x = startx - 4; x < endx + 4; x++)
for (y = starty - 4; y < endy + 4; y++)
{
if (S(x, y) == EMPTY)
for (i = 0; i < 8; i++)
{
if (S(x + 1 * mx[i], y + 1 * my[i]) == type)
{
if (S(x + 2 * mx[i], y + 2 * my[i]) == type)
{
if (S(x + 3 * mx[i], y + 3 * my[i]) == type)
{
if (S(x + 4 * mx[i], y + 4 * my[i]) == type) // _XXXX XXXX_
{
points += FIVE;
PointBoard[x][y] += FIVE * multiplier;
continue;
}
if (S(x + 4 * mx[i], y + 4 * my[i]) == EMPTY)
{
if (S(x - 1 * mx[i], y - 1 * my[i]) == type) // X_XXX# #XXX_X
{
points += FIVE;
PointBoard[x][y] += FIVE * multiplier;
continue;
}
if (S(x - 1 * mx[i], y - 1 * my[i]) == EMPTY) // #_XXX# #XXX_#
{
points += FOUR;
PointBoard[x][y] += FOUR * multiplier;
continue;
}
// O_XXX# #XXX_O
points += FOURBLOCK;
PointBoard[x][y] += FOURBLOCK * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
// S(x + 4 * mx[i], y + 4 * my[i]) = fi || edge
if (S(x - 1 * mx[i], y - 1 * my[i]) == type) // X_XXXO OXXX_X
{
points += FIVE;
PointBoard[x][y] += FIVE * multiplier;
continue;
}
if (S(x - 1 * mx[i], y - 1 * my[i]) == EMPTY) // #_XXXO OXXX_#
{
points += FOURBLOCK;
PointBoard[x][y] += FOURBLOCK * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
// O_XXXO OXXX_O
continue;
}
// ---------------------------- S(x + 3 * mx[i], y + 3 * my[i]) != type
if (S(x + 3 * mx[i], y + 3 * my[i]) == EMPTY)
{
if (S(x - 1 * mx[i], y - 1 * my[i]) == EMPTY) // #_XX# #XX_#
{
points += THREE;
PointBoard[x][y] += THREE * multiplier;
continue;
}
if (S(x - 1 * mx[i], y - 1 * my[i]) == type)
{
if (S(x - 2 * mx[i], y - 2 * my[i]) == EMPTY) // #X_XX# #XX_X#
{
points += FOUR;
PointBoard[x][y] += FOUR * multiplier;
continue;
}
if (S(x - 2 * mx[i], y - 2 * my[i]) == type) // XX_XX# #XX_XX Dual
{
points += FIVE / 2;
PointBoard[x][y] += FIVE * multiplier / 2;
continue;
}
// OX_XX# #XX_XO
points += FOURBLOCK;
PointBoard[x][y] += FOURBLOCK * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
// S(x - 1 * mx[i], y - 1 * my[i]) == fi || edge
if (S(x + 4 * mx[i], y + 4 * my[i]) == EMPTY) // O_XX## ##XX_O
{
points += THREEBLOCK;
PointBoard[x][y] += THREEBLOCK * multiplier;
continue;
}
if (S(x + 4 * mx[i], y + 4 * my[i]) == type) // O_XX#X X#XX_O
{
points += FOURBLOCKHOLE;
PointBoard[x][y] += FOURBLOCKHOLE * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
// O_XX#O O#XX_O
continue;
}
// S(x + 3 * mx[i], y + 3 * my[i]) == fi || edge
if (S(x - 1 * mx[i], y - 1 * my[i]) == EMPTY)
{
if (S(x - 2 * mx[i], y - 2 * my[i]) == EMPTY) // ##_XXO OXX_##
{
points += THREEBLOCK;
PointBoard[x][y] += THREEBLOCK * multiplier;
continue;
}
if (S(x - 2 * mx[i], y - 2 * my[i]) == type) // X#_XXO OXX_#X
{
points += FOURBLOCKHOLE;
PointBoard[x][y] += FOURBLOCKHOLE * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
// O#_XXO OXX_#O
continue;
}
if (S(x - 1 * mx[i], y - 1 * my[i]) == type) // X_XXO OXX_X
{
if (S(x - 2 * mx[i], y - 2 * my[i]) == EMPTY) // #X_XXO OXX_X#
{
points += FOURBLOCK;
PointBoard[x][y] += FOURBLOCK * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
if (S(x - 2 * mx[i], y - 2 * my[i]) == type) // XX_XXO OXX_XX Dual
{
points += FIVE / 2;
PointBoard[x][y] += FIVE * multiplier / 2;
continue;
}
// OX_XXO OXX_XO
continue;
}
// O_XXO OXX_O
continue;
}
// --------------------- S(x + 2 * mx[i], y + 2 * my[i]) != type
if (S(x + 2 * mx[i], y + 2 * my[i]) == EMPTY) // _X#
{
if (S(x - 1 * mx[i], y - 1 * my[i]) == EMPTY) // #_X#
{
if (S(x - 2 * mx[i], y - 2 * my[i]) == type) // X#_X#
{
if (S(x - 3 * mx[i], y - 3 * my[i]) == EMPTY) // #X#_X#
{
points += THREEHOLE;
PointBoard[x][y] += THREEHOLE * multiplier;
continue;
}
if (S(x - 3 * mx[i], y - 3 * my[i]) == type) // XX#_X#
{
points += FOURBLOCKHOLE;
PointBoard[x][y] += FOURBLOCKHOLE * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
points += THREEBLOCK;
PointBoard[x][y] += THREEBLOCK * multiplier;
// OX#_X#
continue;
}
if (S(x - 2 * mx[i], y - 2 * my[i]) == EMPTY) // ##_X#
{
if (S(x + 3 * mx[i], y + 3 * my[i]) == EMPTY) // ##_X##
{
points += TWO;
PointBoard[x][y] += TWO * multiplier;
continue;
}
if (S(x + 3 * mx[i], y + 3 * my[i]) == type) // ##_X#X
{
if (S(x + 4 * mx[i], y + 4 * my[i]) == EMPTY) // ##_X#X#
{
points += THREEHOLE;
PointBoard[x][y] += THREEHOLE * multiplier;
continue;
}
if (S(x + 4 * mx[i], y + 4 * my[i]) == type) // ##_X#XX
{
points += FOURBLOCKHOLE;
PointBoard[x][y] += FOURBLOCKHOLE * multiplier * blockmult[x][y];
blockmult[x][y]++;
continue;
}
// ##_X#XO
points += THREEBLOCK;
PointBoard[x][y] += THREEBLOCK * multiplier;
continue;
}
// ##_X#O
points += TWO;
PointBoard[x][y] += TWO * multiplier;
continue;
}
// O#_X#
if (S(x + 3 * mx[i], y + 3 * my[i]) == EMPTY) // O#_X##
{
points += TWO;
PointBoard[x][y] += TWO * multiplier;
continue;
}
if (S(x + 3 * mx[i], y + 3 * my[i]) == type)
{
if (S(x + 4 * mx[i], y + 4 * my[i]) == EMPTY) // O#_X#X#
{
points += THREEHOLE;
PointBoard[x][y] += THREEHOLE * multiplier;
continue;
}
if (S(x + 4 * mx[i], y + 4 * my[i]) == type) // O#_X#XX
{
points += FOURBLOCKHOLE;
PointBoard[x][y] += FOURBLOCKHOLE * multiplier * blockmult[x][y]; blockmult[x][y]++;
blockmult[x][y]++;
continue;
}
// O#_X#XO
points += THREEBLOCK;
PointBoard[x][y] += THREEBLOCK * multiplier;
continue;
}
// O#_X#O
continue;
}
if (S(x - 1 * mx[i], y - 1 * my[i]) == type)
{
if (S(x - 2 * mx[i], y - 2 * my[i]) == type) // XX_X#
continue; // Already processed
if (S(x - 2 * mx[i], y - 2 * my[i]) == EMPTY) // #X_X# // Dual
{
points += THREE / 2;
PointBoard[x][y] += THREE * multiplier / 2;
continue;
}
if (S(x + 3 * mx[i], y + 3 * my[i]) == EMPTY) // OX_X##
{
points += THREEBLOCK;
PointBoard[x][y] += THREEBLOCK * multiplier;
continue;
}
if (S(x + 3 * mx[i], y + 3 * my[i]) == type) // OX_X#X
{
points += FOURBLOCKHOLE;
PointBoard[x][y] += FOURBLOCKHOLE * multiplier;
continue;
}
// OX_X#O
continue;
}
if (S(x + 3 * mx[i], y + 3 * my[i]) == EMPTY)
{
if (S(x + 4 * mx[i], y + 4 * my[i]) == EMPTY) // O_X###
{
points += TWOBLOCK;
PointBoard[x][y] += TWOBLOCK * multiplier;
continue;
}
if (S(x + 4 * mx[i], y + 4 * my[i]) == type) // O_X##X
{
points += TWOBLOCK;
PointBoard[x][y] += TWOBLOCK * multiplier;
continue;
}
// O_X##O
continue;
}
if (S(x + 3 * mx[i], y + 3 * my[i]) == type)
{
if (S(x + 4 * mx[i], y + 4 * my[i]) == EMPTY) // O_X#X#
{
points += THREEBLOCK;
PointBoard[x][y] += THREEBLOCK * multiplier;
continue;
}
if (S(x + 4 * mx[i], y + 4 * my[i]) == type) // O_X#XX
{
points += FOURBLOCKHOLE;
PointBoard[x][y] += FOURBLOCKHOLE * multiplier * blockmult[x][y];
blockmult[x][y]++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -