import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class Sanziqi extends Applet
{
int white;
int black;
final static int moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};
static boolean won[] = new boolean[512]; //将整数1左移9位变为(1000000000)2=2^9=512
static final int DONE = 511; //DONE=511
static final int OK = 0;
static final int WIN = 1;
static final int LOSE = 2;
static final int STALEMATE = 3;
static void isWon(int pos)
{
for (int i = 0 ; i < DONE ; i++)
if (i==pos) //i与pos进行位与操作
won[i] = true;
}
static //这是什么语法?
{
isWon(7); // 00000111=7
isWon(56); // 00111000=2^5+2^4+2^3=56
isWon(448); // 111000000=256+128+64=448
isWon(73); // 01001001=64+8+1=73
isWon(146); // 10010010=128+16+2=146
isWon(292); // 100100100=256+32+4=292
isWon(273); // 100010001=256+16+1=273
isWon(84); // 01010100=64+16+4=84
}
int bestMove(int white, int black)
{
int bestmove = -1;
loop:
for (int i = 0 ; i < 9 ; i++)
{
int mw = moves[i]; // moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};
if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) //作啥用啊?
{
int pw = white | (1 << mw); //作啥用啊?
if (won[pw])
return mw;
for (int mb = 0 ; mb < 9 ; mb++) //作啥用啊?
if (((pw & (1 << mb)) == 0) && ((black & (1 << mb)) == 0))
{
int pb = black | (1 << mb);
if (won[pb])
continue loop; //带标号的continue语句
}
if (bestmove == -1)
bestmove = mw;
}
}
if (bestmove != -1)
return bestmove;
for (int i = 0 ; i < 9 ; i++)
{
int mw = moves[i];
if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) //作啥用啊?
return mw;
}
return -1;
}
boolean yourMove(int m)
{
if ((m < 0) || (m > 8))
return false;
if (((black | white) & (1 << m)) != 0)
return false;
black |= 1 << m; //作啥用啊?
return true;
}
boolean myMove()
{
if ((black | white) == DONE)
return false;
int best = bestMove(white, black);
white |= 1 << best;
return true;
}
int status()
{
if (won[white])
return WIN;
if (won[black])
return LOSE;
if ((black | white) == DONE)
return STALEMATE;
return OK;
}
boolean first = true;
Image notImage;
Image crossImage;
public void init()
{
notImage = getImage(getCodeBase(), "images/not.gif"); //载入图片
crossImage = getImage(getCodeBase(), "images/cross.gif"); //载入图片
addMouseListener(new MouseReleasedHander());
}
public void paint(Graphics g)
{
Dimension d = getSize(); //获得当前绘图区大小
g.setColor(Color.GREEN); //设置绘图颜色
int xoff = d.width / 3;
int yoff = d.height / 3;
g.drawLine(xoff, 0, xoff, d.height); //绘制棋盘网格
g.drawLine(2*xoff, 0, 2*xoff, d.height);
g.drawLine(0, yoff, d.width, yoff);
g.drawLine(0, 2*yoff, d.width, 2*yoff);
int i = 0;
for (int r = 0 ; r < 3 ; r++)
for (int c = 0 ; c < 3 ; c++, i++)
if ((white & (1 << i)) != 0)
g.drawImage(notImage, c*xoff + 1, r*yoff + 1, this); //在指定坐标绘制棋子
else if ((black & (1 << i)) != 0)
g.drawImage(crossImage, c*xoff + 1, r*yoff + 1, this);
}
private class MouseReleasedHander extends MouseAdapter //扩展MouseAdapter,只需重写必要的函数mouseReleased
{
public void mouseReleased(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
switch (status())
{
case WIN:
case LOSE:
case STALEMATE:
white = black = 0;
if (first)
white |= 1 << (int)(Math.random() * 9);
first = !first;
repaint();
return;
}
Dimension d = getSize();
int c = (x * 3) / d.width;
int r = (y * 3) / d.height;
if (yourMove(c + r * 3))
{
repaint();
switch (status())
{
case WIN:
case LOSE:
case STALEMATE:
break;
default:
if (myMove())
repaint();
}
}
}
} //inner class end
} //end of public class
Sanziqi.rar_sanziqi_三子棋
版权申诉
115 浏览量
2022-09-22
16:47:27
上传
评论
收藏 12KB RAR 举报
四散
- 粉丝: 54
- 资源: 1万+