Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
1,15 MB
Nội dung
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN ĐỒ HỌA MÁY TÍNH ĐỀ T I: L M GAME CỜ CARO Sinh viên thực : NGÔ CÔNG LÂM NGUYỄN TH NH DUY ĐỖ HUY MẠNH Giảng viên hướng dẫn : NGÔ NGỌC TH NH Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : CƠNG NGHỆ PHẦN MỀM Lớp : D15CNPM2 Khóa : 2020-2025 Hà Nội, tháng năm 2023 PHIẾU CHẤM ĐIỂM STT Họ tên sinh viên Ngô Công Lâm Nguyễn Thành Duy Đỗ Huy Mạnh Họ tên giảng viên Nội dung thực Chữ ký Điểm Chữ ký Ghi Giảng viên chấm 1: Giảng viên chấm 2: MỤC LỤC LỜI MỞ ĐẦU .4 CHƯƠNG I: GIỚI THIỆU VỀ ĐỒ HỌA MÁY TÍNH 1.1 Khái niệm đồ họa máy tính 1.2 Kỹ thuật đồ họa máy tính 1.2.1 Đồ họa raster .5 1.2.2 Đồ họa vector 1.2.3 Đồ họa 3D CHƯƠNG II: MƠ TẢ BÀI TỐN 2.1 Giới thiệu đề tài 2.2 Đối tượng nghiên cứu 2.3 Mục đích 2.4 Phần mềm sử dụng CHƯƠNG III: GIẢI QUYẾT BÀI TOÁN 3.1 Phát biểu toán .8 3.2 Giải toán .8 3.3 Mã game cờ caro KẾT LUẬN .31 LỜI MỞ ĐẦU Độ họa máy tính ứng dụng nhiều lĩnh vực khoa học, kĩ thuật dịch vụ đời sống có nhờ đa dạng đồ họa máy tính Cơng nghệ đồ họa mang lại cho người tiện nghi, trải nghiệm lạ chân thực, nói đồ họa máy tính trở thành cơng cụ khơng thể thiếu cơng việc sinh hoạt giải trí người mang đến cho trải nghiệm trước chưa có nghiên cứu đồ họa máy tính có tầm quan trọng vơ đặc biệt nhiều lĩnh vực khác Vậy đồ họa máy tính : Đồ họa máy tính phương pháp cơng nghệ dùng việc chuyển đổi qua lại liệu hình ảnh máy tính Đồ họa máy tính lĩnh vực khoa học máy tính nghiên cứu tốn học , thuật tốn kĩ thuật máy tính phép tạo, hiển thị điều khiển hình ảnh, video hình máy tính Đồ họa máy tính có liên quan nhiều đến số lĩnh vực đại số , hình học giải tích, hình học họa hình , quang học, lập trình máy tính, kĩ thuật máy tính, … đặc biệt chế tạo phần cứng Việc mơ tả liệu thơng qua hình ảnh màu sắc đa dạng nó, chương trình đồ họa thường thu hút người sử dụng tính thân thiện, dễ dùng kích thích khả sáng tạo nâng cao suất làm việc Là sinh viên chúng em tiếp xúc, tìm hiểu làm quen với số kỹ thuật đồ họa máy tính thơng qua tài liệu, giảng viên Ngô Ngọc Thành giảng dạy Với kiến thức học chúng em định chọn đề tài: “Làm game cờ caro” CHƯƠNG I: GIỚI THIỆU VỀ ĐỒ HỌA MÁY TÍNH 1.1 Khái niệm đồ họa máy tính Đồ họa máy tính (tiếng Anh: computer graphics) lĩnh vực khoa học máy tính nghiên cứu sở toán học, thuật toán kĩ thuật phép tạo, hiển thị điều khiển hình ảnh hình máy tính Đồ họa máy tính có liên quan nhiều đến số lĩnh vực đại số, hình học giải tích, hình học họa hình, quang học, kĩ thuật máy tính, đặc biệt chế tạo phần cứng (các loại hình, thiết bị xuất, nhập, vỉ mạch đồ họa, ) Theo nghĩa rộng hơn, đồ họa máy tính phương pháp cơng nghệ dùng việc chuyển đổi qua lại liệu hình ảnh hình máy tính Đồ họa máy tính hay kĩ thuật đồ họa máy tính cịn hiểu dạng phương pháp kĩ thuật tạo hình ảnh từ mơ hình tốn học mơ tả đối tượng hay liệu lấy từ đối tượng thực tế Thuật ngữ "đồ họa máy tính" đề xuất chuyên gia người Mỹ tên William Fetter vào năm 1960 Khi ơng nghiên cứu xây dựng mơ hình buồng lái máy bay cho hãng Boeing William Fetter dựa hình ảnh chiều mơ hình người phi cơng buồng lái để xây dựng nên mơ hình buồng lái tối ưu cho máy bay Boeing Đây phương pháp nghiên cứu vào thời kì Phương pháp cho phép nhà thiết kế quan sát cách trực quan vị trí người lái khoang buồng lái William Fetter đặt tên cho phương pháp "đồ họa máy tính." 1.2 Kỹ thuật đồ họa máy tính 1.2.1 Đồ họa raster Khái niệm thiết kế đồ họa raster (đồ họa hình ảnh Bitmap) kỹ thuật hiển thị hình ảnh lâu đời phố biến với tảng kỹ thuật lấy từ cơng nghệ hình tivi tồn lâu trước máy tính điện tử đời Với kỹ thuật này, tất hình ảnh làm nên từ vng có màu nhỏ li ti gọi pixel (phần tử ảnh) 1.2.2 Đồ họa vector Đồ họa vector kỹ thuật tạo dựng hình ảnh đường kẻ quy định cơng thức tốn học lần sử dụng cho hình máy tính năm 60 70 kỉ 20 Tuy không phổ biến kỹ thuật đồ họa raster có thời gian gần bị “xóa sổ” raster, đồ họa vector ưa chuộng trở lại Nhờ vào ưu điểm hình ảnh vector đơn giản, dễ dàng phóng to mà khơng bị giảm chất lượng, có dung lượng nhỏ so với raster, dễ chỉnh sửa, thích hợp với việc thiết kế loại đồ họa màu sắc, đơn giản logo, icon hay biểu tượng 1.2.3 Đồ họa 3D Đồ họa 3D kỹ thuật đồ họa tập trung phát triển thời điểm tại, với quan tâm tiềm ứng dụng khơng gian ảo hay hình chiếu ba chiều Nhà thiết kế đồ họa phải thực nhiều bước khác áp dụng nhiều kỹ thuật tạo dựng hình ảnh phức tạp để có đơí tượng hình ảnh 3D nghĩa Trước hết, khung (wire-frame) vật thể phải dựng phần mềm đồ họa máy tính, sau phần vật thể thêm vào nối với (rigged) để tạo liên kết chân thực, đặc biệt với vật thể có khả chuyển động Sau vật thể phải render Đây bước thời gian phức tạp vật thể 3D có nhiều bề mặt khác với chất liệu khác nhau, độ suốt hay mờ đục, màu sắc, mức độ bắt sáng hay phản sáng khác Để tạo vật thể 3D thật có thể, nhiều kỹ thuật tốn học áp dụng để tính tốn mơ cách ánh sáng chiếu phản chiếu vào loại mặt phẳng khác ray tracing hay radiosity,… CHƯƠNG II: MƠ TẢ B I TỐN 2.1 Giới thiệu đề tài Cờ caro trò chơi phổ biến với tất lứa tuổi, Đây trò chơi đối kháng hai người, thường dùng để giải trí sau làm việc căng thẳng Việc code game tảng giúp bạn thực hành kỹ lập trình tốt Trị chơi chơi bàn cờ gồm ô vuông nằm cách hàng cột Hai bên thay phiên tích vào ô vuông chưa đánh bàn cờ Ký hiệu nước người X O Người chơi phải dùng chiến thuật kinh nghiệm để tạo thành hàng ngang, hàng dọc, đường chéo có đủ quân cờ mình, (có thể áp dụng luật chặn hai đầu không), người chiến thắng người tạo hàng, cột đường chéo đủ nước trước Để chiến thắng, bạn cần tạo nước cờ hiểm độc, điểm đặc biệt Caro, bạn dễ bị thua không để ý nước đối phương bạn có chiến thuật tốt 2.2 Đối tượng nghiên cứu - Làm game cờ caro ngôn ngữ C++ dùng - Game thân thiện dễ dàng sử dụng lần đầu 2.3 Mục đích Đây trị chơi giúp bạn giải trí sau làm việc học tập căng thẳng hay thời gian rảnh với bạn bè 2.4 Phần mềm sử dụng Dev C++ CHƯƠNG III: GIẢI QUYẾT B I TỐN 3.1 Phát biểu tốn Sau tìm hiểu thư viện winbgim.h nhóm chúng em định thực làm game cờ caro để giải trí 3.2 Giải tốn Định nghĩa số thư viện: Các số row, col, null, VX, VO, P1, P2, GameSpeed sử dụng để định nghĩa kích thước bàn cờ, giá trị cờ, người chơi tốc độ trò chơi Các macro FOR, FORD, InBar, Click, RClick sử dụng để tạo vòng lặp kiểm tra kiện chuột chương trình Thư viện iostream để nhập/xuất liệu winbgim.h để vẽ đồ họa Khai báo định nghĩa lớp biến: Lớp Tsquare đại diện cho cờ bàn cờ Có hai thuộc tính player (người chơi) value (giá trị ô cờ) Lớp TPlayed đại diện cho nước thực Có hai thuộc tính tọa độ x y Biến ListSq mảng chiều đối tượng Tsquare đại diện cho bàn cờ Biến curSq đối tượng Tsquare đại diện cho ô cờ Các biến khác sử dụng để lưu trạng thái trị chơi thơng tin vẽ đồ họa Các phương thức kiểm tra chiến thắng (HoriWin, VertiWin, PCrossWin, RCrossWin): Các phương thức sử dụng để kiểm tra xem người chơi thắng trò chơi hay chưa dựa ô cờ xung quanh nước cuối Các phương thức kiểm tra hàng, cột, đường chéo đường chéo phụ để xác định chiến thắng Nếu có liên tiếp giá trị không bị chặn ô cờ người chơi khác, người chơi thắng Các phương thức vẽ tạo trò chơi (Drawtable, Createtable, ChangePlayer, Drawchar, DrawWin): Drawtable sử dụng để vẽ bàn cờ 3.3 Mã game cờ caro #include #include #define row 20 #define col 20 #define null #define VX #define VO #define P1 //Red #define P2 //Blue #define GameSpeed 100 #define FOR(x,f,e) for(int x = f;x = e;x ) #define InBar(x,f,e) (x >= f && x = 2) return false; if (count >= 5) return true; return false; } bool VertiWin(int x,int y) { if (ListBoard[0][x][y].value == null) return false; int pl = ListBoard[0][x][y].player; int count = 0; int opcount = 0; FORD(i,y,0) { if (ListBoard[0][x][i].player == pl) count++; else if (ListBoard[0][x][i].player != null) { opcount++; break; } else break; 18 } FOR(i,y+1,row-1) { if (ListBoard[0][x][i].player == pl) count++; else if (ListBoard[0][x][i].player != null) { opcount++; break; } else break; } if (opcount >= 2) return false; if (count >= 5) return true; return false; } bool PCrossWin(int x,int y) { if (ListBoard[0][x][y].value == null) return false; int pl = ListBoard[0][x][y].player; int count = 0; int opcount = 0; int m = min(x,y); FOR(i,0,m) { if (ListBoard[0][x-i][y-i].player == pl) count++; else if (ListBoard[0][x-i][y-i].player != null) { opcount++; break; } 19 else break; } m = min(col-x,row-y); FOR(i,1,m) { if (ListBoard[0][x+i][y+i].player == pl) count++; else if (ListBoard[0][x+i][y+i].player != null) { opcount++; break; } else break; } if (opcount >= 2) return false; if (count >= 5) return true; return false; } bool RCrossWin(int x, int y) { if (ListBoard[0][x][y].value == null) return false; int pl = ListBoard[0][x][y].player; int count = 0; int opcount = 0; int m = min(x,row-y); FOR(i,0,m) { if (ListBoard[0][x-i][y+i].player == pl) count++; else if (ListBoard[0][x-i][y+i].player != null) { opcount++; 20 break; } else break; } m = min(col-x,y); FOR(i,1,m) { if (ListBoard[0][x+i][y-i].player == pl) count++; else if (ListBoard[0][x+i][y-i].player != null) { opcount++; break; } else break; } if (opcount >= 2) return false; if (count >= 5) return true; return false; } /* -*/ /* -Create Game -*/ void Drawtable(int color) { setcolor(color); FOR(x,0,col) { line(x*w,0,x*w,wid); } 21 FOR(y,0,row) { line(0,y*h,hei,y*h); } } void Createtable() { FOR(x,1,col) { FOR(y,1,row) { ListBoard[0][x-1][y-1].player = null; ListBoard[0][x-1][y-1].value = null; } } } void ChangePlayer() { if (curSq.player == P1) { curSq.player = P2; curSq.value = VO; } else if (curSq.player == P2) { curSq.player = P1; curSq.value = VX; } } void DrawWin(int x, int y) 22 { int pl = ListBoard[0][x][y].player; if (HoriWin(x,y)) { FORD(i,x,0) { if (ListBoard[0][i][y].player == pl) Drawchar(i,y,ListBoard[0][i] [y].value,P1+P2); else break; } FOR(i,x+1,col-1) { if (ListBoard[0][i][y].player == pl) Drawchar(i,y,ListBoard[0][i] [y].value,P1+P2); else break; } } if (VertiWin(x,y)) { FORD(i,y,0) { if (ListBoard[0][x][i].player == pl) Drawchar(x,i,ListBoard[0][x] [i].value,P1+P2); else break; } FOR(i,y+1,row-1) { if (ListBoard[0][x][i].player == pl) Drawchar(x,i,ListBoard[0][x] [i].value,P1+P2); else break; } 23 } if (PCrossWin(x,y)) { int m = min(x,y); FOR(i,0,m) { if (ListBoard[0][x-i][y-i].player == pl) Drawchar(x-i,y-i,ListBoard[0][x-i][yi].value,P1+P2); else break; } m = min(col-x,row-y); FOR(i,1,m) { if (ListBoard[0][x+i][y+i].player == pl) Drawchar(x+i,y+i,ListBoard[0][x+i] [y+i].value,P1+P2); else break; } } if (RCrossWin(x,y)) { int m = min(x,row-y); FOR(i,0,m) { if (ListBoard[0][x-i][y+i].player == pl) Drawchar(x-i,y+i,ListBoard[0][x-i] [y+i].value,P1+P2); else break; } m = min(col-x,y); FOR(i,1,m) { 24 if (ListBoard[0][x+i][y-i].player == pl) Drawchar(x+i,y-i,ListBoard[0][x+i][yi].value,P1+P2); else break; } } } /* -*/ /* -Method */ void DrawInfo() { setbkcolor(bkc); settextstyle(0,0,2); if (curSq.player == P1) { setcolor(15); //white outtextxy(wid + 50,260,"Player: 1"); outtextxy(wid + 50,280,"Character: X"); } else if (curSq.player == P2) { setcolor(15); //white outtextxy(wid + 50,260,"Player: 2"); outtextxy(wid + 50,280,"Character: O"); } } void WinGame() { FOR(x,0,col-1) { 25 FOR(y,0,row-1) { if (HoriWin(x,y) || VertiWin(x,y) || PCrossWin(x,y) || RCrossWin(x,y)) { wongame = true; DrawWin(x,y); } } } } void PlayinBoard(int x,int y) { if (wongame) return; if (x/w