▪ 2.4.1 Ứng dụng đã làm được • 2.4.1.1 Mô tả ứng dụng
-Rắn săn mồi là game cổ điển, xuất hiện vào năm 1997 trên Nokia 6610 là những ô vuông xếp liên tiếp nhau di chuyển trên một màn hình màu xanh đơn giản, nhưng rắn săn mồi đã xây dựng rất thành công tên tuổi của mình. Với bốn trăm triệu bản xuất xưởng và đến hiện tại đã là phiên bản thứ tám. Game có sự hấp dẫn đối với người chơi.
-Bố cục game gồm 3 thành phần:
• Rắn: di chuyển tự động và đổi hướng qua các key(w-lên,s-xuống,d- phải,a-trái)
Táo(con mồi ): tự động xuất hiện ngẫu nhiên trong map
• Tường(map ):ngăn rắn di chuyển và nhận định thua khi đâm vào tường
• 2.4.1.2 Nội dung phần code #include <iostream>
#include <conio.h>
void run(); void printMap(); void initMap();
void move(int dx, int dy); void update();
void changeDirection(char key); void clearScreen();
void generateFood();
char getMapValue(int value); // Map dimensions
const int mapwidth = 20; const int mapheight = 20;
const int size = mapwidth * mapheight; // The tile values for the map
intmap[size];
// Snake head details int headxpos;
int headypos; int direction;
// Amount of food the snake has (How long the body is) int food = 3;
// Determine if game is running bool running;
{
run(); return 0; }
// Main game function void run()
{
// Initialize the map initMap();
running = true; while (running) { // If a key is pressed if (kbhit()) {
// Change to direction determined by key pressed changeDirection(getch());
}
// Upate the map update();
// Clear the screen clearScreen(); // Print the map printMap();
// wait 0.5 seconds _sleep(500);
}
// Print out game over text
std::cout << "\t\t!!!Game over!" << std::endl << "\t\tYour score is: "
<< food;
// Stop console from closing instantly std::cin.ignore();
}
// Changes snake direction from input void changeDirection(char key) { /*
W A + D S
1 4 + 2 3 */ switch (key) { case 'w': if (direction != 2) direction = 0; break; case 'd': if (direction != 3) direction = 1; break; case 's': if (direction != 4) direction = 2; break; case 'a': if (direction != 5) direction = 3; break; } }
// Moves snake head to new location void move(int dx, int dy) {
// determine new head position int newx = headxpos + dx; int newy = headypos + dy;
// Check if there is food at location
if (map[newx + newy * mapwidth] == -2) { // Increase food value (body length) food++;
// Generate new food on map generateFood();
}
// Check location is free
else if (map[newx + newy * mapwidth] != 0) { running = false;
}
// Move head to new location headxpos = newx;
map[headxpos + headypos * mapwidth] = food + 1; }
// Clears screen void clearScreen() { // Clear the screen system("cls"); }
// Generates new food on map void generateFood() {
int x = 0; int y = 0; do {
// Generate random x and y values within the map x = rand() % (mapwidth - 2) + 1;
y = rand() % (mapheight - 2) + 1; // If location is not free try again } while (map[x + y * mapwidth] != 0); // Place new food
map[x + y * mapwidth] = -2; }
// Updates the map void update() {
// Move in direction indicated switch (direction) { case 0: move(-1, 0); break; case 1: move(0, 1); break; case 2: move(1, 0); break; case 3: move(0, -1); break; }
// Reduce snake values on map by 1 for (int i = 0; i < size; i++) {
if (map[i] > 0) map[i]--; }
}
// Initializes map void initMap() {
// Places the initual head location in middle of map headxpos = mapwidth / 2;
headypos = mapheight / 2;
map[headxpos + headypos * mapwidth] = 1; // Places top and bottom walls
for (int x = 0; x < mapwidth; ++x) { map[x] = -1;
map[x + (mapheight - 1) * mapwidth] = -1; }
// Places left and right walls
for (int y = 0; y < mapheight; y++) { map[0 + y * mapwidth] = -1;
map[(mapwidth - 1) + y * mapwidth] = -1; }
// Generates first food generateFood(); }
// Prints the map to console void printMap()
{
for (int x = 0; x < mapwidth; ++x) { for (int y = 0; y < mapheight; ++y) { // Prints the value at current x,y location
std::cout << getMapValue(map[x + y * mapwidth]); }
// Ends the line for next x value std::cout << std::endl;
} }
// Returns graphical character for display from map value char getMapValue(int value)
{
// Returns a part of snake body if (value > 0) return 'o';
switch (value) { // Return wall case -1: return 'X'; // Return food case -2: return 'O'; }
}
• 2.4.1.2 Kết quả đạt được
Bằng cách sử dụng trình biên dịch Microsoft visual C++ 2000, chúng ta có thể chơi trò chơi này ngay trên màn hình in ra . Sau khi Build chúng ta thu được màn hình của game như hình sau.
Màn hình hiển thị sẽ hiển thị kích thước bán đầu của con rắn và vị trí, đồng thời con mồi sẽ xuất hiện random trên toàn bộ map được đóng khung như trên.
Sau khi rắn đâm vào viền của map, màn hình sẽ dừng chương trình chạy của game dồng thời hiển thị dòng chữ GAME OVER ,và hiển thị số điểm mà bạn đạt được.
▪ 2.4.2 Đánh giá chung
Sinh viên thực tập đã làm được trong thời gian học tập tại doanh nghiệp:
● Học tập và làm việc phù hợp theo yêu cầu
● Đảm bảo đúng tiến độ yêu cầu. Những hạn chế mà sinh viên cần khắc phục:
● Chưa nắm chắc được các thuật toán nâng cao ( stack , queue)