Nhân vật RPG
Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 58 trên 61.
Thử thách
DễHãy xây dựng hệ thống chiến đấu cho nhân vật RPG: một ví dụ kinh điển kết hợp struct, phương thức, hàm khởi tạo và tương tác giữa các đối tượng trong một thiết kế gọn gàng, mô-đun.
Bạn sẽ sắp xếp code trong ba tệp:
character.h: Định nghĩa một structCharactervới hai trường số nguyên:healthvàdamage. Khai báo nguyên mẫu hàm để tạo nhân vật, thực hiện đòn tấn công, kiểm tra nhân vật còn sống hay không và in trạng thái của nhân vật.character.c: Triển khai hệ thống nhân vật:create_character: nhận giá trị máu và sát thương ban đầu, cấp phát bộ nhớ cho một Character trên heap, khởi tạo các trường của nó và trả về một con trỏattack: nhận hai con trỏ Character (attacker và target), giảm máu của mục tiêu theo lượng sát thương của kẻ tấn côngis_alive: nhận một con trỏ const Character và trả về 1 nếu máu lớn hơn 0, nếu không thì trả về 0print_status: nhận một con trỏ const Character và in máu của nhân vật theo định dạngHealth: Xfree_character: giải phóng bộ nhớ đã cấp phát
main.c: Tạo một mô phỏng trận chiến! Đọc bốn số nguyên lần lượt biểu thị: máu của anh hùng, sát thương của anh hùng, máu của kẻ địch và sát thương của kẻ địch. Tạo cả hai nhân vật bằng hàm khởi tạo. Sau đó mô phỏng các lượt chiến đấu, trong mỗi lượt anh hùng tấn công trước, rồi kẻ địch phản công. Nếu đòn tấn công của anh hùng làm máu của kẻ địch giảm xuống 0 hoặc thấp hơn, kẻ địch bị đánh bại và không phản công trong lượt đó. Tiếp tục cho đến khi một nhân vật gục ngã. Sau mỗi lượt, in trạng thái của cả hai nhân vật (anh hùng trước, rồi đến kẻ địch). Khi trận chiến kết thúc, inHero wins!hoặcEnemy wins!tùy theo nhân vật nào còn sống. Đừng quên giải phóng bộ nhớ của cả hai nhân vật.
Chương trình của bạn sẽ nhận bốn đầu vào:
- Máu ban đầu của anh hùng
- Sát thương của anh hùng mỗi lần tấn công
- Máu ban đầu của kẻ địch
- Sát thương của kẻ địch mỗi lần tấn công
Đầu ra ví dụ khi đầu vào là 50, 20, 30, 15:
Health: 35
Health: 10
Health: 35
Health: -10
Hero wins!Đầu ra ví dụ khi đầu vào là 20, 5, 100, 25:
Health: -5
Health: 95
Enemy wins!Nhớ sử dụng include guard trong tệp header. Hàm attack minh họa cách một đối tượng có thể thay đổi trạng thái nội bộ của đối tượng khác: một khái niệm then chốt trong thiết kế hướng đối tượng. Hãy dùng con trỏ const phù hợp cho các hàm chỉ đọc dữ liệu.
Tự làm thử
#include <stdio.h>
#include "character.h"
int main() {
// Đọc các giá trị đầu vào
int hero_health, hero_damage, enemy_health, enemy_damage;
scanf("%d", &hero_health);
scanf("%d", &hero_damage);
scanf("%d", &enemy_health);
scanf("%d", &enemy_damage);
// TODO: Tạo nhân vật anh hùng và kẻ địch bằng create_character
// TODO: Mô phỏng các lượt chiến đấu
// - Anh hùng tấn công trước
// - Kẻ địch tấn công nếu còn sống
// - In ra trạng thái của cả hai nhân vật sau mỗi lượt (anh hùng trước, rồi đến kẻ địch)
// - Tiếp tục cho đến khi một nhân vật gục ngã
// TODO: In ra người chiến thắng ("Hero wins!" hoặc "Enemy wins!")
// TODO: Giải phóng bộ nhớ của cả hai nhân vật
return 0;
}
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online