Game hứng trứng bằng C++ 😂

Em đang học khoá C++ của anh Đạt đến hơn 40 bài rồi mà chưa có gì làm cho vui, giờ em làm được cái Game console Hứng trứng (chủ yếu là sử dụng mảng 2 chiều), sản phẩm đầu tay, các anh/chị cho em nhận xét. :blush:
Còn 1 số điểm yếu em chưa khắc phục được:

  • Hơi bị lag (do máy em xử lý yếu hay code em viết chưa được tốt thì em không rõ, mà chắc code lung tung nên không tốt)
  • Mới chỉ được có 2 quả trứng à.
  • Lâu lâu ảo tý. (hai quả trứng nó random xa nhau quá, toàn die không à)

Hình game đây:


Đây là Project: https://www.fshare.vn/file/VWM39QR9QOV3

11 Likes

Cảm giác trở lại cái thời game hứng bia :smile:

4 Likes

Bác lại suy nghĩ … rồi :astonished:

2 Likes

Bác xài hàm gotoxy nhiều quá thì nó lag :v

1 Like

Ủa vậy hả, em không biết, test lại khi không có gotoxy thì nhanh hơn xíu. :wink:

3 Likes

This post was flagged by the community and is temporarily hidden.

4 Likes

This post was flagged by the community and is temporarily hidden.

1 Like

Sử dụng Tiếng Việt có dấu nhé bạn.

1 Like

This post was flagged by the community and is temporarily hidden.

2 Likes

Khi nào rảnh mình sẽ tạo, còn giờ code mình có đưa ở trên.

1 Like

bác cho em hỏi làm mấy cái đò họa trên mn console kiểu gì vậy bác

1 Like

Xem 7 video hướng dẫn làm game console của Nguyễn Việt Nam Sơn ấy !

1 Like

mình dùng hàm đổi màu chữ thôi

void textcolor(int x)//x là mã màu.
{
	HANDLE color;
	color=GetStdHandle

(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(color,x);
}
1 Like

thử kĩ thuật này xem xử lí được giật lag ko.
Double buffer
Tức bác coi cả cái màn hình console là 1 mảng char MxN, bác tạo ra 2 mảng như thế: 1 mảng tên frontBuffer, 1 mảng backBuffer. Khi draw lên screen thì luôn vẽ mảng frontBuffer, còn nhưng thao tác mình vẽ lên màn hình vẽ vào backBuffer. Trong vòng lặp thì trc khi bác vẽ thì phải SwapBuffer tức frontBuffer = backBuffer, rồi ms vẽ (tránh việc hình đang vẽ dở đã cho lên màn hình)
Draw
Chỉ dùng gotoxy và cout 1 lần để tránh làm chậm và ko dùng vòng lặp for vì sẽ bắt máy tính toán 1 lượng đáng kể (vd: 802424 = ?? (kích cỡ màn hình * số lần vẽ mỗi giây)) Vì ta có mảng frontBuffer là xâu nên đưa con trỏ về vị trị (0;0), gốc toạ độ, rồi cout 1 lần là xong.
Frame Per Second (FPS)
Ko nên để vẽ lên màn hình liên tục mà ko kiểm soát (mình chưa xem kĩ code của bác nên ko biết có chưa). FPS là số khung hình/lần vẽ trong 1s. Thông thường 24 FPS là nhìn mượt rồi, 60 FPS càng tốt. Bác dùng mấy hàm thời gian của window để điều chỉnh số lần vẽ theo FPS mình mong muốn.
Lưu ý đây là cách FPS tĩnh tức FPS mình tự quy ước, ko thay đổi suốt cả chương trình (mình lấy vd vì nó đơn giản)

// Code giả

#define FPS hằng số (vd: 24)

while (!end) // còn chạy
{
    currentTime = GetTime();
    elapsed = currentTime - lastTime;
        
    // Update 

    // Cho chương trình nghỉ nếu update nhanh quá
    // chưa hết 1/FPS (thời gian mỗi khung hình)
    while (1.f/(GetTime() - currentTime) >= FPS); 

    SwapBuffer(); // frontBuffer = backBuffer;
    Draw(); // draw frontBuffer
    lastTime = currentTime;
}
2 Likes

This post was flagged by the community and is temporarily hidden.

2 Likes

This post was flagged by the community and is temporarily hidden.

2 Likes

Cảm ơn @Maskma@Phong_Ky_Vo đã góp ý cho em.

Ở đây nếu em không dùng goto, khi game over thì em làm sao để người dùng nhập vào y thì game sẽ tiếp tục ?.

Cái kĩ thuật Double Buffer em hiểu rồi, ở phần Draw nếu em không dùng vòng lặp for thì in mảng như thế nào vậy?:confused: Rồi cout 1 lần thì làm sao đổi được text color, :smirk: FPS như bác nói thì em dùng hàm GetTime nó bảo không xác định được, mà hàm này có phải trong thư viện time.h không vậy bác.

Mới học 40 bài mà đã làm được rồi à\

Em mới học đến đó thôi, với học thêm vòng lặp game các thứ trên mạng thôi :wink:

Ý mình là khen bạn giỏi ấy chứ

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?