Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Java] le demo in j2sdk1.4.0

    Mi devo studiare tutte le applet contenute nella cartella demo presente nel j2sdk1.4.0. In particolare oggi mi tocca capire che fa il file TicTacToe.java, in effetti lanciata l'applet mi ritrovo il classico tris, le 9 caselle bianche in cui gioco contro il computer. Nel listato viene creato un array di boolean :

    static boolean won[] = new boolean[1 << 9];

    1 << 9 ho capito che vuol dire valori da 1 a 9 ma č la sintassi tipica del java2?

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    non vuol dire "i valori da..."

    >> op1 >> op2 shift bits of op1 right by distance op2
    << op1 << op2 shift bits of op1 left by distance op2
    >>> op1 >>> op2 shift bits of op1 right by distance op2 (unsigned)

    in pratica 5>>1, 0101, diventa 10, 1010, 5>>2 diventa 20, 10100

  3. #3

    !!!!

    Sotto ti posto l'intero listato che visto l'ampio uso dell'operatore << io rischio di non capire affatto. Non credo di aver capito cosa fa quest'operatore anche per i contesti in cui viene usato nel listato cosė come non ho capito il parametro c*xoff passato al metodo drawImage()


    public
    class TicTacToe extends Applet implements MouseListener {

    // White č la posizione corrente: il computer č bianco.
    int white;

    // Black č la posizione attuale: l'utente č nero.
    int black;

    //I quadrati in ordine di importanza
    final static int moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};

    //Le posizioni vincenti
    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));//mi spiegheresti qui che succede?
    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, 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);
    }
    }
    }
    }

    /**
    * 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";
    }
    }

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    l'operatore << sposta i bit a sinistra
    (1 << 0) | (1 << 1) | (1 << 2)
    0001<<0=0001
    0001<<1=0010
    0001<<2=0100
    l'operatore | č un or tra bit
    0001 | 0010 | 0100 = 0111 quindi il risultato č 7

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.