Lập Trình Game Lyto Different Color

Lập Trình Game Lyto Different Color

Mình biết trò này qua facebook game. Trò chơi khá "bánh cuốn" nên mình quyết định sẽ làm game này với ngôn ngữ lập trình java và hướng dẫn các bạn cách làm game này.

Luật chơi

Trò chơi rất thú vị, khi bắt đầu trò chơi bạn sẽ thấy các hình tròn chứa một màu sắc sắp xếp trên n hàng và n cột, trong đó có một hình tròn có màu sắc khác với các hình còn lại. Việc của người chơi lại tìm ra hình tròn đó, khi chọn trúng bạn sẽ chuyển qua màn chơi khác, các màn chơi phía sau sẽ có số lượng hình tròn lớn hơn và mau giữa chúng gần như tương đồng nhau:

Trò chơi rất gay cấn khi nó có thêm áp lực về thời gian, nếu hết thời gian thì bạn sẽ bị thua, để tránh trường hợp người chơi "bấm bừa" vào các hình tròn thì khi bấm sai thời gian trong trò chơi sẽ bị trừ đi.

Khởi tạo dữ liệu

1. Khởi tạo dữ liệu

Dữ liệu chính cho trò chơi này chính là một ma trận chứa các số nguyên, ta sẽ tạo tất cả các số trong ma trận đều là số 0 (biểu diễn các hình tròn bình thường), sau đó gán một giá trị ngẫu nhiên trong ma trận đó bằng 1 (biểu diễn hình tròn có màu sắc khác biệt).

2. Hình ảnh sử dụng

Để hỗ trợ làm giao diện trong trò chơi ta sử sử dụng các hình ảnh và gán nó vào các button.

Nên đặt tên các ảnh trong trò chơi theo thứ tự và theo từng cặp (hai ảnh gần giống nhau), ví dụ image1_1.jpgimage1_2.jpg.

Các bạn có thể sử dụng ảnh của mình Tại đây.

Thiết lập giao diện

1. Khởi tạo giao diện

Giao diện trò chơi này được thiết lập bằng một ma trân Jbutton trong class JFrame.

	public Container init(int k, int h, String s, int lv) {
		Container cn = this.getContentPane();
		A = k; B = h;
		n = A + 2;
		pn = new JPanel();
		createMatrix();
		pn.setLayout(new GridLayout(n, n));
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++){
				bt[i][j] = new JButton(String.valueOf(a[i][j]));
				pn.add(bt[i][j]);
				bt[i][j].setActionCommand(i + " " + j);
				bt[i][j].addActionListener(this);;
				a[i][j] = 1;
			}
		pn2 = new JPanel();
		pn2.setLayout(new FlowLayout());
		lv_bt = new JButton(String.valueOf(lv));
		lv_bt.setFont(new Font("UTM Nokia", 1, 15));
		lv_bt.setBackground(Color.white);
		time_lb = new JLabel(s);
		time_lb.setFont(new Font("", 1, 20));
		pn2.add(lv_bt);
		pn2.add(time_lb);
		cn.add(pn);
		cn.add(pn2, "North");
		this.setVisible(true);
		this.setSize(W, H);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		setResizable(false);
		return cn;
	}

2. Thêm Image và Button

Như đã nói ở trên các image đã được đặt tên theo thứ tự lúc đó ta có thể lấy các image như sau:

	private Icon getIcon(int index, int index2, int size) {
		int width = size, height = size;
		Image image = new ImageIcon(getClass().getResource("/GameLytoDifferentColor/image/image" + index + "_" + index2 + ".jpg")).getImage();
		Icon icon = new ImageIcon(image.getScaledInstance(width, height, image.SCALE_SMOOTH));
		return icon;
	}

Tạo ngẫu nhiên image cho ma trận:

	public void setIconMatrix() {
		int Nicon = 14;
		int k = (int) (Math.random() * (Nicon - 1) + 0.5 + 1);
		int h = (int) ((Math.random() + 0.5) + 1);
		Icon ic[] = new Icon[2];
		ic[0] = getIcon(k, h, (W - 100) / (A + 2));
		ic[1] = getIcon(k, 3 - h, (W - 100) / (A + 2));
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				bt[i][j].setIcon(ic[a[i][j]]);
	}

Đầu tiên ta tạo một sô ngẫu nhiên một số từ 1 đến  Nicon (số lượng cặp image mà bạn đã chuẩn bị).

Tạo biến h ngẫu nhiên nhận giá trị 1 hoặc 2.

Set icon đầu bằng imagek_h.jpg, icon tiếp theo bằng imagej_(3 - h).jpg

Các hàm xử lý

1. Xử lý khi click vào một hình tròn

Khi click vào một hình tròn, nếu nó là hình tròn khác biệt thì sẽ chuyển qua màn mới và cộng thêm thời gian, còn không sẽ trừ thời gian chơi của bạn.

	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		int i, j;
		String s = e.getActionCommand();
		int k = s.indexOf(32);
		i = Integer.parseInt(s.substring(0, k));
		j = Integer.parseInt(s.substring (k + 1, s.length()));
		if (a[i][j] == 1) {
			time_lb.setText(next(time_lb, 100));
			nextGame();
		}
		else {
			time_lb.setText(next(time_lb, -200));
		}
	}

2. Qua màn chơi mới

Sau khi qua màn chơi mới có thể sẽ tăng kích thước của ma trận.

	public void nextGame() {
		if (B == numberLv[A]) {
			A++;
			B = 0;
		}
		else
			B++;
		timer.stop();
		GameLytoDifferentColor k = new GameLytoDifferentColor(A, B, time_lb.getText(), Integer.parseInt(lv_bt.getText()) + 1);
		k.timer.start();
	}

Tính thời gian trong trò chơi

Thời gian trong trò chơi sẽ đếm ngược, khi thời gian về 0 ("00:00") thì bạn sẽ bị thua.

Ta sử dụng class Timer để hỗ trợ việc đếm thời gian.

	public GameLytoDifferentColor(int k, int score, String s, int lv) {
		this.setTitle("CodeLearn - Game Lyto Different Color");
		cn = init(k, score, s, lv);
		timer = new Timer(10, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				time_lb.setText(next(time_lb, -1));
			}
		});
	}

Cộng trừ thời gian:

	public String next(JLabel lb, int k) {
		String str[] = lb.getText().split(":");
		int tt = Integer.parseInt(str[1]);
		int s = Integer.parseInt(str[0]);
		String kq = "";
		int sum = tt + s * 100 + k;
		if (sum <= 0) {
			timer.stop();
			time_lb.setText("0:00");
			showDialogNewGame("Hết thời gian\n" +
					"Số điểm: " + lv_bt.getText() + "\n" +
					"Bạn có muốn chơi lại không?", "Thông báo");
		}
		if (sum % 100 > 9)
			kq = ":" + sum % 100 + kq;
		else
			kq = ":0" + sum % 100 + kq;
		sum /= 100;
		kq = sum + kq;
		return kq;
	}

Kết

Trên đây là cách mình tạo ra trò chơi Lyto Different Color bằng Java, rất mong nhận được nhiều ý kiến của các bạn để mình biết bài tốt hơn.

Các bạn có thể tham khảo source code của mình Tại đây.

Video demo: