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
3. Activity Diagram
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:
Đầ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;
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.
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.
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.
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.
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 ^^).
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
inGame = false;
}”
Kết thúc trò chơi khi con rắn đạt tới độ dài cho phép
· 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!