📄 wzq.java
字号:
import java.applet.Applet;
import java.awt.*;
import java.util.Random;
public class wzq extends Applet implements Runnable
{
public void stop()
{
LoopThread = null;
}
private int CalcZi(int i, int j, byte byte0)
{
CXY cxy = new CXY();
int k = 0;
int l = 0;
do
{
int i1 = 0;
int j1 = 0;
do
{
cxy.x = i;
cxy.y = j;
if(MoveAGrid(cxy, l + 4 * j1) && QiPan[cxy.x][cxy.y] == byte0)
do
{
if(QiPan[cxy.x][cxy.y] == 0 || QiPan[cxy.x][cxy.y] != byte0)
break;
i1++;
}
while(MoveAGrid(cxy, l + 4 * j1));
}
while(++j1 < 2);
if(i1 > k)
k = i1;
}
while(++l < 4);
return ++k;
}
private boolean CanDo()
{
return steps < ((GRIDSUM * GRIDSUM) / 100) * 80;
}
//电脑下棋
private int CPUDo(CXY cxy, byte byte0)
{
int ai[] = new int[2];
int ai1[] = new int[2];
int ai2[] = new int[2];
boolean flag = false;
EnterTimes++;
ai2[0] = 0;
for(int i = recLU.x; i <= recRD.x; i++)
{
for(int k = recLU.y; k <= recRD.y; k++)
{
int l = 0;
if(QiPan[i][k] == 0)
{
DoAStep(i, k, byte0);
l = CalcCPU(i, k, byte0);
}
if(l > 0)
{
int i1 = 0;
byte byte1;
if(byte0 == 1)
byte1 = 2;
else
byte1 = 1;
if(EnterTimes <= level && steps < ((GRIDSUM * GRIDSUM) / 100) * 80)
i1 = CPUDo(cxy, byte1);
l += i1;
if(l + Math.abs(rd.nextInt()) % 5 > ai2[0] || !flag)
{
ai[0] = i;
ai1[0] = k;
ai2[0] = l;
flag = true;
}
QiPan[i][k] = 0;
}
}
}
if(EnterTimes <= 1)
{
cxy.x = ai[0];
cxy.y = ai1[0];
int j = 0;
do
{
try
{
Thread.sleep(300L);
}
catch(InterruptedException _ex) { }
QiPan[cxy.x][cxy.y] = byte0;
repaint();
try
{
Thread.sleep(300L);
}
catch(InterruptedException _ex) { }
QiPan[cxy.x][cxy.y] = 0;
repaint();
}
while(++j < 2);
}
EnterTimes--;
return ai2[0];
}
public void ClearPan()
{
for(int i = 0; i < GRIDSUM; i++)
{
for(int j = 0; j < GRIDSUM; j++)
QiPan[i][j] = 0;
}
scHong = 0;
scHei = 0;
steps = 0;
recLU.x = 8;
recRD.x = 9;
recLU.y = 8;
recRD.y = 9;
}
private boolean MoveAGrid(CXY cxy, int i)
{
boolean flag = false;
i %= 8;
int j = cxy.x + oAdd[i][0];
int k = cxy.y + oAdd[i][1];
if(j >= 0 && j < GRIDSUM && k >= 0 && k < GRIDSUM)
{
cxy.x = j;
cxy.y = k;
flag = true;
}
return flag;
}
public void paint(Graphics g)
{
super.paint(g);
for(int i = 0; i < GRIDSUM + 1; i++)
{
g.drawLine(0, i * GRIDWIDTH, GRIDSUM * GRIDWIDTH, i * GRIDWIDTH);
g.drawLine(i * GRIDWIDTH, 0, i * GRIDWIDTH, GRIDSUM * GRIDWIDTH);
}
for(int j = 0; j < GRIDSUM; j++)
{
for(int k = 0; k < GRIDSUM; k++)
drawQi(g, j, k, QiPan[j][k]);
}
}
private void CPUInit()
{
PosAdd[0][0] = 8;
PosAdd[0][1] = -2;
PosAdd[1][0] = -2;
PosAdd[0][2] = 3;
PosAdd[2][0] = 3;
PosAdd[0][3] = 2;
PosAdd[3][0] = 2;
PosAdd[1][1] = -7;
PosAdd[1][2] = -1;
PosAdd[2][1] = -1;
PosAdd[1][3] = -1;
PosAdd[3][1] = -1;
PosAdd[2][2] = 4;
PosAdd[3][3] = 4;
PosAdd[2][3] = 4;
PosAdd[3][2] = 4;
}
public void mouseDOWNThis(Event event)
{
if(playerdo)
xiazi.put(event.x, event.y);
}
private int DoAStep(int i, int j, byte byte0)
{
if(QiPan[i][j] != 0 || byte0 == 0 || byte0 > 2)
{
return 0;
}
else
{
QiPan[i][j] = byte0;
return 1;
}
}
private void FreshRec(int i, int j)
{
if(i - recLU.x < 2)
{
recLU.x = i - 2;
if(recLU.x < 0)
recLU.x = 0;
}
if(recRD.x - i < 2)
{
recRD.x = i + 2;
if(recRD.x >= GRIDSUM)
recRD.x = GRIDSUM - 1;
}
if(j - recLU.y < 2)
{
recLU.y = j - 2;
if(recLU.y < 0)
recLU.y = 0;
}
if(recRD.y - j < 2)
{
recRD.y = j + 2;
if(recRD.y >= GRIDSUM)
recRD.y = GRIDSUM - 1;
}
}
public wzq()
{
GRIDWIDTH = 18;
GRIDSUM = 18;
QiPan = new byte[GRIDSUM][GRIDSUM];
oAdd = new int[8][2];
playing = false;
playerdo = true;
xy = new CXY();
xiazi = new CXiaZi();
rd = new Random();
recLU = new CXY();
recRD = new CXY();
PosAdd = new int[4][4];
}
public void update(Graphics g)
{
paint(g);
}
//画棋
public void drawQi(Graphics g, int i, int j, int k)
{
switch(k)
{
case 0: // '\0'
g.clearRect(i * GRIDWIDTH + 1, j * GRIDWIDTH + 1, GRIDWIDTH - 2,GRIDWIDTH - 2);
return;
case 1: // '\001'
g.setColor(Color.red);
g.fillArc(i * GRIDWIDTH + 2, j * GRIDWIDTH + 2, GRIDWIDTH - 4,GRIDWIDTH - 4, 0, 360);
return;
case 2: // '\002'
g.setColor(Color.black);
break;
}
g.fillArc(i * GRIDWIDTH + 2, j * GRIDWIDTH + 2, GRIDWIDTH - 4,GRIDWIDTH - 4, 0, 360);
}
public void start()
{
if(LoopThread == null)
LoopThread = new Thread(this, "wbqloop");
LoopThread.setPriority(1);
LoopThread.start();
}
public void run()
{
for(; Thread.currentThread() == LoopThread; xiazi.get(xy))
{
ClearPan();
repaint();
playing = true;
//谁先下随机
who = (byte)(Math.abs(rd.nextInt()) % 2 + 1);
for(passes = 0; playing && passes < 2;)
{
if(who == 1)
{
lblStatus.setText("\u7EA2\u65B9\u4E0B");
lblStatus.setForeground(Color.red);
}
else
{
lblStatus.setText("\u9ED1\u65B9\u4E0B");
lblStatus.setForeground(Color.black);
}
if(steps < ((GRIDSUM * GRIDSUM) / 100) * 80)
{
passes = 0;
if(who == 1) //人下棋
{
xiazi.get(xy);
for(; DoAStep(xy.x, xy.y, who) == 0; xiazi.get(xy));
scHong = CalcZi(xy.x, xy.y, who);
FreshRec(xy.x, xy.y);
steps++;
}
else //机器下棋
{
if(scHong == 0 && scHei == 0)
{
xy.x = 9;
xy.y = 9;
}
else
{
CPUDo(xy, who);
}
for(; DoAStep(xy.x, xy.y, who) == 0; CPUDo(xy, who));
scHei = CalcZi(xy.x, xy.y, who);
FreshRec(xy.x, xy.y);
steps++;
}
}
else
{
passes = 2;
}
if(scHong >= 5 || scHei >= 5)
playing = false;
repaint();
//交换下棋方
who = (byte)((1 - (who - 1)) + 1);
Thread.yield();
}
if(scHong >= 5) //红方胜
{
Status = "\u7EA2\u65B9\u80DC!";
lblStatus.setForeground(Color.red);
LoseTimes++;
}
else if(scHei >= 5)//黑方胜
{
Status = "\u9ED1\u65B9\u80DC!";
lblStatus.setForeground(Color.black);
if(LoseTimes > 0)
LoseTimes--;
}
else //平局
{
Status = "\u4E0D\u5206\u80DC\u8D1F!";
}
lblStatus.setText(Status);
repaint();
}
}
//入口,开始下棋,初始化
public void init()
{
super.init();
LoopThread = null;
oAdd[0][0] = 0;
oAdd[0][1] = -1;
oAdd[1][0] = 1;
oAdd[1][1] = -1;
oAdd[2][0] = 1;
oAdd[2][1] = 0;
oAdd[3][0] = 1;
oAdd[3][1] = 1;
oAdd[4][0] = 0;
oAdd[4][1] = 1;
oAdd[5][0] = -1;
oAdd[5][1] = 1;
oAdd[6][0] = -1;
oAdd[6][1] = 0;
oAdd[7][0] = -1;
oAdd[7][1] = -1;
CPUInit();
setLayout(null);
resize(325, 352);
lblStatus = new Label("Welcome");
lblStatus.setFont(new Font("Dialog", 1, 14));
add(lblStatus);
lblStatus.reshape(14, 332, 175, 15);
lblLevel = new Label("JAVA\u4E94\u5B50\u68CB");
lblLevel.setFont(new Font("Dialog", 1, 14));
add(lblLevel);
lblLevel.reshape(196, 332, 119, 15);
}
public boolean handleEvent(Event event)
{
if(event.id != 501 || event.target != this)
{
return super.handleEvent(event);
}
else
{
mouseDOWNThis(event);
return true;
}
}
private int CalcCPU(int i, int j, byte byte0)
{
CXY cxy = new CXY();
String s = "";
String s2 = "";
String s4 = "";
byte byte1 = 0;
CalcTimes++;
if(byte0 == 1)
byte1 = 2;
else
if(byte0 == 2)
byte1 = 1;
int k = 0;
int l = 0;
do
{
int i1 = 0;
String s1 = "";
String s3 = "";
String s5 = "";
int j1 = 0;
do
{
int k1 = 0;
cxy.x = i;
for(cxy.y = j; MoveAGrid(cxy, l + 4 * j1) && k1 < 6 &&
QiPan[cxy.x][cxy.y] != byte1; k1++)
if(QiPan[cxy.x][cxy.y] == byte0)
{
if(j1 == 0)
s3 += "1";
else
s5 = "1" + s5;
i1++;
}
else
if(j1 == 0)
s3 += "0";
else
s5 = "0" + s5;
if(j1 == 0)
s3 += "2";
else
s5 = "2" + s5;
}
while(++j1 < 2);
i1++;
s1 = s5 + "1" + s3;
if(s1.indexOf("11111") != -1)
i1 += 1000;
else
if(s1.indexOf("011110") != -1)
i1 += 500;
else
if(s1.indexOf("211110") != -1 || s1.indexOf("011112") != -1 ||
s1.indexOf("01110") != -1 || s1.indexOf("01110") != -1 || s1.indexOf("011010")
!= -1 || s1.indexOf("010110") != -1 || s1.indexOf("11101") != -1 ||
s1.indexOf("10111") != -1 ||
s1.indexOf("11011") != -1)
i1 += 100;
else
if(s1.indexOf("21110") != -1 || s1.indexOf("01112") != -1 ||
s1.indexOf("0110") != -1 || s1.indexOf("211010") != -1 || s1.indexOf("210110")
!= -1)
i1 += 20;
if(l == 1 || l == 3)
i1 += (i1 * 20) / 100;
k += i1;
}
while(++l < 4);
if(CalcTimes <= 1)
k += CalcCPU(i, j, byte1);
else
if(k > 10)
k -= 10;
CalcTimes--;
return k;
}
int GRIDWIDTH; //网格宽度
int GRIDSUM; //网格总数
byte QiPan[][]; //棋盘
int oAdd[][];
Thread LoopThread;
int scHong; //红方
int scHei; //黑方
byte who; //
byte winner; //赢方
boolean playing;
boolean playerdo;
CXY xy;
CXiaZi xiazi; //下子
String Status; //状态
Random rd; //随机数
int passes;
int steps;
int LoseTimes;
CXY recLU;
CXY recRD;
int PosAdd[][];
int level;
int EnterTimes;
int CalcTimes;
Label lblStatus;
Label lblLevel;
}
class CXiaZi
{
public synchronized void get(CXY cxy)
{
ready = false;
notify();
while(!ready)
try
{
wait();
}
catch(InterruptedException _ex) { }
ready = false;
notify();
cxy.x = xy.x;
cxy.y = xy.y;
}
public synchronized void put(int i, int j)
{
if(i < GRIDWIDTH * GRIDSUM && j < GRIDWIDTH * GRIDSUM)
{
xy.x = i / GRIDWIDTH;
xy.y = j / GRIDWIDTH;
ready = true;
notify();
}
}
public CXiaZi()
{
GRIDWIDTH = 18;
GRIDSUM = 18;
xy = new CXY();
ready = false;
}
private CXY xy;
private boolean ready;
private int GRIDWIDTH;
private int GRIDSUM;
}
class CXY
{
public CXY()
{
x = 0;
y = 0;
}
public int x;
public int y;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -