Đồ họa máy tính lĩnh vực khoa học máytính nghiên cứu toán học , thuật toán kĩ thuật máy tính phép tạo, hiển thị điều khiểnhình ảnh, video hình máy tính.. Khái niệm về đồ họa máy tínhĐồ h
GIỚI THIỆU VỀ ĐỒ HỌA MÁY TÍNH
Khái niệm về đồ họa máy tính
Đồ họa máy tính là lĩnh vực khoa học máy tính nghiên cứu về toán học, thuật toán và kỹ thuật để tạo, hiển thị và điều khiển hình ảnh trên màn hình Nó liên quan đến nhiều lĩnh vực như đại số, hình học giải tích, quang học và kỹ thuật máy tính, đặc biệt là trong chế tạo phần cứng như màn hình và thiết bị xuất, nhập.
Đồ họa máy tính là phương pháp và công nghệ chuyển đổi dữ liệu thành hình ảnh trên màn hình máy tính Nó bao gồm các kỹ thuật tạo hình ảnh từ mô hình toán học mô tả các đối tượng thực tế Thuật ngữ "đồ họa máy tính" được William Fetter, một chuyên gia người Mỹ, đề xuất vào năm 1960 khi ông nghiên cứu mô hình buồng lái máy bay cho Boeing Fetter đã sử dụng hình ảnh 3 chiều của mô hình phi công để tối ưu hóa thiết kế buồng lái, cho phép các nhà thiết kế quan sát vị trí của người lái một cách trực quan.
Kỹ thuật trong đồ họa máy tính
Thiết kế đồ họa raster, hay còn gọi là đồ họa Bitmap, là một trong những kỹ thuật hiển thị hình ảnh lâu đời và phổ biến nhất, có nguồn gốc từ công nghệ màn hình tivi trước khi máy tính điện tử ra đời Kỹ thuật này tạo ra hình ảnh từ các ô vuông nhỏ màu sắc, được gọi là pixel.
Đồ họa vector là kỹ thuật tạo hình ảnh bằng các đường kẻ dựa trên công thức toán học, lần đầu tiên xuất hiện trên màn hình máy tính vào những năm 60 và 70 của thế kỷ 20 Mặc dù không phổ biến như đồ họa raster và từng bị "xóa sổ" bởi kỹ thuật này, đồ họa vector hiện đang được ưa chuộng trở lại.
Hình ảnh vector có nhiều ưu điểm nổi bật như khả năng phóng to mà không giảm chất lượng, dung lượng nhỏ hơn so với hình ảnh raster, và dễ dàng chỉnh sửa Chúng rất phù hợp cho việc thiết kế các đồ họa đơn giản, ít màu sắc như logo, icon và biểu tượng.
1.2.3 Đồ họa 3D Đồ họa 3D là kỹ thuật đồ họa đang được tập trung phát triển nhất trong thời điểm hiện tại, với sự quan tâm và tiềm năng của các ứng dụng như không gian ảo hay hình chiếu ba chiều Nhà thiết kế đồ họa phải thực hiện rất nhiều bước khác nhau và áp dụng nhiều kỹ thuật tạo dựng hình ảnh phức tạp để có được một đôí tượng hình ảnh 3D đúng nghĩa.
Để tạo ra một vật thể 3D chân thực, trước tiên cần dựng khung cơ bản (wire-frame) trong phần mềm đồ họa máy tính, sau đó thêm và nối các phần của vật thể (rigged) để đảm bảo sự liên kết tự nhiên, đặc biệt với các vật thể có khả năng chuyển động Bước render là giai đoạn phức tạp và tốn thời gian nhất, do vật thể 3D có nhiều bề mặt và chất liệu khác nhau, bao gồm độ trong suốt, màu sắc, và mức độ phản chiếu ánh sáng Để đạt được độ chân thực cao, nhiều kỹ thuật toán học như ray tracing và radiosity được áp dụng để mô phỏng cách ánh sáng tương tác với các bề mặt khác nhau.
MÔ TẢ BÀI TOÁN
Giới thiệu đề tài
Cờ caro là trò chơi phổ biến cho mọi lứa tuổi, thường được chơi giữa hai người để giải trí sau những giờ làm việc căng thẳng Việc lập trình game cờ caro trên một nền tảng nào đó sẽ giúp bạn rèn luyện kỹ năng lập trình hiệu quả.
Trò chơi diễn ra trên một bàn cờ với các ô vuông được sắp xếp theo hàng và cột Hai người chơi sẽ lần lượt đánh dấu vào những ô vuông chưa được chọn trên bàn cờ.
Ký hiệu mỗi nước đi của từng người là X hoặc O.
Người chơi cần sử dụng chiến thuật và kinh nghiệm để sắp xếp 5 quân cờ của mình thành hàng ngang, hàng dọc hoặc đường chéo, có thể áp dụng luật chặn hai đầu Người chiến thắng là người đầu tiên hoàn thành điều này Để giành chiến thắng, bạn phải thực hiện những nước cờ độc đáo và bất ngờ, vì trong trò chơi Caro, bạn có thể dễ dàng thua nếu không chú ý đến từng nước đi của đối thủ, ngay cả khi bạn có chiến thuật tốt hơn.
Đối tượng nghiên cứu
- Làm game cờ caro bằng ngôn ngữ C++ dùng .
- Game thân thiện dễ dàng sử dụng ngay lần đầu.
Mục đích
Đây là một trò chơi giúp bạn giải trí sau những giờ làm việc và học tập căng thẳng hay những thời gian rảnh cùng với bạn bè.
Phần mềm sử dụng
GIẢI QUYẾT BÀI TOÁN
Phát biểu bài toán
Sau khi tìm hiểu về thư viện winbgim.h nhóm chúng em đã quyết định thực hiện làm game cờ caro để giải trí.
Giải bài toán
Định nghĩa các hằng số và thư viện:
Các hằng số row, col, null, VX, VO, P1, P2 và GameSpeed được sử dụng để xác định kích thước của bàn cờ, giá trị của từng ô cờ, người chơi và tốc độ của trò chơi.
Các macro FOR, FORD, InBar, Click, RClick được sử dụng để tạo các vòng lặp và kiểm tra sự kiện chuột trong chương trình.
Thư viện iostream để nhập/xuất dữ liệu và winbgim.h để vẽ đồ họa.
Khai báo và định nghĩa các lớp và biến:
Lớp Tsquare đại diện cho một ô cờ trong bàn cờ Có hai thuộc tính là player (người chơi) và value (giá trị của ô cờ).
Lớp TPlayed đại diện cho một nước đi đã được thực hiện Có hai thuộc tính là tọa độ x và y.
Biến ListSq là một mảng 2 chiều các đối tượng Tsquare đại diện cho bàn cờ. Biến curSq là một đối tượng Tsquare đại diện cho ô cờ hiện tại.
Các biến khác được sử dụng để lưu trạng thái trò chơi và 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 này được áp dụng để xác định xem người chơi hiện tại đã giành chiến thắng trong trò chơi hay chưa, dựa trên các ô cờ xung quanh nước đi cuối cùng.
Các phương thức này kiểm tra các hàng, cột, đường chéo chính và đường chéo phụ để xác định chiến thắng.
Nếu có 5 ô liên tiếp cùng giá trị và không bị chặn bởi ô cờ của người chơi khác, thì người chơi đó thắng.
Các phương thức vẽ và tạo trò chơi (Drawtable, Createtable, ChangePlayer, Drawchar, DrawWin):
Drawtable được sử dụng để vẽ bàn cờ.
Mã game cờ caro
#define Click ismouseclick(WM_LBUTTONDBLCLK)
The code snippet defines a right mouse click event and sets up a window with dimensions 500 by 500 pixels, along with an additional width of 310 pixels It specifies a black background color and an orange button color, while also allowing for the configuration of a game level, which is set to 2.
{ public: int player; int value;
{ public: int x,y; void New(int, int);
}; void TPlayed::New(int px, int py)
Tsquare ListBoard[level+1][col][row];
Tsquare curSq; int w = wid / col; int h = hei / row; bool ex, wongame; int cplayed;
TPlayed ListPlay[row*col]; int AtkArray[9] = {0,1,2,7,100,200,210,220,230}; int DefArray[9] = {0,1,2,7,30,40,50,60,70};
/* -AI -*/ void BoardToBoard(int b1, int b2)
} void Drawchar(int c,int r,int value,int color)
} int AIHori(int x, int y,int cboard)
{ int player = ListBoard[cboard][x][y].player; int count = -1; int opcount = 0;
{ if (ListBoard[cboard][i][y].player == player) count++; else if (ListBoard[cboard][i][y].player != null)
{ if (ListBoard[cboard][i][y].player == player) count++; else if (ListBoard[cboard][i][y].player != null)
} if (opcount >= 2 && count > opcount) return count - opcount; if (opcount >= 2) return 0; return count;
} int AIVerti(int x,int y, int cboard)
{ int player = ListBoard[cboard][x][y].player; int count = -1; int opcount = 0;
{ if (ListBoard[cboard][x][i].player == player) count++; else if (ListBoard[cboard][x][i].player != null)
{ if (ListBoard[cboard][x][i].player == player) count++; else if (ListBoard[cboard][x][i].player != null)
} if (opcount >= 2 && count > opcount) return count - opcount; if (opcount >= 2) return 0; return count;
} int AIPCross(int x,int y, int cboard)
{ int player = ListBoard[cboard][x][y].player; int count = -1; int opcount = 0; int m = min(x,y);
{ if (ListBoard[cboard][x-i][y-i].player == player) count++; else if (ListBoard[cboard][x-i][y-i].player != null)
{ if (ListBoard[cboard][x+i][y+i].player == player) count++; else if (ListBoard[cboard][x+i][y+i].player != null)
} if (opcount >= 2 && count > opcount) return count - opcount; if (opcount >= 2) return 0; return count;
} int AIRCross(int x,int y, int cboard)
{ int player = ListBoard[cboard][x][y].player; int count = -1; int opcount = 0; int m = min(x,row-y);
{ if (ListBoard[cboard][x-i][y+i].player == player) count++; else if (ListBoard[cboard][x-i][y+i].player != null)
{ if (ListBoard[cboard][x+i][y-i].player == player) count++; else if (ListBoard[cboard][x+i][y-i].player != null)
} if (opcount >= 2 && count > opcount) return count - opcount; if (opcount >= 2) return 0; return count;
} int AIRepeat(int x,int y,int pl,int b)
ListBoard[b][x][y].player = (P1 + P2) - pl; int scoreDef = DefArray[AIHori(x,y,b)] + DefArray[AIVerti(x,y,b)] +
ListBoard[b][x][y].player = pl; int scoreAtk = AtkArray[AIHori(x,y,b)] + AtkArray[AIVerti(x,y,b)] +
AtkArray[AIPCross(x,y,b)] + AtkArray[AIRCross(x,y,b)]; int score = scoreDef + scoreAtk; if (b < level)
FOR(y1,0,row-1) if (ListBoard[b][x1][y1].player == null)
{ sc = AIRepeat(x1,y1,(P1 + P2) - pl,b+1); if (sc > max) max = sc;
} if (pl == P2) return -score; return score;
{ int score; int max = -9999; int cx = 0, cy = 0;
FOR(y,0,row-1) if (ListBoard[0][x][y].player == null)
BoardToBoard(0,1); score = AIRepeat(x,y,P1,1); if (score > max)
ListBoard[0][cx][cy].value = VX;
ListPlay[cplayed].New(cx,cy); cplayed++;
/* -CheckGameWin -*/ bool HoriWin(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;
{ if (ListBoard[0][i][y].player == pl) count++; else if (ListBoard[0][i][y].player != null)
{ if (ListBoard[0][i][y].player == pl) count++; else if (ListBoard[0][i][y].player != null)
} if (opcount >= 2) return false; if (count >= 5) return true; return false;
{ if (ListBoard[0][x][y].value == null) return false; int pl = ListBoard[0][x][y].player; int count = 0; int opcount = 0;
{ if (ListBoard[0][x][i].player == pl) count++; else if (ListBoard[0][x][i].player != null)
{ if (ListBoard[0][x][i].player == pl) count++; else if (ListBoard[0][x][i].player != null)
} if (opcount >= 2) return false; if (count >= 5) return true; return false;
{ 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);
{ if (ListBoard[0][x-i][y-i].player == pl) count++; else if (ListBoard[0][x-i][y-i].player != null)
{ if (ListBoard[0][x+i][y+i].player == pl) count++; else if (ListBoard[0][x+i][y+i].player != null)
} if (opcount >= 2) return false; if (count >= 5) return true; return false;
{ 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);
{ if (ListBoard[0][x-i][y+i].player == pl) count++; else if (ListBoard[0][x-i][y+i].player != null)
{ if (ListBoard[0][x+i][y-i].player == pl) count++; else if (ListBoard[0][x+i][y-i].player != null)
} if (opcount >= 2) return false; if (count >= 5) return true; return false;
/* -Create Game -*/ void Drawtable(int color)
{ curSq.player = P2; curSq.value = VO;
{ curSq.player = P1; curSq.value = VX;
{ int pl = ListBoard[0][x][y].player; if (HoriWin(x,y))
{ if (ListBoard[0][i][y].player == pl) Drawchar(i,y,ListBoard[0][i]
{ if (ListBoard[0][i][y].player == pl) Drawchar(i,y,ListBoard[0][i]
{ if (ListBoard[0][x][i].player == pl) Drawchar(x,i,ListBoard[0][x]
{ if (ListBoard[0][x][i].player == pl) Drawchar(x,i,ListBoard[0][x]
{ 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 (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 (ListBoard[0][x-i][y+i].player == pl) Drawchar(x-i,y+i,ListBoard[0][x-i] [y+i].value,P1+P2); else break;
24 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;
{ 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");
{ setcolor(15); //white outtextxy(wid + 50,260,"Player: 2"); outtextxy(wid + 50,280,"Character: O");
{ if (HoriWin(x,y) || VertiWin(x,y) || PCrossWin(x,y) || RCrossWin(x,y)) { wongame = true;
{ if (wongame) return; if (x/w