Trò chơi đẩy số

Discussion in 'CongDongJava member's Java Software' started by LEMINHMAN1, 3/8/10.

  1. LEMINHMAN1

    LEMINHMAN1 Member

    Đây là trò chơi đẩy số có dạng như sau :
    [1][3[5]
    [7][8][6]
    [4][2][ ]
    nhiệm vụ của bạn là đẩy các số làm sau đó cho nó theo thứ tự như sau :
    [1][2][3]
    [4][5][6]
    [7][8][ ]

    - Ý tưởng, vẽ ra hai ma trận vuông, điền các số từ 1 đến 8 vào đó, ma trận thứ nhất dùng để đảo số và người chơi sẽ tương tác vào, ma trận thứ 2 dùng để lưu giá trị chuẩn là
    [1][2][3]
    [4][5][6]
    [7][8][ ]
    - Người chơi dùng các phím
    A : để đẩy số sang trái
    D : để đẩy số sang phải
    W : để đẩy số lên trên
    S : để đẩy số xuống dưới
    Trò chơi sẽ kết thúc và bạn là người thắng cuộc, nếu số tại các phần tử ở 2 ma trận bằng nhau

    Đây là code :

    Class Play.java
    Code:
    
    import java.util.Scanner;
    import java.util.Random;
    
    public class Play {
        private static final int csHang = 3;
        private static final int csCot = 3;
        private static final String TRONG =" ";
        private String KhungTrong[][] = new String[csHang][csCot];
        private String copKhungTrong[][]=new String[csHang][csCot];
        private String tenNguoiChoi;
       
        public void dienSoVaoKhung(){
            int a=1;
           
            Fill :
            for(int i = 0;i<csHang;i++){
                for(int j=0;j<csCot;j++){
                    if(i==(csHang-1) && j==(csCot-1)) {   
                        KhungTrong[i][j]=TRONG;
                        copKhungTrong[i][j]=TRONG;
                        break Fill;
                    }
                    KhungTrong[i][j]=Integer.toString(a);
                    copKhungTrong[i][j]=Integer.toString(a);
                    a++;
                }
            }
        }
        public void tronSoSauKhiDien(){
            Random random = new Random();
            String temp;
            for(int i=0;i<csHang;i++){
                for(int j=0;j<csCot;j++){
                    int ngauNhien = random.nextInt(3);
                    temp=KhungTrong[ngauNhien][ngauNhien];
                    KhungTrong[ngauNhien][ngauNhien] = KhungTrong[i][j];
                    KhungTrong[i][j]=temp;               
                }
            }
        }
        public void inKhung(){
            for(int i=0;i<csHang;i++){
                for(int j=0; j<csCot;j++){
                    System.out.printf("[%s]",KhungTrong[i][j]);
                }
                System.out.println();
            }
        }
        public void setTenNguoiChoi(String tenNguoiChoi){
            this.tenNguoiChoi = tenNguoiChoi;
        }
        public String getTenNguoiChoi(){
            return tenNguoiChoi;
        }
        public void inLuatChoi(String ten){
            System.out.println("------------------------------------");
            System.out.println("Chao "+ten);
            System.out.println("Day la tro choi day so, ban dung phim 'A','D','W','S'");
            System.out.println("De day cac so 'Trai' 'Phai' 'Len' 'Xuong' tuong ung");
            System.out.println("Tro choi ket thuc va ban la nguoi chien thang khi");
            System.out.println("Cac so duoc day theo dung thu tu !");
            System.out.println("CHUC "+ ten+" MAY MAN !!!");
            System.out.println("------------------------------------");
        }
        public void play(String kyTuNhapVao) throws Exception{
            String temp="h";
            Nhay :
            for(int i=0;i<csHang;i++){
                for(int j=0;j<csCot;j++){
                    if(KhungTrong[i][j].equals(TRONG)){
                            if(kyTuNhapVao.equals("s")||kyTuNhapVao.equals("S")){                   
                                temp = KhungTrong[i-1][j];
                                KhungTrong[i-1][j]=TRONG;
                                KhungTrong[i][j]=temp;
                                break Nhay;                           
                            }
                            if(kyTuNhapVao.equals("w")||kyTuNhapVao.equals("W")){
                                temp = KhungTrong[i+1][j];
                                KhungTrong[i+1][j]=TRONG;
                                KhungTrong[i][j] = temp;
                                break Nhay;                           
                            }
                            if(kyTuNhapVao.equals("a")||kyTuNhapVao.equals("A")){
                                temp = KhungTrong[i][j+1];
                                KhungTrong[i][j+1]=TRONG;
                                KhungTrong[i][j]=temp;
                                break Nhay;                               
                            }
                            if(kyTuNhapVao.equals("d")||kyTuNhapVao.equals("D")){
                                temp = KhungTrong[i][j-1];
                                KhungTrong[i][j-1]=TRONG;
                                KhungTrong[i][j]=temp;
                                break Nhay;                           
                            }
                    }
                }
            }
    
        }
        public boolean win(){
            for(int i=0;i<csHang;i++){
                for(int j =0;j<csCot;j++){
                    if(!(KhungTrong[i][j].equals(copKhungTrong[i][j]))){
                         return false;
                    }
                }
            }
            return true;
        }  
    }
    
    
    
    Class Main.java

    Code:
    
    import java.util.Scanner;
    public class Main {
        Play p = new Play();
        Scanner input = new Scanner(System.in);
        public void nhapTen(){
           
            p.dienSoVaoKhung();
            System.out.print("Nhap ten cua ban : ");
            String Ten = input.next();
            p.setTenNguoiChoi(Ten);
            p.inLuatChoi(p.getTenNguoiChoi());
            System.out.println("Tro choi bat dau ! ");
        }
        public void batDau(){
            p.tronSoSauKhiDien();
            p.inKhung();
            do{
                System.out.print("Nhap ky tu 'A' 'D' 'W' 'S' : ");
                String kt = input.next();
                    try{
                        p.play(kt);   
                        p.inKhung();   
                    }catch(Exception e){
                        System.out.printf("%s\n\n","Khong Hop Le ! ");
                    }           
            }while(p.win()==false);
            System.out.println("\nXIN CHUC MUNG, BAN DA CHIEN THANG !\n");                   
        }
        public static void main(String[] args){
            Main m = new Main();
            m.nhapTen();
            m.batDau();
        }
    }
    
    
    
    
    
    Các bạn chơi thử nhé :spinny:
  2. JackV

    JackV Administrator Staff Member

    Ðề: Trò chơi đẩy số

    Tớ chơi thử nhưng chưa thắng, hi.


    Code này viết khá tốt bạn nhỉ, đặt tên biến rất gợi nhớ, chỉ có
    Code:
    private static final String TRONG =" ";
    private String KhungTrong[][] = new String[csHang][csCot];
    
    là hơi lệch chuẩn đặt tên của java chút.

    Về giải thuật đẩy số thì theo tớ nghĩ là nên lưu vị trí của ô trống rồi xét tọa độ và đẩy các số thì hay hơn là dùng vòng lặp chạy quanh mảng, kiểu này xử lý nhiều quá.
    Code:
    for(int i=0;i<csHang;i++){
                for(int j=0;j<csCot;j++){
                    if(KhungTrong[i][j].equals(TRONG)){
                            if(kyTuNhapVao.equals("s")||kyTuNhapVao.equals("S")){                   
                                temp = KhungTrong[i-1][j];
                                KhungTrong[i-1][j]=TRONG;
                                KhungTrong[i][j]=temp;
                                break Nhay;                           
                            }
                            if(kyTuNhapVao.equals("w")||kyTuNhapVao.equals("W")){
                                temp = KhungTrong[i+1][j];
                                KhungTrong[i+1][j]=TRONG;
                                KhungTrong[i][j] = temp;
                                break Nhay;                           
                            }
                            if(kyTuNhapVao.equals("a")||kyTuNhapVao.equals("A")){
                                temp = KhungTrong[i][j+1];
                                KhungTrong[i][j+1]=TRONG;
                                KhungTrong[i][j]=temp;
                                break Nhay;                               
                            }
                            if(kyTuNhapVao.equals("d")||kyTuNhapVao.equals("D")){
                                temp = KhungTrong[i][j-1];
                                KhungTrong[i][j-1]=TRONG;
                                KhungTrong[i][j]=temp;
                                break Nhay;                           
                            }
                    }
                }
            }
    
    Việc nhập a-w-s-d để chọn số đẩy cũng không hay lắm vì mình biết chỉ có một ô trống thôi, vậy cho số nào nhảy qua ô trống thì nhập con số đó luôn đi.

    Để lúc rảnh tớ cũng viết một cái để so sánh.
  3. JackV

    JackV Administrator Staff Member

    Ðề: Trò chơi đẩy số

    Uh, còn nữa, phương thức kiểm tra win() đó cũng chưa đạt mức tiết kiệm xử lý, chúng ta biết là khi win thì vị trí [2][2] chắc chắn là trống, vậy kiểm tra vị trí đó thỏa mãn yêu cầu hay chưa rồi mới đến các vị trí khác.

    Sẽ OOP hơn nếu tạo đối tượng ô số :)
  4. LEMINHMAN1

    LEMINHMAN1 Member

    Ðề: Trò chơi đẩy số

    Ừ, Jack nói cũng đúng, khi chơi đúng là dùng các phím A, S, W, D hơi bất tiện, nhưng mình viết cái này là bắt chước cách chơi của một chương trình xếp hình (điều khiển bằng các phím mũi tên).

    - Đâu có, vị trí đó mặc dù trống, nhưng các số vẫn chưa được xếp theo thứ tự thì đâu có được. Vậy nên, mình mới phải so sánh từng phần tử một.

    PS : nếu Jack muốn cải tiến lại game này thì làm luôn cái Swing cho anh em chơi đi, lúc đó đừng có xếp số nữa, mà xếp một bức hình luôn... Sẽ rất thú vị đây...

    (Nếu được, cho mình xin cái nick Y!M nhé, định hỏi bạn vài thứ về Thread. )
  5. JackV

    JackV Administrator Staff Member

    Ðề: Trò chơi đẩy số

    - Nếu vị trí [2][2] không trống thì chắc chắn rằng tất cả những số còn lại không bao giờ được sếp đúng vị trí mà.

    - Game đẩy hình đã viết một năm trước rồi, cậu không nhắc tớ cũng quên, để khi nào rảnh biên tập lại để anh em còn trao đổi.

    - Các vấn đề cần trao đổi thì bạn post lên forum để anh em cùng trao đổi nha.
  6. JackV

    JackV Administrator Staff Member

    Ðề: Trò chơi đẩy số

    Bạn cải tiến một chút là cho nhập số đi, nhập số nào thì đẩy số đó vào phần trống bên cạnh nó.
    [1][3[5]
    [7][8][6]
    [4][2][ ]
    nâng lên một chút nữa, theo sơ đồ trên, nếu người dùng nhập 5 thì 6 sẽ đi qua phần trống, 5 vào vị trí của 6, tức là người dùng có thể nhập số bên đầu bên này để đẩy hai số cùng lúc. Yêu cầu đó phát sinh do người ta muốn đẩy 4 và 2 qua để đưa 7 xuống chỉ với 2 thao tác.
  7. dangquan045

    dangquan045 New Member

    Ðề: Trò chơi đẩy số

    Win (5ph54') :D
    Thêm cái phương thức đếm số bước đi nữa thì hay! Cái này là đẩy ô số cải tiến còn đc, còn ví dụ như trò xếp hình giống cái này thì ko cải tiến như anh Ad nói vậy đc.
  8. Lê Lộc

    Lê Lộc Member

    Thớt cho mình hỏi, cái đoạn code kiểu như:

    Fill: ... return Fill;
    Nhay: .... return Nhay;

    Đọc mà không hiểu cái lệnh có dấu 2 chấm này nghĩa là gì ...?
  9. JackV

    JackV Administrator Staff Member

    Đẩy một lần đi một dãy là hoàn toàn có thể, thực tế mà, lúc chơi ai lại đẩy từng cái trong khi nắm cái đầu dãy đẩy một lần là xong, thử cái này xem PuzzleGame_Image_vCongDongJava_com

    Nó là đây bạn Sử dụng Break Labels để ngắt các vòng lặp lồng nhau
  10. Hoàng Văn Hoan

    Hoàng Văn Hoan New Member

    Hay quá bạn ạ :)
  11. thanhnh271188

    thanhnh271188 New Member

    Cái này bên C lẫn Java hoặc một số ngôn ngữ lập trình khác cũng có đó bạn. Gọi là nhãn. Ví dụ khi bạn chạy trong vòng lặp bạn có một điều kiện để nó quay trở về trước vòng lặp thì lúc đó chính là lúc nên sử dụng nhãn.
    Đây cũng là ví dụ một nhãn nè:
    Code:
    http://congdongjava.com
  12. Lê Bá Tùng

    Lê Bá Tùng New Member

    1 phut 6 giay win :)) hay lam b

Chia sẻ trang này