Não entendi o código Tic Tac Toe do applet java

1 resposta
A

Bom dia!!!

Eu vim procurar ajuda quanto ao entendimento daquele
código de applet do Tic Tac Toe que vem junto com o j2sdk1.4.2.
Eu tenho 3 dúvidas:
1º Qual a sequência do programa? Isto é, por onde começa e
por onde termina o jogo? Eu acho que o início é pelo método
de escuta do mouse no applet, mas só até aí.
2º O código possui uma única classe. Então, quando são chamados
os métodos?
3º Não entendi também o uso do deslocamento de bits para esquerda
em todo o código. Não entendi para que serve!
O código vai abaixo.

Quem puder me ajudar estará me prestando um grande favor
e ficarei muito grata.

Aguardo respostas! Obrigada!

/*

  • Copyright © 2003 Sun Microsystems, Inc. All Rights Reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
  • -Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • -Redistribution in binary form must reproduct the above copyright
  • notice, this list of conditions and the following disclaimer in
  • the documentation and/or other materials provided with the distribution.
  • Neither the name of Sun Microsystems, Inc. or the names of contributors
  • may be used to endorse or promote products derived from this software
  • without specific prior written permission.
  • This software is provided “AS IS,” without a warranty of any kind. ALL
  • EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
  • ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
  • OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT
  • BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
  • OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
  • DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
  • REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
  • INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
  • OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
  • IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  • You acknowledge that Software is not designed, licensed or intended for
  • use in the design, construction, operation or maintenance of any nuclear
  • facility.
    */

/*

  • @(#)TicTacToe.java 1.8 03/01/23
    */
import java.awt.<em>;

import java.awt.event.</em>;

import java.awt.image.<em>;

import <a href="http://java.net">java.net</a>.</em>;

import java.applet.*;

/**

  • A TicTacToe applet. A very simple, and mostly brain-dead

  • implementation of your favorite game! <p>

  • In this game a position is represented by a white and black

  • bitmask. A bit is set if a position is ocupied. There are

  • 9 squares so there are 1<<9 possible positions for each

  • side. An array of 1<<9 booleans is created, it marks

  • all the winning positions.

  • @version 1.2, 13 Oct 1995

  • @author Arthur van Hoff

  • @modified 04/23/96 Jim Hagen : winning sounds

  • @modified 02/10/98 Mike McCloskey : added destroy()
    
    <em>/
    
    public
    
    class TicTacToe extends Applet implements MouseListener {
    
    /</em>*
    
    • White’s current position. The computer is white.
      */
      int white;

    /**

    • Black’s current position. The user is black.
      */
      int black;

    /**

    • The squares in order of importance…
      */
      final static int moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};

    /**

    • The winning positions.
      */
      static boolean won[] = new boolean[1 << 9];
      static final int DONE = (1 << 9) - 1;
      static final int OK = 0;
      static final int WIN = 1;
      static final int LOSE = 2;
      static final int STALEMATE = 3;

    /**

    • Mark all positions with these bits set as winning.
      */
      static void isWon(int pos) {
      for (int i = 0 ; i < DONE ; i++) {
      if ((i & pos) == pos) {
      won[i] = true;
      }
      }
      }

    /**

    • Initialize all winning positions.
      */
      static {
      isWon((1 << 0) | (1 << 1) | (1 << 2));
      isWon((1 << 3) | (1 << 4) | (1 << 5));
      isWon((1 << 6) | (1 << 7) | (1 << 8));
      isWon((1 << 0) | (1 << 3) | (1 << 6));
      isWon((1 << 1) | (1 << 4) | (1 << 7));
      isWon((1 << 2) | (1 << 5) | (1 << 8));
      isWon((1 << 0) | (1 << 4) | (1 << 8));
      isWon((1 << 2) | (1 << 4) | (1 << 6));
      }

    /**

    • Compute the best move for white.
    • @return the square to take
      */
      int bestMove(int white, int black) {
      int bestmove = -1;
    loop:
    
    for (int i = 0 ; i < 9 ; i++) {
    
    int mw = moves[i];
    
    if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) {
    
    int pw = white | (1 << mw);
    
    if (won[pw]) {
    
    // white wins, take it!
    
    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]) {
    
    // black wins, take another
    
    continue loop;
    
    }
    
    }
    
    }
    
    // Neither white nor black can win in one move, this will do.
    
    if (bestmove == -1) {
    
    bestmove = mw;
    
    }
    
    }
    
    }
    
    if (bestmove != -1) {
    
    return bestmove;
    
    }
    
    // No move is totally satisfactory, try the first one that is open
    
    for (int i = 0 ; i < 9 ; i++) {
    
    int mw = moves[i];
    
    if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) {
    
    return mw;
    
    }
    
    }
    
    // No more moves
    
    return -1;
    
    }
    

    /**

    • User move.
    • @return true if legal
      */
      boolean yourMove(int m) {
      if ((m < 0) || (m > 8)) {
      return false;
      }
      if (((black | white) & (1 << m)) != 0) {
      return false;
      }
      black |= 1 << m;
      return true;
      }

    /**

    • Computer move.
    • @return true if legal
      */
      boolean myMove() {
      if ((black | white) == DONE) {
      return false;
      }
      int best = bestMove(white, black);
      white |= 1 << best;
      return true;
      }

    /**

    • Figure what the status of the game is.
      */
      int status() {
      if (won[white]) {
      return WIN;
      }
      if (won[black]) {
      return LOSE;
      }
      if ((black | white) == DONE) {
      return STALEMATE;
      }
      return OK;
      }

    /**

    • Who goes first in the next game?
      */
      boolean first = true;

    /**

    • The image for white.
      */
      Image notImage;

    /**

    • The image for black.
      */
      Image crossImage;

    /**

    • Initialize the applet. Resize and load images.
      */
      public void init() {
      notImage = getImage(getCodeBase(), “images/not.gif”);
      crossImage = getImage(getCodeBase(), “images/cross.gif”);

    addMouseListener(this);
    }

    public void destroy() {
    
    removeMouseListener(this);
    
    }
    

    /**

    • Paint it.
      /
      public void paint(Graphics g) {
      Dimension d = getSize();
      g.setColor(Color.black);
      int xoff = d.width / 3;
      int yoff = d.height / 3;
      g.drawLine(xoff, 0, xoff, d.height);
      g.drawLine(2
      xoff, 0, 2xoff, 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<em>xoff + 1, r</em>yoff + 1, this);
    
    } else if ((black & (1 << i)) != 0) {
    
    g.drawImage(crossImage, c<em>xoff + 1, r</em>yoff + 1, this);
    
    }
    
    }
    
    }
    
    }
    

    /**

    • The user has clicked in the applet. Figure out where
    • and see if a legal move is possible. If it is a legal
    • move, respond with a legal move (if possible).
      */
      public void mouseReleased(MouseEvent e) {
      int x = e.getX();
      int y = e.getY();
    switch (status()) {
    
    case WIN:
    
    case LOSE:
    
    case STALEMATE:
    
    play(getCodeBase(), audio/return.au);
    
    white = black = 0;
    
    if (first) {
    
    white |= 1 << (int)(Math.random() * 9);
    
    }
    
    first = !first;
    
    repaint();
    
    return;
    
    }
    
    // Figure out the row/column
    
    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:
     play(getCodeBase(), "audio/yahoo1.au");
     break;
       case LOSE:
     play(getCodeBase(), "audio/yahoo2.au");
     break;
       case STALEMATE:
     break;
       default:
     if (myMove()) {
         repaint();
         switch (status()) {
           case WIN:
     	play(getCodeBase(), "audio/yahoo1.au");
     	break;
           case LOSE:
     	play(getCodeBase(), "audio/yahoo2.au");
     	break;
           case STALEMATE:
     	break;
           default:
     	play(getCodeBase(), "audio/ding.au");
         }
     } else {
         play(getCodeBase(), "audio/beep.au");
     }
     }
    
    } else {
    
    play(getCodeBase(), audio/beep.au);
    
    }
    
    }
    

    public void mousePressed(MouseEvent e) {
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public String getAppletInfo() {
    
    return TicTacToe by Arthur van Hoff;
    
    }
    
    }
    

1 Resposta

J

Oi

Athena, seja bem vinda ao PJ

Bom, como é uma applet, sempre começa pelo método init() :slight_smile:

T+

Criado 12 de agosto de 2004
Ultima resposta 16 de ago. de 2004
Respostas 1
Participantes 2