Witam Wszystkich,
Mam problem, ktory moze sie wydawac trywialny. Prośbę ów kieruję do wsyztskich którzy maja 5 minut i ochotę pomóc. otóz zacząłem swoją naukę calkiem niedawno, i znalazlem kod appletu gry Hare&Hounds, próbuje dokonać jego analizy (opisać cześci kodu) ale coś co zajmuje Masterom Javy 10 min mnie zajmuje juz ponad kilka dni:/...i utknąłem.
Szukalem podobnego watku (analizy kodu itp) ale nie znalazlem wiec z gory przepraszam jesli kogos ten watek rozdrazni i bedzie kusilo by napisac: " ten watek juz byl, odszukaj go:. Naprawde prosze o pomoc, za co z gdory dziekuje.
// 1--4--7 // looks correct in a Fixed font(monaco).
// /|\ | /|\
// / | \|/ | \
// 0--2--5--8--10
// \ | /|\ | /
// \|/ | \|/
// 3--6--9
//
// Initially "The Fox" has a piece at 5. It may move along the arcs.
// Initially "The Police" have pieces at 0,1,3.
// The Police plays first and may move only to the right or vertically along arcs.
// The fox wants to get to cell 0 (Escaped with the secrets). The Police wants to trap
// the fox by denying it a move. The Police accomplishes this if it completely hems in
// the fox, say at 3,5,9 with the fox at 6. The Fox wins, however, if the game exceeds
// 20 moves.
// The person plays the Police and moves first. The computer plays the fox. It initially
// plays quite badly, but learns from its mistakes.
// There are two files required. "fmg2.memory" is initially 165 rows of 11 zeros each.
// "fmg.board" is always as follows. 2 means a legal move for the police. Non-zero means
// a legal move for theFox.
// 0 2 2 2 0 0 0 0 0 0 0
// 1 0 2 0 2 2 0 0 0 0 0
// 1 2 0 2 0 2 0 0 0 0 0
// 1 0 2 0 0 2 2 0 0 0 0
// 0 1 0 0 0 2 0 2 0 0 0
// 0 1 1 1 2 0 2 2 2 2 0
// 0 0 0 1 0 2 0 0 0 2 0
// 0 0 0 0 1 1 0 0 2 0 2
// 0 0 0 0 0 1 0 2 0 2 2
// 0 0 0 0 0 1 1 0 2 0 2
// 0 0 0 0 0 0 0 1 1 1 0
// The game has exactly 165 legal positions for the Police.
// The user may resign a game by typing 0 0 for a move.
import java.util.Random;
import java.lang.Math;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class FMG extends Applet
{ private static final int maxMoves = 20;
private int [][] layout =
{ {0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 2, 0, 2, 2, 0, 0, 0, 0, 0},
{1, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0},
{1, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 2, 0, 2, 0, 0, 0},
{0, 1, 1, 1, 2, 0, 2, 2, 2, 2, 0},
{0, 0, 0, 1, 0, 2, 0, 0, 0, 2, 0},
{0, 0, 0, 0, 1, 1, 0, 0, 2, 0, 2},
{0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 2},
{0, 0, 0, 0, 0, 1, 1, 0, 2, 0, 2},
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0}
};
private int [] allMoves = new int [165];
private int [][] thisGame = new int [maxMoves][2];
private int [][] board = new int [165][11];
private int [] policePosition = new int[3];
private int theFox;
private int moves = 0;
private int gameState = 0; // 0 = firstClick, 1 = secondClick
private char [] boardCells = new char [11];
private TextField fromField, toField;
private TextField messages;
private FMGCanvas drawArea;
private long pwr(int x) // Computes 2 to the (x).
{ long result = 1;
for (int i = 0; i < x; i++)
result *=2;
return result;
}
void readFiles(Boolean smart)
//throws IOException// more here for safety
{ //File memoryFile = ("http:./fmg.memory");
//FileInputStream memoryFileStream = new FileInputStream(memoryFile);
int i;
for (i = 0; i<165; ++i)
for (int j = 0; j<11; ++j)
{ //if(smart)memoryFile.readInt(board(i,j));
//else
board[i][j] = 0;
}
//try memoryFileStream.close(); catch (IOException e);
}
boolean legalWhite(int x, int y)
{ if (theFox == y) return false; // Already occupied by theFox.
int here = -1;
int i;
for(i = 0; i<3; ++i)
if(policePosition[i] == x) here = i;
if(here<0) return false; // Police not at x now.
for (i = 0; i<3; ++i)
if(policePosition[i] == y) return false; // Already Police.
if (layout[x][y] != 2) return false; // No such move for the police.
policePosition[here] = y;
return true;
}
int genWhiteValue()
{ int a = (int)(pwr(policePosition[0])
+ pwr(policePosition[1])
+ pwr(policePosition[2]));
for(int s = 0; s<165; ++s)
if (allMoves[s] == a) return s;
return 0; // Never here.
}
void summarize(int moves, int outcome)
{ for(int i = 0; i<moves; ++i)
{ int s = thisGame[i][0];
int m = thisGame[i][1];
board[s][m] = board[s][m] + outcome;
}
}
int optimalBlack(int policeEntry)
{ int result = -1;
int i,j;
for (i = 0; i<11; ++i) // Check each position.
{ if(layout[theFox][i] != 0) // Legal move.
{ boolean occupied = false;
for(j = 0; j<3; ++j) // See if policeEntry is already there.
if(policePosition[j] == i) occupied = true;
if(!occupied)
{ if (result < 0) result = i; // Prime the search.
else if(board[policeEntry][result] < board[policeEntry][i])
result = i;// New best move.
}
}
}
return result;
}
class Mouser extends MouseAdapter
{ public void mouseReleased(MouseEvent e)
{ Point p = drawArea.getLocation();
e.translatePoint(p.x,p.y);
int x = e.getX();
int y = e.getY();
// System.out.println("x "+x+" y "+y);
if(getComponentAt(x,y)==(drawArea))
{ int which = drawArea.pollCells(x,y);
// System.out.println(gameState+" "+which+" " + x + " " + y);
// System.out.println(e.toString());
if(which < 0) return;
if (gameState == 0)
{ fromField.setText(String.valueOf(which));
gameState = 1 - gameState;
}
else
{ toField.setText(String.valueOf(which));
oneMove(moves++);
}
}
}
}
int getFromMove()
{ String ans = fromField.getText();
int result = Integer.parseInt(ans.trim());
return result;
}
int getToMove()
{ String ans = toField.getText();
int result = Integer.parseInt(ans.trim());
return result;
}
int oneMove(int moves)
{// paint(this.getGraphics());
int x,y;
int result = 0;
boolean resigned = false, won = false, lost = false;
x = getFromMove ();
y = getToMove();
messages.setText(x + " " + y);
if(x == 0 && y == 0) resigned = true; // User resigns.
if(moves >= maxMoves)
{ resigned = true;
messages.setText( maxMoves + " move limit exceeded.");
}
if(!resigned)
if(legalWhite(x,y))
{ int oldFox = theFox;
int policeMove = genWhiteValue();
int theFoxMove = optimalBlack(policeMove);
if(theFoxMove>0)
drawArea.movePieces(x, y, theFox, theFoxMove);
else
drawArea.movePieces(x, y, theFox, theFox);
drawArea.draw();
if(theFoxMove < 0) lost = true; // Machine loses.
else
{ thisGame[moves][0] = policeMove;
thisGame[moves][1] = theFoxMove;
theFox = theFoxMove;
moves++;
}
}
else
{ messages.setText( "Illegal.");
}
if(theFox == 0) won = true; // Machine wins.
if(resigned || won)
{ result = 1;
messages.setText("Machine wins.");
summarize(moves-1, 1);
}
else if (lost)
{ result = -1;
messages.setText("You win.");
summarize(moves-1,-1);
}
gameState = 0;
return result;
}
public void init()
{ int i = 0;
int L;
for ( L = 0; L<9; ++L)
{ int L1 = (int) pwr(L);
for (int M = L+1; M<10; ++M)
{ int M1 =(int) pwr(M);
for (int R = M+1; R<11; R++)
allMoves[i++] = L1 + M1 + (int) pwr(R);
}
}
for(L = 0; L<maxMoves; ++L)
for(int M = 0; M<2; ++M)
thisGame[L][M] = 0;
theFox = 5;
policePosition[0] = 0;
policePosition[1] = 1;
policePosition[2] = 3;
setLayout(new BorderLayout());
setBackground(Color.lightGray);
messages = new TextField("Welcome",30);
add("North", messages);
drawArea = new FMGCanvas();
drawArea.init();
drawArea.addMouseListener(new Mouser());
add("Center", drawArea);
Panel P = new Panel();
P.setLayout(new FlowLayout());
fromField = new TextField("0", 3);
toField = new TextField("2", 3);
P.add(fromField);
P.add(toField);
Button moveButton = new Button("Move");
moveButton.addActionListener(new MoveListener());
P.add(moveButton);
Button resignButton = new Button("Resign");
resignButton.addActionListener(new ResignListener());
P.add(resignButton);
Button newGame = new Button("New Game");
newGame.addActionListener(new NewGameListener());
P.add(newGame);
add("South", P);
}
class ResignListener implements ActionListener
{ public void actionPerformed(ActionEvent e)
{ messages.setText("Machine wins.");
summarize(moves-1, 1);
}
}
class MoveListener implements ActionListener
{ public void actionPerformed(ActionEvent e)
{ int result = oneMove(moves++);
}
}
class NewGameListener implements ActionListener
{ public void actionPerformed(ActionEvent e)
{ drawArea.reset();
messages.setText("OK");
fromField.setText("0");
toField.setText("2");
theFox = 5;
policePosition[0] = 0;
policePosition[1] = 1;
policePosition[2] = 3;
moves = 0;
for(int L = 0; L<maxMoves; ++L)
for(int M = 0; M<2; ++M)
thisGame[L][M] = 0;
gameState = 0;
}
}
public void paint(Graphics g)
{// drawArea.paint(g);
}
}
class cell
{ int x, y;
int ht, wt;
boolean hasWhitePiece = false;
boolean hasBlackPiece = false;
cell [] nbrs = new cell[4];
int nbrCount = 0;
cell(int left, int top, int width, int height)
{ x = left; y = top; ht = height; wt = width;
}
void addNeighbor(cell c)
{ nbrs[nbrCount++] = c;
}
void drawConnections(Graphics g)
{ Color oldColor = g.getColor();
g.setColor(Color.black);
for(int i = 0; i < nbrCount; ++i)
g.drawLine(x,y, nbrs[i].x, nbrs[i].y);
g.setColor(oldColor);
}
void draw(Graphics g)
{ Color oldColor = g.getColor();
if(hasWhitePiece) g.setColor(Color.white);
else if(hasBlackPiece)g.setColor(Color.red);
else g.setColor(Color.black);
g.fillRect(x - ht/2, y - wt/2, wt, ht);
g.setColor(oldColor);
}
}
class FMGCanvas extends Canvas
{ private int [] policePosition = new int[3];
private int theFox;
private static final int xv = 600;
private static final int yv = 400;
private static final int bw = 30;
private static final int bh = 30;
private cell [] s =
{ new cell(xv*3/20, yv*9/20, bw, bh),
new cell(xv*3/10, yv/4, bw, bh),
new cell(xv*3/10, yv*9/20, bw, bh),
new cell(xv*3/10, yv*13/20, bw, bh),
new cell(xv*9/20, yv/4, bw, bh),
new cell(xv*9/20, yv*9/20, bw, bh),
new cell(xv*9/20, yv*13/20, bw, bh),
new cell(xv*3/5, yv/4, bw, bh),
new cell(xv*3/5, yv*9/20, bw, bh),
new cell(xv*3/5, yv*13/20, bw, bh),
new cell(xv*3/4, yv*9/20, bw, bh)
};
void draw()
{ paint(getGraphics());
}
int pollCells(int x, int y)
{ int result = -1;
Point p = getLocation();
for(int i = 0; i < 11; ++i)
{ int left = p.x + s[i].x - s[i].wt/2;
int top = p.y + s[i].y - s[i].ht/2;
if (x > left && x < left + s[i].wt && y > top && y < top + s[i].ht)
return i;
}
return result;
}
public void reset()
{ theFox = 5;
policePosition[0] = 0;
policePosition[1] = 1;
policePosition[2] = 3;
for(int i = 0; i< 11; ++i)
{ s[i].hasWhitePiece = false;
s[i].hasBlackPiece = false;
}
s[0].hasWhitePiece = true;
s[1].hasWhitePiece = true;
s[3].hasWhitePiece = true;
s[5].hasBlackPiece = true;
paint(getGraphics());
}
public void init()
{ theFox = 5;
policePosition[0] = 0;
policePosition[1] = 1;
policePosition[2] = 3;
s[0].addNeighbor(s[1]);
s[0].addNeighbor(s[2]);
s[0].addNeighbor(s[3]);
s[0].hasWhitePiece = true;
s[1].addNeighbor(s[2]);
s[1].addNeighbor(s[4]);
s[1].addNeighbor(s[5]);
s[1].hasWhitePiece = true;
s[2].addNeighbor(s[1]);
s[2].addNeighbor(s[3]);
s[2].addNeighbor(s[5]);
s[3].addNeighbor(s[5]);
s[3].addNeighbor(s[6]);
s[3].hasWhitePiece = true;
s[4].addNeighbor(s[5]);
s[4].addNeighbor(s[7]);
s[5].addNeighbor(s[6]);
s[5].addNeighbor(s[7]);
s[5].addNeighbor(s[8]);
s[5].addNeighbor(s[9]);
s[5].hasBlackPiece = true;
s[6].addNeighbor(s[9]);
s[7].addNeighbor(s[8]);
s[7].addNeighbor(s[10]);
s[8].addNeighbor(s[9]);
s[8].addNeighbor(s[10]);
s[9].addNeighbor(s[10]);
}
void movePieces(int policeFrom, int policeTo, int foxFrom, int foxTo)
{ theFox = foxTo;
int i = 0;
while(policePosition[i] != policeFrom)
{ i++; if(i == 3) break;
}
policePosition[i] = policeTo;
s[policeFrom].hasWhitePiece = false;
s[policeTo].hasWhitePiece = true;
s[foxFrom].hasBlackPiece = false;
s[foxTo].hasBlackPiece = true;
}
public void paint(Graphics g)
{ int i;
for(i = 0; i < 10; ++i) // sic. 10 has no connections.
s[i].drawConnections(g);
for(i = 0; i < 11; ++i)
s[i].draw(g);
}