Ứng dụng game đoán âm thanh nhiều người chơi sử dụng kiến trúc Client-Server với Java Sockets.
- Java 17 hoặc cao hơn
- Maven 3.6+
- MySQL 8.0+ (hoặc MariaDB)
Đảm bảo MySQL đã được cài đặt và đang chạy. Tạo database (hoặc để Spring Boot tự động tạo):
CREATE DATABASE IF NOT EXISTS game_sound_guess CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Cập nhật thông tin kết nối trong server/src/main/resources/application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/game_sound_guess?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=your_passwordcd server
mvn clean installcd client
mvn clean installcd server
mvn spring-boot:runHoặc chạy trực tiếp từ IDE:
- Main class:
com.promex04.ServerApplication - Server sẽ chạy trên port
8888(có thể thay đổi trongapplication.properties)
Server sẽ:
- Tự động tạo các bảng trong database (nếu chưa có)
- Khởi động Socket Server trên port 8888
- Sẵn sàng nhận kết nối từ clients
cd client
mvn javafx:runHoặc chạy từ IDE:
- Main class:
com.promex04.ClientApplication - Client sẽ kết nối đến
localhost:8888
Lưu ý: Bạn có thể chạy nhiều instance của Client để test với nhiều người chơi.
- Người chơi đăng nhập bằng tên đăng nhập và mật khẩu
- Nếu tài khoản chưa tồn tại, hệ thống sẽ tự động tạo tài khoản mới
- Hiển thị danh sách tất cả người chơi đang online
- Thông tin hiển thị: Tên, Tổng điểm, Trạng thái (rỗi/bận)
- Chatbox để nhắn tin với các người chơi khác
- Bảng xếp hạng (Ranking) hiển thị top players
- Chọn một người chơi trong danh sách (phải ở trạng thái "rỗi")
- Click nút "Thách đấu"
- Đối thủ sẽ nhận được yêu cầu thách đấu
- Đối thủ có thể chấp nhận hoặc từ chối
- Nếu chấp nhận, game sẽ bắt đầu
- Mỗi trận đấu gồm 10 ván (rounds)
- Mỗi ván:
- Server gửi một âm thanh và 4 lựa chọn
- Người chơi có 15 giây để chọn đáp án
- Tính điểm dựa trên tốc độ:
- 0-5 giây: 100 điểm
- 5-10 giây: 50 điểm
- 10-15 giây: 20 điểm
- Sai hoặc hết giờ: 0 điểm
- Sau mỗi ván, hiển thị điểm của cả 2 người chơi
- Sau 10 ván, người có điểm cao hơn thắng
- Xếp hạng dựa trên:
- Tổng điểm (giảm dần)
- Số câu đúng (giảm dần)
- Số trận thắng (giảm dần)
Ứng dụng sử dụng text-based protocol qua Socket:
Format: COMMAND:payload1:payload2:...\n
LOGIN:username:passwordCHAT_LOBBY:messageCHALLENGE:opponent_usernameCHALLENGE_RESPONSE:accept|rejectGAME_SUBMIT:answer_index(1, 2, 3, hoặc 4)GET_RANKING
LOGIN_SUCCESS:username:total_scoreLOGIN_FAILEDLOBBY_UPDATE:user1,score1,status1;user2,score2,status2;...MSG_LOBBY:username:messageCHALLENGE_REQUEST:challenger_usernameCHALLENGE_ACCEPTED:opponent_usernameCHALLENGE_REJECTED:opponent_usernameROUND_START:audio_id:round_number:option1:option2:option3:option4:audio_pathROUND_RESULT:correct|wrong:points:time_msSCORE_UPDATE:player1_score:player2_scoreGAME_OVER:player1_score:player2_score:winner_username|drawRANKING:rank1,username1,score1,correct1,won1;rank2,username2,...ERROR:error_message
LTM/
├── server/ # Server application (Spring Boot)
│ ├── src/main/java/com/promex04/
│ │ ├── ServerApplication.java
│ │ ├── model/ # JPA Entities
│ │ │ ├── User.java
│ │ │ ├── Game.java
│ │ │ ├── GameRound.java
│ │ │ └── Audio.java
│ │ ├── repository/ # Spring Data JPA Repositories
│ │ ├── service/ # Business Logic
│ │ │ ├── UserService.java
│ │ │ ├── GameService.java
│ │ │ ├── ClientManager.java
│ │ │ ├── SocketServerService.java
│ │ │ └── ClientHandler.java
│ │ └── resources/
│ │ └── application.properties
│ └── pom.xml
│
└── client/ # Client application (JavaFX)
├── src/main/java/com/promex04/
│ ├── ClientApplication.java
│ ├── model/ # Client-side models
│ ├── controller/ # GameController (socket communication)
│ │ └── GameController.java
│ └── view/ # JavaFX Views
│ ├── LoginView.java
│ ├── LobbyView.java
│ └── GameView.java
└── pom.xml
-
Audio Files: Hiện tại ứng dụng chưa có tích hợp phát audio thực tế. Bạn cần thêm MediaPlayer để phát file audio từ
audio_pathtrong database. -
Database: Ứng dụng sẽ tự động tạo các bảng khi chạy lần đầu. Để thêm audio samples, bạn cần insert vào bảng
audios:INSERT INTO audios (name, file_path, option1, option2, option3, option4, correct_answer) VALUES ('Audio Sample 1', '/path/to/audio.mp3', 'Lựa chọn 1', 'Lựa chọn 2', 'Lựa chọn 3', 'Lựa chọn 4', 1);
-
Testing: Để test ứng dụng với nhiều người chơi, bạn có thể:
- Chạy nhiều instance của ClientApplication
- Hoặc chạy trên các máy khác nhau trong cùng mạng (thay đổi
localhosttrongconnect())
- Kiểm tra MySQL đã chạy chưa
- Kiểm tra thông tin kết nối database trong
application.properties - Kiểm tra port 8888 có bị chiếm dụng không
- Đảm bảo Server đã chạy
- Kiểm tra firewall không chặn port 8888
- Kiểm tra địa chỉ server trong
GameController.connect()
- Đảm bảo JavaFX SDK đã được cấu hình đúng trong pom.xml
- Với Java 11+, cần module path riêng cho JavaFX
Một số tính năng có thể thêm vào:
- Phát audio thực tế bằng MediaPlayer
- Thêm nhiều loại âm thanh vào database
- Thống kê chi tiết cho từng người chơi
- Replay game
- Tournament mode
- Sound effects và background music
Dự án này được tạo cho mục đích học tập và tham khảo.