[HELP] - Bạn nào Code gúpgame dò mìn kết nối client/server để 2 người chơi với nhau thì giúp mình ới

karykan

New Member
19/4/11
6
0
1
Như tiêu đề, mình muốn tạo 1 game dò mìn. với ý tưởng là 2 người sẽ kết nối với nhau rồi chơi.
người thứ 1 nhấp trước, nếu không trúng mìn thì tiếp tục tới người thứ 2. ai trúng mìn trước thì thua. :( bạn nào bjk giúp mình với nhak
 

karykan

New Member
19/4/11
6
0
1
mình đọc xong hết rồi...thế giờ muốn được giúp đỡ thì phải làm sao :-ss

tìm trên google nhiều rồi mà hok ra....giờ mình chỉ hiểu sơ qua về code dò mìn chơi 1 mình giống như trong game của win thôi chứ cái zụ về client/server thì p0tay :(
 

karykan

New Member
19/4/11
6
0
1
Đây là code mình viết chơi được trên 1 máy...giờ mình muốn tạo client vs server để chơi đối kháng giữa 2 người...mỗi người dò 1 lần...nhưng ko bít làm thế nào :-ss

Class Board
Code:
package bom;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Board extends JPanel {

    private final int NUM_IMAGES = 13;
    private final int CELL_SIZE = 30;

    private final int COVER_FOR_CELL = 10;
    private final int MARK_FOR_CELL = 10;
    private final int EMPTY_CELL = 0;
    private final int MINE_CELL = 9;
    private final int COVERED_MINE_CELL = MINE_CELL + COVER_FOR_CELL;
    private final int MARKED_MINE_CELL = COVERED_MINE_CELL + MARK_FOR_CELL;

    private final int DRAW_MINE = 9;
    private final int DRAW_COVER = 10;
    private final int DRAW_MARK = 11;
    private final int DRAW_WRONG_MARK = 12;

    private int[] field;
    private boolean inGame;
    private int mines_left;
    private Image[] img;
    private int mines = 50;
    private int rows = 16;
    private int cols = 16;
    private int all_cells;
    private JLabel statusbar;
 
    public Board(JLabel statusbar) {

        this.statusbar = statusbar;

        img = new Image[NUM_IMAGES];

        for (int i = 0; i < NUM_IMAGES; i++) {
            img[i] = (new ImageIcon(Integer.toString(i)
                        + ".png")).getImage();
        }
        setDoubleBuffered(true);

        addMouseListener(new MinesAdapter());
        newGame();
    }
  
    public void newGame() {

        Random random;
        int current_col;

        int i = 0;
        int position = 0;
        int cell = 0;

        random = new Random();
        inGame = true;
        mines_left = mines;

        all_cells = rows * cols;
        field = new int[all_cells];

        for (i = 0; i < all_cells; i++)
            field[i] = COVER_FOR_CELL;

        statusbar.setText(Integer.toString(mines_left));
 
        i = 0;
        while (i < mines) {

            position = (int) (all_cells * random.nextDouble());

            if ((position < all_cells) &&
                (field[position] != COVERED_MINE_CELL)) {
 
                current_col = position % cols;
                field[position] = COVERED_MINE_CELL;
                i++;

                if (current_col > 0) {
                    cell = position - 1 - cols;
                    if (cell >= 0)
                        if (field[cell] != COVERED_MINE_CELL)
                            field[cell] += 1;
                    cell = position - 1;
                    if (cell >= 0)
                        if (field[cell] != COVERED_MINE_CELL)
                            field[cell] += 1;

                    cell = position + cols - 1;
                    if (cell < all_cells)
                        if (field[cell] != COVERED_MINE_CELL)
                            field[cell] += 1;
                }

                cell = position - cols;
                if (cell >= 0)
                    if (field[cell] != COVERED_MINE_CELL)
                        field[cell] += 1;
                cell = position + cols;
                if (cell < all_cells)
                    if (field[cell] != COVERED_MINE_CELL)
                        field[cell] += 1;

                if (current_col < (cols - 1)) {
                    cell = position - cols + 1;
                    if (cell >= 0)
                        if (field[cell] != COVERED_MINE_CELL)
                            field[cell] += 1;
                    cell = position + cols + 1;
                    if (cell < all_cells)
                        if (field[cell] != COVERED_MINE_CELL)
                            field[cell] += 1;
                    cell = position + 1;
                    if (cell < all_cells)
                        if (field[cell] != COVERED_MINE_CELL)
                            field[cell] += 1;
                }
            }
        }
    }
 
    public void find_empty_cells(int j) {

        int current_col = j % cols;
        int cell;

        if (current_col > 0) {
            cell = j - cols - 1;
            if (cell >= 0)
                if (field[cell] > MINE_CELL) {
                    field[cell] -= COVER_FOR_CELL;
                    if (field[cell] == EMPTY_CELL)
                        find_empty_cells(cell);
                }

            cell = j - 1;
            if (cell >= 0)
                if (field[cell] > MINE_CELL) {
                    field[cell] -= COVER_FOR_CELL;
                    if (field[cell] == EMPTY_CELL)
                        find_empty_cells(cell);
                }

            cell = j + cols - 1;
            if (cell < all_cells)
                if (field[cell] > MINE_CELL) {
                    field[cell] -= COVER_FOR_CELL;
                    if (field[cell] == EMPTY_CELL)
                        find_empty_cells(cell);
                }
        }

        cell = j - cols;
        if (cell >= 0)
            if (field[cell] > MINE_CELL) {
                field[cell] -= COVER_FOR_CELL;
                if (field[cell] == EMPTY_CELL)
                    find_empty_cells(cell);
            }

        cell = j + cols;
        if (cell < all_cells)
            if (field[cell] > MINE_CELL) {
                field[cell] -= COVER_FOR_CELL;
                if (field[cell] == EMPTY_CELL)
                    find_empty_cells(cell);
            }

        if (current_col < (cols - 1)) {
            cell = j - cols + 1;
            if (cell >= 0)
                if (field[cell] > MINE_CELL) {
                    field[cell] -= COVER_FOR_CELL;
                    if (field[cell] == EMPTY_CELL)
                        find_empty_cells(cell);
                }

            cell = j + cols + 1;
            if (cell < all_cells)
                if (field[cell] > MINE_CELL) {
                    field[cell] -= COVER_FOR_CELL;
                    if (field[cell] == EMPTY_CELL)
                        find_empty_cells(cell);
                }

            cell = j + 1;
            if (cell < all_cells)
                if (field[cell] > MINE_CELL) {
                    field[cell] -= COVER_FOR_CELL;
                    if (field[cell] == EMPTY_CELL)
                        find_empty_cells(cell);
                }
        }

    }

    public void paint(Graphics g) {

        int cell = 0;
        int uncover = 0;
 
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {

                cell = field[(i * cols) + j];

                if (inGame && cell == MINE_CELL)
                    inGame = false;

                if (!inGame) {
                    if (cell == COVERED_MINE_CELL) {
                        cell = DRAW_MINE;
                    } else if (cell == MARKED_MINE_CELL) {
                        cell = DRAW_MARK;
                    } else if (cell > COVERED_MINE_CELL) {
                        cell = DRAW_WRONG_MARK;
                    } else if (cell > MINE_CELL) {
                        cell = DRAW_COVER;
                    }
 
                } else {
                    if (cell > COVERED_MINE_CELL)
                        cell = DRAW_MARK;
                    else if (cell > MINE_CELL) {
                        cell = DRAW_COVER;
                        uncover++;
                    }
                }
                g.drawImage(img[cell], (j * CELL_SIZE),
                    (i * CELL_SIZE), 30, 30, this);
            }
        }
 
        if (uncover == 0 && inGame) {
            inGame = false;
            statusbar.setText("Game won");
        } else if (!inGame)
            statusbar.setText("Game lost");
    }
 
    class MinesAdapter extends MouseAdapter {
        public void mousePressed(MouseEvent e) {

            int x = e.getX();
            int y = e.getY();

            int cCol = x / CELL_SIZE;
            int cRow = y / CELL_SIZE;

            boolean rep = false;
 
            if (!inGame) {
                newGame();
                repaint();
            }
 
            if ((x < cols * CELL_SIZE) && (y < rows * CELL_SIZE)) {

                if (e.getButton() == MouseEvent.BUTTON3) {

                    if (field[(cRow * cols) + cCol] > MINE_CELL) {
                        rep = true;

                        if (field[(cRow * cols) + cCol] <= COVERED_MINE_CELL) {
                            if (mines_left > 0) {
                                field[(cRow * cols) + cCol] += MARK_FOR_CELL;
                                mines_left--;
                                statusbar.setText(Integer.toString(mines_left));
                            } else
                                statusbar.setText("No marks left");
                        } else {

                            field[(cRow * cols) + cCol] -= MARK_FOR_CELL;
                            mines_left++;
                            statusbar.setText(Integer.toString(mines_left));
                        }
                    }

                } else {

                    if (field[(cRow * cols) + cCol] > COVERED_MINE_CELL) {
                        return;
                    }

                    if ((field[(cRow * cols) + cCol] > MINE_CELL) &&
                        (field[(cRow * cols) + cCol] < MARKED_MINE_CELL)) {

                        field[(cRow * cols) + cCol] -= COVER_FOR_CELL;
                        rep = true;

                        if (field[(cRow * cols) + cCol] == MINE_CELL)
                            inGame = false;
                        if (field[(cRow * cols) + cCol] == EMPTY_CELL)
                            find_empty_cells((cRow * cols) + cCol);
                    }
                }

                if (rep)
                    repaint();

            }
        }
    }
}
 

karykan

New Member
19/4/11
6
0
1
frmMin
Code:
package bom;

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
*
* @author Tan Kan
*/

public class Min extends javax.swing.JFrame {
    Board board;
    private JLabel statusbar;
    private final int WIDTH = 500;
    private final int HEIGHT = 580;

    /** Creates new form Min */
    public Min() {
        initComponents();
        statusbar = new JLabel("");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setLocationRelativeTo(null);
        setTitle("Minesweeper");
        add(statusbar, BorderLayout.SOUTH);
    BorderLayout br = new BorderLayout();
    this.setLayout(br);
        Board obj = new Board(statusbar);
        obj.setVisible(true);
        this.add(obj,BorderLayout.CENTER);
      // obj.setResizable(false);
        obj.setVisible(true);
    }

    /** This method is called from within the constructor to
    * initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is
    * always regenerated by the Form Editor.
    */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(318, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(296, Short.MAX_VALUE)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Min().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel2;
    // End of variables declaration

}
 

JackV

Administrator
Staff member
Đây là code mình viết chơi được trên 1 máy...giờ mình muốn tạo client vs server để chơi đối kháng giữa 2 người...mỗi người dò 1 lần...nhưng ko bít làm thế nào :-ss
Có nghĩa là bạn chưa hiện thực được kiến trúc client server bằng socket, rmi, udp ... hay là bạn làm rồi mà nó không chạy? Hay là bạn chưa biết các quản lý lượt thi đấu và cấu trúc dữ liệu gởi qua lại giữa client và server? Bạn nêu vấn đề chung chung quá.
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,640
307
83
cái class board viết cứ như dân chuyên nghiệp ấy nhỉ. :-s
 

monday0rsunday

Active Member
21/10/11
512
93
28
Bạn muốn code client/server mà ko hiểu client/server là cái gì thì cần phải đọc về nó, xem nó là cái gì!
Thông thường, mô hình client/server hay được dùng thông qua môi trường mạng, nôm na là 1 hệ thống làm server, với nhiệm vụ cung cấp các giải pháp cho các bài toán của 1/nhiều hệ thống client.
Trong bài của bạn, bình thường, nếu 1 người chơi, bạn sẽ có 1 board lưu trữ thông tin(quả mìn đặt ở đâu), và trạng thái (vị trí các ô mở, số điểm người chơi đạt được)., 1 giao diện để người dùng xem, lựa chọn, và chơi, và thông báo kết quả.
Nếu 2 người chơi, trên cùng 1 giao diện đó, thì bạn phải bổ sung thêm trạng thái của người chơi nữa, và bổ sung luật chơi (luân phiên, điểm cao--> thắng). Ở đây, rõ ràng là bạn phải có được cái trạng thái giữa 2 người chơi, để làm cái đánh giá cho trò chơi.
Quay lại mô hình client-server: như đã nói, server cung cấp giải pháp, cho nhiều client --> server phải có khả năng xử lý tổng quát, trong mọi tình huống được đặt ra. Do đó, để viết server , bạn nên chọn những yếu tố chung nhất, để cho nó xử lý.
Trong bài dò mìn, bạn có thể chọn cái chung đó là: thông tin, trạng thái bàn cờ cũng như 2 người chơi, luật chơi.
Còn các cái riêng chính là giao diện --> client chỉ làm mục đích hiển thị giao diện: xem, lựa chọn, chơi, và thông báo kết quả.
Tổng kết lại: bạn sẽ viết server như là 1 trò chơi dò mìn 2 người, không có giao diện. Client là giao diện dò mìn, nhưng không có 1 thông tin trạng thái gì cả (nếu có chỉ là tạm thời). Khi 1 người chơi ở 1 client thay đổi trạng thái 1 ô, gửi thông tin đó về server, server xử lý xem xem bao nhiêu ô được mở, những ô gì, điểm số bao nhiêu, và gửi lại các client đang chơi.(bổ sung khóa cho client, nghĩa là, khi đến lượt 1 client, thì các client còn lại bị khóa, ko thể chơi đc, và phải chờ đến khi đến lượt)
 
  • Like
Reactions: karykan

karykan

New Member
19/4/11
6
0
1
Bạn muốn code client/server mà ko hiểu client/server là cái gì thì cần phải đọc về nó, xem nó là cái gì!
Thông thường, mô hình client/server hay được dùng thông qua môi trường mạng, nôm na là 1 hệ thống làm server, với nhiệm vụ cung cấp các giải pháp cho các bài toán của 1/nhiều hệ thống client.
Trong bài của bạn, bình thường, nếu 1 người chơi, bạn sẽ có 1 board lưu trữ thông tin(quả mìn đặt ở đâu), và trạng thái (vị trí các ô mở, số điểm người chơi đạt được)., 1 giao diện để người dùng xem, lựa chọn, và chơi, và thông báo kết quả.
Nếu 2 người chơi, trên cùng 1 giao diện đó, thì bạn phải bổ sung thêm trạng thái của người chơi nữa, và bổ sung luật chơi (luân phiên, điểm cao--> thắng). Ở đây, rõ ràng là bạn phải có được cái trạng thái giữa 2 người chơi, để làm cái đánh giá cho trò chơi.
Quay lại mô hình client-server: như đã nói, server cung cấp giải pháp, cho nhiều client --> server phải có khả năng xử lý tổng quát, trong mọi tình huống được đặt ra. Do đó, để viết server , bạn nên chọn những yếu tố chung nhất, để cho nó xử lý.
Trong bài dò mìn, bạn có thể chọn cái chung đó là: thông tin, trạng thái bàn cờ cũng như 2 người chơi, luật chơi.
Còn các cái riêng chính là giao diện --> client chỉ làm mục đích hiển thị giao diện: xem, lựa chọn, chơi, và thông báo kết quả.
Tổng kết lại: bạn sẽ viết server như là 1 trò chơi dò mìn 2 người, không có giao diện. Client là giao diện dò mìn, nhưng không có 1 thông tin trạng thái gì cả (nếu có chỉ là tạm thời). Khi 1 người chơi ở 1 client thay đổi trạng thái 1 ô, gửi thông tin đó về server, server xử lý xem xem bao nhiêu ô được mở, những ô gì, điểm số bao nhiêu, và gửi lại các client đang chơi.(bổ sung khóa cho client, nghĩa là, khi đến lượt 1 client, thì các client còn lại bị khóa, ko thể chơi đc, và phải chờ đến khi đến lượt)
cảm ơn bạn nhiều...sau khi đọc xong bài của bạn thì mình thấy phần code của mình đi sai hướng rồi :(
 

monday0rsunday

Active Member
21/10/11
512
93
28
Bạn đã code được 1 người chơi rồi thì chuyển sang 2 người chơi, và chuyển sang client-server không khó. Nôm na chia code ra, và thay đổi cách truyền dữ liệu từ các phần trong app thành client với server qua mạng thôi, chứ chả loằng ngoằng mà bạn cảm thấy sai hướng đâu:))
 
  • Like
Reactions: karykan

Namne123

New Member
17/12/19
1
0
1
22
Như tiêu đề, mình muốn tạo 1 game dò mìn. với ý tưởng là 2 người sẽ kết nối với nhau rồi chơi.
người thứ 1 nhấp trước, nếu không trúng mìn thì tiếp tục tới người thứ 2. ai trúng mìn trước thì thua. :( bạn nào bjk giúp mình với nhak
Bạn ơi hiện tại đồ án mình cũng là làm game dò mìn client server giống bạn, bạn làm ra chưa có thể cho mình xin code được không
gmail : nguyennam27437@gmail.com