Thứ Ba, 8 tháng 9, 2015

[ BÀI TẬP LỚN ] VIẾT CHƯƠNG TRÌNH MÔ PHỎNG TRÒ CHƠI RẮN SĂN MỒI

[BÀI TẬP Lớn ] 

Đồ Họa Máy Tính

VIẾT CHƯƠNG TRÌNH MÔ PHỎNG TRÒ CHƠI RẮN SĂN MỒI



Giáo viên hướng dẫn : Trần Xuân Thanh

I. Thông tin thành viên trong nhóm :

  1. Nguyễn Thị Anh Vân - MSV : 1301024
  2. Đoàn Cường Anh - MSV : 1300327
  3. Nguyễn Thị Hiền - MSV : 1300831
  4. Nguyễn Thị Ngọc Hà - MSV : 1301062
  5. Nguyễn Thị Thùy Linh - MSV : 1300217

II. Tóm tắt lý thuyết, thuật toán liên quan :


  1. Tóm tắt lý thuyết :


 a) Hàm delay :

  •  Mục đích sử dụng : tạo độ trễ cho chương trình
  • Sử dụng thư viện : dos.h
  • Tham số bên trong hàm delay() là một con số (ngừng trong 1/1000 giây) ví dụ delay(1000) = 1s
  • Cách sử dụng
                + Cung cấp giá trị cho đối số n (có tham số trong lời gọi hàm)
                               delay(5000);      //Đối số n=5000
                + Sử dụng giá trị mặc định của đối số (Không có hàm số trong lời gọi)
                               delay(); //Đối số n=1000

   b) Hàm kbhit (keyboard hit)

  • Hàm nhận 1 kí tự trong vùng đệm bàn phím, thường dùng với do...while
  • Nếu một phím được nhấn thì nó trả về một giá trị số, nếu không thì trả về số 0.
                 Khi bạn có đoạn code như sau :
                          while ( kbhit() )
                                 {...}
                  Thì đoạn code trong {...} sẽ chạy khi bấm phím bất kì trên keyboard.

       c) Hàm srand (set random number seed)

          Dùng để khởi tạo một số ngẫu nhiên theo một số seed. Số ngẫu nhiên được tạo là pseudo-random, tức là số ngẫu nhiên giả, có thể đoán được số kế tiếp. Mỗi một số seed sẽ cho ra một bộ số random khác nhau.

    • Bổ trợ cho hàm random. Nếu không có nó, trong trường hợp hi hữu 2 lần random có thể trùng giá trị
    • srand(...) : hàm cung cấp bởi thư viện stdlib.h
    • time(NULL) : hàm cung cấp bởi thư viện time.h
    • Cú pháp : void srand(unsigned int seed)

         d) Chế độ console

              Console Application : Ứng dụng Console được viết với các Console Function, các Console Function hỗ trợ các loại kí tự dùng trong màn hình Console (màn hình DOS).
              Console giúp đơn giản hóa các thao tác trong chế độ Console. Console chứa các hàm thực hiện các chức năng sau :
           +   Đặt tiêu đề cho cửa sổ Console\
           +   Thay đổi kích thước (số dòng x số cột) của màn hình
           +   Thay đổi font chữ
           +   Di chuyển cửa sổ Console đến một vị trí bất kì (theo tọa độ màn hình - pixel)
           +   Xóa màn hình
           +   Đưa con trỏ đến một vị trí nào đó trên màn hình, lấy vị trí hiện tại của con trỏ
           +   Xuất một kí tự ra một vị trí nào đó trên màn hình
           +   Đặt màu cho chữ, màu nền
           +   Vẽ hình chữ nhật
           +   In ra một menu cho phép lựa chọn linh hoạt
           +   Nhập mật khẩu dạng *


        2. Thuật toán liên quan :

          Trò chơi gồm một đối tượng con rắn (Snake) di chuyển tự do trên màn hình (trái, phải, lên, xuống), ăn các đối tượng thức ăn (Food đặt ngẫu nhiên). Độ khó tương ứng với tốc độ di chuyển tăng từ 1 đến 5. 

      Để di chuyển phần thân rắn theo phần đầu ta thực hiện như sau :





      III. Chương trình mô phỏng :

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      #include <dos.h>
      #include <conio.h>
      #include <iostream.h>
      #include <graphics.h>
      #define loai 100 // che do dos (console la 100)
      int TocDo[] = {5*loai, 4*loai, 2*loai, 1*loai, loai/2};
      int dm = 18;
      int max_row = 20, min_row = 5;
      int max_col = 60, min_col = 2;
      int i, x1, y1, xm, ym, d, muc, diem;
      int x[50];
      int y[10];
      void start()
      {
      clrscr();
      d = 3; // do dai ban dau cua con ran
      if (diem == 0)
      {
      do{
      gotoxy(10, 10);
      cout<<"Moi ban chon muc choi tu 1 den 5: ";
      cin>>muc;
      }while(muc < 1 || muc > 5);
      }
      clrscr();
      gotoxy(25,10);
      cout<<"Muc choi cua ban la "<<muc<<"\n";
      gotoxy(22,13);
      cout<<"An Enter de bat dau choi !";
      getchar();
      x[0] = (min_col+max_col)/2;
      y[0] = (min_row + max_row)/2;
      x1 =-1; y1 =0;
      xm = rand()%(max_col - min_col - 1) + min_col + 1;
      ym = rand()%(max_row - min_row - 1) + min_row + 1;
      clrscr();
      i=1;
      }
      void thua()
      {
      char tiep;
      gotoxy(20, 22);
      cout<<"Rat tiec, ban da thua...\n";
      gotoxy(20, 23);
      cout<<"Diem cua ban la : "<<diem;
      gotoxy(20, 24);
      cout<<"Ban muon choi tiep khong? [y/n] ";
      cin>>tiep;
      if (tiep == 'y')
      {
      diem = 0;
      start();
      }else
      {
      exit(0);
      }
      }

      void thang()
      {
      muc = muc % 5 + 1;
      if (diem>=(dm-3)*5)
      {
      gotoxy(10,3);
      cout<<"Chuc mung ban da pha dao!";
      getchar();
      }
      gotoxy(63, 16);
      cout<<"Diem :"<<diem;
      gotoxy(20, 22);
      cout<<"Chuc mung ban da thang\n";
      gotoxy(20, 23);
      cout<<"Diem cua ban la \n"<<diem;
      gotoxy(20, 24);
      cout<<"Nhan enter de choi muc tiep theo...";
      getchar();
      start();
      }

      void giaoDien()
      {
      gotoxy(63, 2); cout<<"RAN SAN MOI";
      gotoxy(63, 8); cout<<"A: sang trai";
      gotoxy(63, 9); cout<<"D: sang phai";
      gotoxy(63, 10); cout<<"W: len tren";
      gotoxy(63, 11); cout<<"S: xuong duoi";
      gotoxy(63, 12); cout<<"Q: thoat";
      gotoxy(63, 13); cout<<"P: tam dung";
      gotoxy(63, 14); cout<<"Enter: tiep tuc";
      gotoxy(63, 16); cout<<"Diem : "<<diem;
      gotoxy(63, 17); cout<<"Muc choi : "<<muc;
      for (i=min_col; i<max_col; i++)
      {
      gotoxy(i, min_row); cout<<"#";
      gotoxy(i, max_row); cout<<"#";
      }
      for (i=min_row; i<=max_row; i++)
      {
      gotoxy(min_col, i); cout<<"#";
      gotoxy(max_col, i); cout<<"#";
      }
      }

      int main()
      {
      srand(time(NULL));
      int ketThuc = 0;
      int key = 0;
      diem = 0;
      clrscr();
      gotoxy(30, 10); cout<<"RAN SAN MOI";
      getchar();
      start();
      clrscr();
      while(!ketThuc)
      {
          do{
      giaoDien();
      gotoxy(xm, ym); cout<<"$";
      gotoxy(x[0], y[0]); cout<<"*";
      gotoxy(x[d-1], y[d-1]); cout<<" ";
      for (int i = d; i >0; i--)
      {
      x[i] = x[i-1];
      y[i] = y[i-1];
      }
      x[0] = x[0] + x1;
      y[0] = y[0] + y1;
      gotoxy(x[0], y[0]); cout<<" ";
      gotoxy(xm, ym);
      if (x[0] == xm && y[0] == ym)
      {
      diem++;
      d++;
      xm = rand()%(max_col-min_col - 1) + min_col + 1;
      ym = rand()%(max_row-min_row - 1) + min_row + 1;
      }
      for(i=1; i<d; i++)
      {
      if (x[0] == min_col || y[0] == min_row || x[0] == max_col || y[0] == max_row || (x[0] == x[i] && y[0] == y[i])){
      i = d;
      thua();
      }
      }
      if (d == dm)
      {
      thang();
      }
      delay(TocDo[muc]);
      } while(!kbhit());
      key = getch();
      if (key == 'a' && x1 != 1)
      {
      x1 = -1; y1 = 0;
      }
      if (key == 's' && y1 != -1)
      {
      x1 = 0; y1 = 1;
      }
      if (key == 'd' && x1 != -1)
      {
      x1 =1; y1 = 0;
      }
      if (key == 'w' && y1 != 1)
      {
      x1 = 0; y1 = -1;
      }
      if (key == 'p')
      {
      getch();
      }
      if (key == 'q')
      {
      ketThuc = 1;
      }
      }
      return 0;

      }

      IV. Kết quả :


      2 nhận xét: