30/09/2018, 21:23

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.
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

Ngô Doãn Tuấn viết 23:30 ngày 30/09/2018

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

Phạm Minh Anh Hữu viết 23:32 ngày 30/09/2018

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

Nguyễn Hoàng Trung viết 23:37 ngày 30/09/2018

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

Phạm Minh Anh Hữu viết 23:38 ngày 30/09/2018

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

Tao Không Ngu. viết 23:31 ngày 30/09/2018

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

Tao Không Ngu. viết 23:25 ngày 30/09/2018

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

Phạm Minh Anh Hữu viết 23:28 ngày 30/09/2018

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

Tao Không Ngu. viết 23:30 ngày 30/09/2018

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

Phạm Minh Anh Hữu viết 23:36 ngày 30/09/2018

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

Mai Hữu viết 23:28 ngày 30/09/2018

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

Người bí ẩn viết 23:24 ngày 30/09/2018

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

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

Phạm Minh Anh Hữu viết 23:26 ngày 30/09/2018

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);
}
Maskma viết 23:37 ngày 30/09/2018

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;
}
Tao Không Ngu. viết 23:28 ngày 30/09/2018

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

Tao Không Ngu. viết 23:24 ngày 30/09/2018

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

Phạm Minh Anh Hữu viết 23:25 ngày 30/09/2018

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

Không nên dùng lệnh nhảy goto vì nó làm chương trình của bạn như món mì tôm. Bạn rất khó có thể chắc rằng nhãn mà bạn nhảy tới đã được định nghĩa đâu đó rồi.

Ở đâ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 ?.

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.

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? Rồi cout 1 lần thì làm sao đổi được text color, 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.

Đỗ Tiến Đạt viết 23:31 ngày 30/09/2018

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

Phạm Minh Anh Hữu viết 23:33 ngày 30/09/2018

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

Đỗ Tiến Đạt viết 23:33 ngày 30/09/2018

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

Maskma viết 23:24 ngày 30/09/2018

Lần sau bạn viết comment ms thì mình ms nhận đc noti, bạn sửa cmt nên bh mình ms xem.
Cout mình toàn dùng string nên in ra đc hết. Char phải dùng printf của C. Để đổi màu ko nhất thiết phải dùng win api. Bạn có thể dùng escape code (tự search nhé) vì esc code cũng chỉ là như là 1 kí tự nên cho vào đc
Hàm gettime là mình chém ra đấy. Bạn tự tìm cách nào để đo đc tg cũng được. Mình đã ghi đấy là code giả mà, tức tượng trưng để hiểu ý tg thôi

Bài liên quan
0