Thứ Tư, 20 tháng 1, 2016

BÁO CÁO MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG TRONG JAVA - XÂY DỰNG GAME RẮN SĂN MỒI

BÁO CÁO MÔN HỌC: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
ĐỀ TÀI: XÂY DỰNG GAME RẮN SĂN MỒI

Lớp:                         ĐHTINK5
Thành Viên: Lê Thị Thùy Linh
                         Nguyễn Thị Ngọc Hà
                   Đoàn Cường Anh
                         Phan Thị Quỳnh Mai
                     Nguyễn Duy Hưng
================================================



Lời nói đầu
        Ngày nay công nghệ thông tin trở thành một phần không thể thiếu trong cuộc sống, công nghệ thông tin đã và đang đóng vai trò quan trọng trong các ngành khoa học, kĩ thuật, kinh tế, xã hội tại các nước trên thế giới. Nó  mang lại giá trị về kinh tế, giáo dục và đặc  biệt là mang tính giải trí cao.
Sau sự ra đời của Internet, game online xuất  hiện và nhanh chóng  gây được sức hút to lớn đối. Hiện tại,  game cũng đang tiếp tục  phát triển mạnh mẽ.
Sau quá trình học tập và nghiên cứu bộ môn “Lập trình hướng  đối tượng” và làm quen với ngôn ngữ lập  trình Java dưới sự  hướng dẫn của giáo viên Trần Xuân Thanh, nhóm chúng tôi  đã đi tới nghiên cứu đề tài “Xây dựng game Rắn săn mồi” và  hoàn thành báo cáo.

================================================

I. Tổng Quan
1.  Đặt vấn đề
Ngày nay công nghệ thông tin trở thành một lĩnh vực mũi nhọn  trong công cuộc phát triển kinh tế xã hội. Cùng với công nghệ sinh học và năng lượng mới,công nghệ thông tin(CNTT) vừa là công  cụ, vừa là động lực thúc đẩy quá trình công nghiệp hóa, hiện đại  hóa đất nước.
Có thể nói game đã và đang trở thành một nhu cầu giải trí thiết yếu trong cuộc sống của con người hiện  nay. Một trong những thể loại  game kinh điển mà khi nhắc tới chắc không còn xa lạ gì với chúng ta nhất  là đối với thế hệ 8x trở về sau này đó chính là game rắn  săn mồi. Trong bối cảnh công nghệ ngày càng được phát triển như hiện nay thì nhiều thể loại game mới cũng ra đời ngày càng nhiều  và thu hút được nhiều bạn trẻ. Tuy nhiên không vì vậy mà game rắn săn mồi bị lưu  mờ mà vẫn giữ được một vị trí trong lòng  những người yêu thích thể loại game này. Game đòi hỏi người chơi phải khéo léo và thể hiện khả năng kiểm soát con rắn, ăn càng  nhiều mồi càng tốt để có cơ hội nhận được điểm cao cũng như  mở được nhiều màn chơi mới khó hơn và hay hơn. Một đặc điểm  của game này là cấu hình không quá nặng, có thể chơi được trên  máy tính cũng như các thiết bị điện thoại.
Vì thế đề tài “Game Rắn Săn Mồi” được tiến hành nhằm phục vụ  nhu cầu giải trí cho chúng ta sau những giờ làm việc căng thẳng.
2. Mô tả đề tài
Đề tài: Game Rắn Săn Mồi
Con rắn là một game cổ điển. Lần đầu tiên xuất hiện trong thập  niên 70, sau đó nó đã được đưa lên máy tính. Trong trò chơi này người chơi điều khiển một con rắn. Mục tiêu  là để ăn nhiều càng tốt. Khi con rắn ăn một quả táo, số đốt thân  của nó tăng lên. Con rắn phải tránh những bức tường và cơ thể của chính mình.  Game này đôi khi được gọi là Nibbles.
Kích thước của mỗi của các đốt thân của một con rắn là 10px. Con rắn này được điều khiển bằng phím mũi tên. Ban đầu con rắn có ba khớp. Trò chơi được bắt đầu bằng cách bấm một trong các phím mũi tên. Nếu trò chơi kết thúc, chúng ta  sẽ hiển thị thông báo Game Over ở giữa của Form.
Mô tả:
+Game cấu hình nhẹ, đơn giản, giải trí lành mạnh.
- Cách chơi:
·         Người chơi dùng các phím mũi tên lên, xuống, trái, phải để điều khiển con rắn sao cho ăn được  mồi
·         Điều kiện qua màn: Tích lũy số điểm theo đúng yêu cầu trò chơi  quy định sẽ qua màn khác. Mỗi  lần ăn mồi sẽ được cộng điểm
·         Điều kiện thất bại (GameOver): +Con rắn đụng vào vật cản trên đường đi sẽ kết thúc game
3. Phân tích yêu cầu
- Yêu cầu chức năng
·         Chơi mới: Khi người chơi ấn vào button bắt đầu thì sẽ bắt đầu tạo  ra game mới.
·         Phải có nhiều bản đồ khác nhau tương ứng với độ khó khác nhau, mỗi bản đồ sẽ có các chướng  ngại vật.
·         Ngoài ra người chơi có thể unlock được các bản đồ cao hơn, nếu họ đã đi qua các bản đồ cũ.
·         Mỗi khi rắn ăn mồi thì rắn phải dài ra thêm một đơn vị.
·         Game phải được chia làm nhiều mức level khác nhau, mỗi level tốc độ rắn phải được nâng lên.
·         Khi kết thúc game phải hiển thị điểm của người chơi
- Yêu cầu phi chức năng
·         Cấu hình nhẹ, dễ cài đặt.
·         Giao diện thân thiện dễ sử dụng
·         Gíup người chơi thư giãn sau những giờ làm việc căng thẳng
·         Giúp người chơi tăng khả năng tập trung vào công việc.

II. Thiết kế ứng dụng
1. Mô hình DFD

2. Mô hình ERD mô phỏng dữ liệu

3. Activity Diagram

4. Giao diện chương trình



IV. Xây dựng code viết chương trình
v Thuật toán xây dựng chương trình
Đầu tiên chúng ta sẽ khai báo những hằng (constant) sử dụng trong game:

Mã:
private final int WIDTH = 300;
private final int HEIGHT = 300;
private final int DOT_SIZE = 10;
private final int ALL_DOTS = 900;
private final int RAND_POS = 29;
private final int DELAY = 140;

WIDTH và HEIGHT xác định kích thước của Ban.
DOT_SIZE là kích thước của táo và các đốt thân của con rắn.
ALL_DOTS xác định số lượng chấm tối đa có thể có trên Board (900 = 300 * 300/10 * 10).
RAND_POS liên tục được sử dụng để tính toán vị trí ngẫu nhiên của một trái táo. Hằng số DELAY xác định tốc độ của trò chơi.

Mã:
“private int x[] = new int[ALL_DOTS];
private int y[] = new int[ALL_DOTS];”

Hai mảng x, y lưu tọa độ của tất cả các khớp xương của con rắn.

Trong hàm move() là các thuật giải chính của trò chơi. Để hiểu nó, hãy nhìn con rắn chuyển động như thế nào. Bạn kiểm soát đầu của con rắn, có thể thay đổi hướng của nó với các phím mũi tên. Phần còn lại của các khớp di chuyển lên một vị trí trong mảng. Khớp thứ 2 di chuyển đến vị trí vừa rồi của khớp thứ nhất, khớp thứ 3 di chuyển đến vị trí vừa rồi của khớp thứ 2...

Mã:
for (int z = dots; z > 0; z--) {
x[z] = x[(z - 1)];
y[z] = y[(z - 1)];
}”

Đoạn code này di chuyển các khớp tuần tự lên.


Mã:
if (left) {
x[0] -= DOT_SIZE;
}”
Đoạn code này di chuyển đầu con rắn qua trái.

Hàm checkCollision () dùng để xác định xem con rắn đã đụng chính nó hoặc những bức tường

Mã:
for (int z = dots; z > 0; z--) {
if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {
inGame = false;
}
}”

Đoạn code này kết thúc trò chơi khi con rắn đụng 1 trong những khớp thân của nó bằng đầu (đương nhiên ^^).


Mã:
if (y [0]> HEIGHT) {
inGame = false;
}”

Kết thúc trò chơi khi con rắn đạt tới độ dài cho phép

Trên đây là hướng dẫn viết game rắn săn mồi đơn giản nhất.


 ·         Giới thiệu một số đoạn code xây dựng chương trình
+ Hai mảng x, y lưu tọa độ của tất cả các khớp xương của con rắn.
“ public class Point {
private int x;
private int y;

//khoi tao Point co toa do xy
public Point(int x, int y){
this.x = x;
this.y = y;
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.y = y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
} ”


+ Xây dựng quy tắc di chuyển, tính điểm
“public class MySnakePanel extends JPanel{
            for(int i = sn.getLength(); i > 0; i--){
                // nếu vị trí đầu của snake là thức ăn
            matrix[sn.getPoint(0).getX()][sn.getPoint(0).getY()] = 2; // vị trí đầu tiên của snake
            if(!food){
                int randomX = rd.nextInt(matrix.length);
            // vẽ trên panel dựa trên ma trận


public MySnakePanel(int bando){
System.out.println(bando);
food = false;
foodColor = false;
isLose = false;
scores = 0;
this.setBackground(Color.black);
matrix = new int[MyStaticVar.Y/MyStaticVar.sizeCell][MyStaticVar.X/MyStaticVar.sizeCell];

for(int i = 0; i < matrix.length; i++)
{
for(int j = 0; j < matrix[i].length; j++)
{
if(i == 0) {
matrix[i][j] = 1;
}
else if(i == matrix.length - 1) {
matrix[i][j] = 1;
}
else if(j == 0) {
matrix[i][j] = 1;
}
else if(j == matrix[i].length - 1) {
matrix[i][j] = 1;
}
else {
matrix[i][j] = 0;
}
}
}
if(bando == 1){
int a = 10;
int b = matrix.length - 10;;
for(int j = 11; j < matrix[0].length - 11; j++){
matrix[a][j] = 1;
matrix[b][j] = 1;
}

}
else if(bando == 2){
int a = 10;
int b = matrix.length - 10;;
for(int j = 12; j < matrix[0].length - 12; j++){
matrix[a][j] = 1;
matrix[b][j] = 1;
}
for(int i = a; i <= b; i++){
for(int j = 5; j < 8; j++){
matrix[i][matrix[0].length - j] = 1;
matrix[i][j] = 1;
}
}

}
sn = new Snake();
for(int i = 0; i < sn.getLength(); i++){
matrix[sn.getPoint(i).getX()][sn.getPoint(i).getY()] = 2;
}

d = 1;


}
public void setMatrix(int i, int j, int num){
matrix[i][j] = num;
}
public int getMatrix(int i, int j){
return matrix[i][j];
}
public void setD(int d){
this.d = d;
}
public int getD(){
return this.d;
}
@Override
@SuppressWarnings("empty-statement")
protected void paintComponent(Graphics g){

super.paintComponent(g);
if(scores == 100){
isLose = true;
}
if(!isLose){
Point p = new Point(0, 0);

// point thứ i bằng point thứ i-1
p = sn.getPoint(i-1);
sn.setPoint(i, p);
matrix[sn.getPoint(i).getX()][sn.getPoint(i).getY()] = 2;
}
// xét point đầu tiên của snake
if(d == 1){
p.setX(sn.getPoint(0).getX());
p.setY(sn.getPoint(0).getY() + 1);
sn.setPoint(0, p);
}
else if(d == 2){
p.setX(sn.getPoint(0).getX());
p.setY(sn.getPoint(0).getY() - 1);
sn.setPoint(0, p);
}
else if(d == 3){
p.setX(sn.getPoint(0).getX() + 1);
p.setY(sn.getPoint(0).getY());
sn.setPoint(0, p);
}
else if(d == 4){
p.setX(sn.getPoint(0).getX() - 1);
p.setY(sn.getPoint(0).getY());
sn.setPoint(0, p);
}
if(matrix[sn.getPoint(0).getX()][sn.getPoint(0).getY()] == 3){

sn.setLength(sn.getLength() + 1); // tăng chiều dài snake lên 1
matrix[sn.getPoint(0).getX()][sn.getPoint(0).getY()] = 2;
food = false;
scores++;
}
else if(matrix[sn.getPoint(0).getX()][sn.getPoint(0).getY()] == 0){
// nếu là 0 thì cho phép di,  xóa vị trí cuối của snake
matrix[sn.getPoint(sn.getLength()).getX()][sn.getPoint(sn.getLength()).getY()] = 0;
}
else if(matrix[sn.getPoint(0).getX()][sn.getPoint(0).getY()] == 2 || matrix[sn.getPoint(0).getX()][sn.getPoint(0).getY()] == 1){
isLose = true;
}


// tạo vị trí ngẫu nhiên của thức ăn
Random rd = new Random();

int randomY = rd.nextInt(matrix[0].length);
if(matrix[randomX][randomY] != 0){
outerloop:
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[i].length; j++){
if(matrix[i][j] == 0){
matrix[i][j] = 3;
break outerloop;
}
}
}
}
else{
matrix[randomX][randomY] = 3;
}
food = true;
}

for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[i].length; j++){
if(matrix[i][j] == 1){
g.setColor(Color.red);
g.fill3DRect(j * MyStaticVar.sizeCell, i * MyStaticVar.sizeCell, MyStaticVar.sizeCell, MyStaticVar.sizeCell, true);
}
else if(matrix[i][j] == 2){
g.setColor(Color.GREEN);
g.fill3DRect(j * MyStaticVar.sizeCell, i * MyStaticVar.sizeCell, MyStaticVar.sizeCell, MyStaticVar.sizeCell, true);
}
else if(matrix[i][j] == 3){
if(foodColor){
g.setColor(Color.CYAN);
}
else{
g.setColor(Color.blue);
}
foodColor = !foodColor;
g.fill3DRect(j * MyStaticVar.sizeCell, i * MyStaticVar.sizeCell, MyStaticVar.sizeCell, MyStaticVar.sizeCell, true);
}
}
}

g.setColor(Color.LIGHT_GRAY);
Font font = new Font("Book Antiqua", Font.PLAIN, 35);
g.setFont(font);
char [] data = {'S', 'c', 'o', 'r', 'e', 's'};
g.drawChars(data, 0, data.length, MyStaticVar.X + 30, 40);
String s = scores + " / " + MyStaticVar.maxLengthSnake;
data = s.toCharArray();
g.setColor(Color.MAGENTA);
g.drawChars(data, 0, data.length, MyStaticVar.X + 30, 80);

}
else{
g.setColor(Color.red);
Font font = new Font("Book Antiqua", Font.PLAIN, 60);
g.setFont(font);
char [] data = {'G', 'a', 'm', 'e', ' ', ' ', 'O', 'v', 'e', 'r'};
g.drawChars(data, 0, data.length, 100, 100);

g.setColor(Color.LIGHT_GRAY);
font = new Font("Book Antiqua", Font.PLAIN, 40);
g.setFont(font);
String s = "Scores";
data = s.toCharArray();
g.drawChars(data, 0, data.length, 100, 190);
s = scores + " / " + MyStaticVar.maxLengthSnake;
data = s.toCharArray();
g.setColor(Color.MAGENTA);
g.drawChars(data, 0, data.length, 100, 240);
}
}

private int matrix[][];
private int d; // 1 là từ trái qua phải, 2 là từ phải qua trái, 3 là từ trên xuống dưới, 4 là từ dưới lên trên
private Snake sn;
private boolean food; // true là có thức ăn, false là không có
private boolean foodColor; // dùng để thay đổi màu sắc cho thức ăn
private boolean isLose; // true là thua
private int scores;
}”



V. Tổng Kết
Trong thời gian nghiên cứu và vận dụng những kiến thức đã được  trang bị ở nhà trường và các lĩnh vực  khác. Chúng em đã viết  được game rắn săn mồi nhằm mục đích giải trí lành mạnh.  Chúng em hy vọng  rằng những khái niệm này là tiền đề giúp chúng em phát triển  mạnh hơn về những thể loại game khác  chất lượng hơn, hay hơn để phục vụ cho nhu cầu trong cuộc sống  chúng ta.
Trong quá trình thực hiên đề tài, chúng em đã nhận được sự giúp  đỡ tận tình của Thầy Trần Xuân Thanh giúp chúng em hoàn thành  tốt bài báo cáo này.
Vì thời gian làm báo cáo hạn hẹp, kinh nghiệm thực tế chưa nhiều  nên báo cáo không tránh khỏi những  sai sót, rất mong sự góp ý  của thầy và các bạn.


Chúng tôi xin chân thành cảm ơn!