1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình nâng cao - Chương 10: Snake game

56 91 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 56
Dung lượng 346,42 KB

Nội dung

Bài giảng Lập trình nâng cao - Chương 10: Snake game cung cấp cho người học các kiến thức: Trò chơi snake, sân chơi mảng hai chiều, con rắn, bắt phím di chuyển rắn, xử lý va chạm. Mời các bạn cùng tham khảo nội dung chi tiết.

Snake Game 9&10 - Danh sách liên kết https://github.com/tqlong/advprogram Nội dung ● Trò chơi: Snake ● Sân chơi ○ Mảng chiều ● Con rắn ○ Danh sách liên kết có ● Bắt phím di chuyển rắn ○ SDL_PollEvent() ● Xử lý va chạm Trò chơi Snake ● Sân chơi hình chữ nhật ○ Trên sân chơi xuất cherry ngẫu nhiên ● Rắn lúc đầu ○ dài 01 (tính đầu), hình, xuống ● Người chơi điều khiển rắn di chuyển phím mũi tên ● Mỗi lần rắn ăn cherry dài thêm ○ Thử sức: nhiều loại quả, loại tác dụng ● Rắn va phải tường → thua ○ https://www.youtube.com/watch?v=kTIPpbIbkos Các tác vụ trò chơi ● Khởi tạo: sân chơi, rắn, vị trí ● Game loop, bước: ○ Xử lý kiện bàn phím để đổi hướng bước ○ Xử lý game logic: di chuyển rắn theo hướng tại, va chạm tường, va chạm thân rắn, ăn dài thân tăng điểm số ○ Hiển thị hình trò chơi Nội dung ● Trò chơi: Snake ● Sân chơi ○ Mảng chiều ● Con rắn ○ Danh sách liên kết có ● Bắt phím di chuyển rắn ○ SDL_PollEvent() ● Xử lý va chạm Phân tích trạng thái trò chơi: Sân chơi ● Sân chơi bảng hình chữ nhật, gồm ○ Ơ rỗng ○ Ơ có rắn ○ Ơ có ● Sân chơi có ○ Con rắn ■ hướng ○ Quả cherry ■ vị trí cherry Phân tích trạng thái trò chơi: Sân chơi ● Sân chơi bảng hình chữ nhật, gồm ○ Ơ rỗng ○ Ơ có rắn ○ Ơ có Mơ tả loại ô enum enum CellType { CELL_EMPTY = 0, CELL_SNAKE, CELL_CHERRY }; loại Phân tích trạng thái trò chơi: Sân chơi ● Sân chơi bảng hình chữ nhật, gồm ○ Ơ rỗng ○ Ơ có rắn ○ Ơ có Một cách biểu diễn sân chơi j i std::vector< std::vector > squares; dòng vector squares[i][j] : trạng thái dòng i cột j bảng gồm nhiều dòng (vector vector) lấy phần tử thứ j vector thứ i bảng Phân tích trạng thái trò chơi: Sân chơi std::vector< std::vector > squares; int width; int height; // tạo bảng có height dòng, width c ột squares = vector< vector > ( đủ thông tin để vẽ sân chơi cách đơn giản height, cách đánh dấu ô chứa ô vector (width, CELL_EMPTY) chứa thân rắn ); Câu hỏi: để vẽ đầu rắn cần làm ? // quét bảng từ xuống, từ trái qua Đáp: Một phương án thêm loại ơ, ví dụ for (int i = 0; i < height; i ++) { CELL_SNAKE_HEAD vào enum CellType, for (int j = 0; j < width; j++) { hoặc, // làm v ới squares[i][j] Hỏi sân chơi xem đầu rắn (hoặc toàn thân rắn) đâu ? } } Bài tập: Khởi tạo sân chơi ● Bắt đầu tạo lớp sân chơi Game ● Làm hàm khởi tạo tham số: chiều rộng, chiều cao class Game { public: const int width; const int height; private: std::vector< std::vector > squares; public: Game(int _width, int _height); }; Trạng thái trò chơi enum GameStatus { GAME_RUNNING = 1, GAME_STOP = 2, GAME_WON = | GAME_STOP, // GAME_WON tức GAME_STOP GAME_OVER = | GAME_STOP, // tương tự cho GAME_OVER }; Bài tập: ● Thêm trường status vào lớp Game ● Khởi tạo status GAME_RUNNING ● Viết hàm isGameRunning, isGameOver Thơng báo kiện phím void interpretEvent(SDL_Event e, Game & game) { if (e.type == SDL_KEYUP) { switch (e.key.keysym.sym) { case SDLK_UP: game.processUserInput(UP); break; case SDLK_DOWN: game.processUserInput(DOWN); break; case SDLK_LEFT: game.processUserInput(LEFT); break; case SDLK_RIGHT: game.processUserInput(RIGHT); break; } } } Truyền hướng vào game, thông qua hàm processUserInput() Thơng báo kiện phím ● Hàm processUserInput(direction) ○ Chỉ làm nhiệm vụ lưu trữ yêu cầu di chuyển người chơi ○ Người chơi nhấn nhiều phím liên tục ■ Lưu trữ hướng trường hàng đợi std::queue inputQueue; void Game::processUserInput( Direction direction ) { inputQueue.push(direction); } Hàng đợi cấu trúc giúp liệu lấy theo thứ tự xuất (vào trước trước - FIFO) Di chuyển rắn ● Hàm nextStep() ○ Lần lượt lấy hướng inputQueue đến chọn hướng phù hợp hết hàng đợi ○ Kiểm tra xem có hợp lệ ■ Ví dụ: sang phải rẽ lên xuống ○ Nếu hợp lệ thay đổi currentDirection ○ Di chuyển rắn, gọi snake.move(currentDirection); Di chuyển rắn ● Hàm nextStep() void Game::nextStep() { bool Game::canChange( while (!inputQueue.empty()) { Direction current, Direction next = inputQueue.front(); inputQueue.pop(); Direction next) const { currentDirection = next; if (current == UP || current == DOWN) return next == LEFT || next == RIGHT; break; else if (canChange(currentDirection, next)) { } return next == UP || next == DOWN; } snake.move(currentDirection); } } Nội dung ● Trò chơi: Snake ● Sân chơi ○ Mảng chiều ● Con rắn ○ Danh sách liên kết có ● Bắt phím di chuyển rắn ○ SDL_PollEvent() ● Xử lý va chạm Xử lý va chạm ● Có kiểu va chạm: ○ Chạm tường ■ Vị trí ngồi hình chữ nhật (0,0,width,height) ○ Chạm thân rắn ■ Vị trí có trạng thái CELL_SNAKE ● Khi rắn di chuyển, thơng báo với Game thơng qua hàm snakeMoveTo(newPos) ○ Có thể kiểm tra, xử lý va chạm hàm Xử lý va chạm void Game::snakeMoveTo(Position pos) { if (squares[pos.y][pos.x] == CELL_CHERRY) { snake.eatCherry(); addRandomCherry(); } setCellType(pos, CELL_SNAKE); } Xử lý va chạm void Game::snakeMoveTo(Position pos) { if (squares[pos.y][pos.x] == CELL_CHERRY) { snake.eatCherry(); addCherry(); } void Game::snakeMoveTo(Position pos) { setCellType(pos, CELL_SNAKE); if (!pos.isInsideBox( 0,0,width,height)) { } status = GAME_OVER; } else if (squares[pos.y][pos.x] == CELL_SNAKE) { status = GAME_OVER; } else if (squares[pos.y][pos.x] == CELL_CHERRY) { snake.eatCherry(); addRandomCherry(); setCellType(pos, CELL_SNAKE); } else setCellType(pos, CELL_SNAKE); } Xử lý va chạm: cách cài đặt đẹp void Game::snakeMoveTo(Position pos) { if (!pos.isInsideBox( 0,0,width,height)) { status = GAME_OVER; } else if (squares[pos.y][pos.x] == CELL_SNAKE) { status = GAME_OVER; } else if (squares[pos.y][pos.x] == CELL_CHERRY) { snake.eatCherry(); addRandomCherry(); setCellType(pos, CELL_SNAKE); } else setCellType(pos, CELL_SNAKE); } Xử lý va chạm: cách cài đặt đẹp void Game::snakeMoveTo(Position pos) { if (!pos.isInsideBox( 0,0,width,height)) { status = GAME_OVER; void Game::snakeMoveTo(Position pos) { } else if (squares[pos.y][pos.x] == CELL_SNAKE) { switch(getCellType(pos) ) { status = GAME_OVER; case CELL_OFF_BOARD: } else if (squares[pos.y][pos.x] == CELL_CHERRY) case CELL_SNAKE:{ snake.eatCherry(); status = GAME_OVER; addRandomCherry(); break; setCellType(pos, CELL_SNAKE); case CELL_CHERRY: } else setCellType(pos, CELL_SNAKE); snake.eatCherry(); } addRandomCherry(); default: setCellType(pos, CELL_SNAKE); } } Xử lý va chạm: cách cài đặt đẹp CellType Game ::getCellType(Position pos) const { return pos.isInsideBox( 0, 0, width, height) ? squares[pos.y][pos.x] : CELL_OFF_BOARD; } ● Thêm loại ô CELL_OFF_BOARD vào enum CellType để thể vị trí nằm ngồi sân chơi ● Kiểm tra game.isGameOver() Snake::move() gọi game.snakeMoveTo() Tổng kết ● Mảng hai chiều: liệu dạng bảng ● Danh sách liên kết: liệu dạng chuỗi cần chèn, xóa nhanh ● Hàng đợi: lưu trữ yêu cầu người chơi theo thứ tự xuất (vào trước trước FIFO) ● Định nghĩa enum: xử lý nhiều trường hợp cách thống (và đặt tên cho chúng) Bài tập ● Làm đẹp cách thể cách nạp ảnh vẽ đầu rắn, thân rắn, đốt rắn chuyển hướng ● Gợi ý: ○ Cài đặt lớp Gallery chuyên quản lý hình vẽ ○ Truy xuất hình vẽ enum ■ Đặt tên cho hình vẽ ○ Xét trường hợp để vẽ thân rắn ■ Cần xét vị trí tương quan đốt liên tiếp Bài tập ● Lưu điểm số (số cherry ăn được) ● Lưu bảng xếp hạng điểm số ● Vẽ hình khởi động ○ Tên người chơi nhập từ tham số dòng lệnh ○ Nhấn Enter để chơi ○ Nhấn R để xem bảng xếp hạng ● Vẽ hình kết thúc ○ Bảng xếp hạng, làm bật điểm số lần chơi vừa kết thúc ... logic game phải hiệu Biểu diễn rắn: Cách hay ● Con rắn chuỗi vị trí bảng ● Cách 2: sử dụng danh sách liên kết có struct SnakeNode { Position position; SnakeNode *next; SnakeNode(Position p, SnakeNode... sân chơi Game ● Làm hàm khởi tạo tham số: chiều rộng, chiều cao class Game { public: const int width; const int height; private: std::vector< std::vector > squares; public: Game( int... chiếu đến Game Vẽ đường kẻ ngang cách Vẽ đường kẻ dọc Duyệt bảng, ■ ô chứa quả, vẽ hình vuông; ■ ô chứa rắn, vẽ hình tròn Bài tập: Vẽ sân chơi đơn giản Kết cần đạt tập Nội dung ● Trò chơi: Snake

Ngày đăng: 15/05/2020, 22:32

TỪ KHÓA LIÊN QUAN