LỜI MỞ ĐẦU Hiện nay ở Việt Nam các thiết bị di động đang được người dân yêu thích đặc biệt là giới trẻ ưu thích các công nghệ và sản phẩm mới. Trên thị trường vừa ra phiên bản Iphone 5 được mọi người trên thế giới ưu chuộng. Không khí đó cũng được giới trẻ Việt Nam hưởng ứng nồng nhiệt. Iphone 5 sử dụng các công nghệ tiên tiến như Android 4.2. Nhận thấy được xu hướng của thị trường phát triển về nhúng. Do đó, các trường đào tạo của Việt Nam đã đưa lập trình nhúng vào giảng dậy và đào tạo cho sinh viên. Trong khuôn khổ môn học “Lập trình nhúng cơ bản” nhóm chúng em đã tìm hiểu và xây dựng trò chơi Pikachu trên thiết bị đi động. Báo cáo được viết nhằm mục đích nghiên cứu giới thiệu về hệ điều hành android và trò chơi Pikachu được viết trên nền tảng Android. Công nghệ Android là công nghệ đang được phát triển rộng rãi trên các thiết bị di động như: máy tính bảng, điện thoại smartphone. Hệ điều hành Android đã khẳng định được sự ưu việt, vượt trội so các hệ điều hành trên nền tảng di động khác như WindowPhone,… Trò chơi Pikachu với giao diện đơn giản, thân thiện với người chơi. Đặc biệt là những người chơi đã chơi trên máy PC thì không cảm khác biệt so với phiên bản trên thiết bị di động. Bên trong trò chơi, áp dụng thuật toán tìm đường đi ngắn nhất để kiểm tra tính hợp lệ của người chơi và ghi điểm. Chúng em xin chân thành cảm ơn thầy Trịnh Bá Quý đã giảng dạy và hướng dẫn chúng em trong thời gian làm đề tài này. Mặc dù chúng em đã rất cố gắng đề hoàn thành đề tài nhưng không tránh khỏi những thiếu sót. Mong thầy và các bạn có những ý kiến đóng góp để chúng em làm tốt hơn ở các đề tài tiếp theo. Nhóm sinh viên thực hiện:
Nguyễn Văn Đoàn Nguyễn Khắc Hưng Nguyễn Trung Kiên Phan Thi Linh
Nguyễn Duy Xô
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
MỤC LỤC
2
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
CHƯƠNG I: TỔNG QUAN VỀ ANDROID 1.1.
Lịch sử ra đời
Ban đầu, Android là hệ điều hành cho các thiết bị cầm tay dựa trên lõi Linux do công ty Android Inc. (California, Mỹ) thiết kế. Công ty này sau đó được Google mua lại vào năm 2005 và bắt đầu xây dựng Android Platform. Các thành viên chủ chốt tại ở Android Inc. gồm có: Andy Rubin, Rich Miner, Nick Sears, and Chris White.
Hình 1-1 Android timeline Phiên bản SDK lần đầu tiên phát hành vào tháng 11 năm 2007, hãng T-Mobile cũng công bố chiếc điện thoại Android đầu tiên đó là
chiếc T-Mobile G1, chiếc smartphone đầu tiên dựa trên nền tảng Android. Một vài ngày sau đó, Google lại tiếp tục công bố sự ra mắt phiên bản Android SDK release Candidate 1.0. Trong tháng 10 năm 2008, Google được cấp giấy phép mã nguồn mở cho Android Platform. Vào cuối năm 2008, Google cho phát hành một thiết bị cầm tay được gọi là Android Dev Phone 1 có thể chạy được các ứng dụng Android mà không bị ràng buộc vào các nhà cung cấp mạng điện thoại di động. Mục tiêu của thiết bị này là cho phép các nhà phát triển thực hiện các cuộc thí nghiệm trên một thiết bị thực có thể chạy hệ điều hành Android mà không phải ký một bản hợp đồng nào. Vào khoảng cùng thời gian đó thì Google cũng cho phát hành một phiên vản vá lỗi 1.1 của
3
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
hệ điều hành này. Ở cả hai phiên bản 1.0 và 1.1 Android chưa hỗ trợ soft-keyboard mà đòi hỏi các thiết bị phải sử dụng bàn phím vật lý. Android cố định vấn đề này bằng cách phát hành SDK 1.5 vào tháng Tư năm 2009, cùng với một số tính năng khác. Chẳng hạn như nâng cao khả năng ghi âm truyền thông, vật dụng, và các live folder. 1.2.
Phân tầng kiến trúc trong Android
1.2.1. Tầng ứng dụng Android được tích hợp sẵn một số ứng dụng cần thiết cơ bản như: contacts,
browser, camera, Phone,… Tất cả các ứng dụng chạy trên hệ điều hành Android đều được viết bằng Java 1.2.2. Tầng framework Bằng cách cung cấp một nền tảng phát triển mở, Android cung cấp cho các nhà phát triển khả năng xây dựng các ứng dụng cực kỳ phong phú và sáng tạo. Nhà phát triển được tự do tận dụng các thiết bị phần cứng, thông tin địa điểm truy cập, các dịch vụ chạy nền, thiết lập hệ thống báo động, thêm các thông báo để các thanh trạng thái, và nhiều, nhiều hơn nữa.
4
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
Nhà phát triển có thể truy cập vào các API cùng một khuôn khổ được sử dụng bởi các ứng dụng lõi. Các kiến trúc ứng dụng được thiết kế để đơn giản hóa việc sử dụng lại các thành phần; bất kỳ ứng dụng có thể xuất bản khả năng của mình và ứng dụng nào khác sau đó có thể sử dụng những khả năng (có thể hạn chế bảo mật được thực thi bởi khuôn khổ). Cơ chế này cho phép các thành phần tương tự sẽ được thay thế bởi người sử dụng. 1.2.3. Tầng thư viện Android bao gồm một tập hợp các thư viên C/C++ được sử dụng bởi nhiều thành phần khác nhau trong hệ thống Android. Điều này được thể hiện thông qua nền tảng ứng dụng Android. Một số các thư viện cơ bản được liệt kê dưới đây : System C library Media Libraries Surface Manager
LibWebCore SGL 3D libraries FreeType SQLite 1.2.4. Tầng core của Android Android bao gồm một tập hợp các thư viện cơ bản mà cung cấp hầu hết các chức năng có sẵn trong các thư viện lõi của ngôn ngữ lập trình Java. Tất cả các ứng dụng Android đều chạy trong tiến trình riêng. Máy ảo Dalvik đã được viết để cho một thiết bị có thể chạy nhiều máy ảo hiệu quả. Các VM Dalvik thực thi các tập tin thực thi Dalvik (dex). Định dạng được tối ưu hóa cho bộ nhớ tối thiểu. VM là dựa trên register-based, và chạy các lớp đã được biên dịch bởi một trình biên dịch Java để chuyển đổi thành các định dạng dex. Các VM Dalvik dựa vào nhân Linux cho các
5
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
chức năng cơ bản như luồng và quản lý bộ nhớ thấp 1.2.5. Linux kernel Android dựa trên Linux phiên bản 2.6 cho hệ thống dịch vụ cốt lõi như security, memory management, process management, network stack, and driver model. Kernel Linux hoạt động như một lớp trừu tượng hóa giữa phần cứng và phần còn lại của phần mềm stack 1.3.
Cấu trúc 1 dự án trong android
1.3.1. AndroidManifest.xml Trong bất kì một project Android nào khi tạo ra đều có một file AndroidManifest.xml, file này được dùng để định nghĩa các screen sử dụng, các permission cũng như các theme cho ứng dụng. Đồng thời nó cũng chứa thông tin về phiên bản SDK cũng như main activity sẽ chạy đầu tiên. File này được tự động sinh ra khi tạo một Android project. Trong file manifest bao giờ cũng có 3 thành phần chính đó là: application, permission và version <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=" />package="com.jforeach.mazeman"
1.3.2. File R.java File R.java là một file tự động sinh ra ngay khi tạo ứng dụng, file này được sử dụng để quản lý các thuộc tính được khai báo trong file XML của ứng dụng và các tài nguyên hình ảnh Mã nguồn của file R.java được tự động sinh khi có bất kì một sự kiện nào xảy xa làm thay đổi các thuộc tính trong ứng dụng. Chẳng hạn như, bạn kéo và thả một file hình ảnh từ bên ngoài vào project thì ngay lập tức thuộc tính đường dẫn đến file đó cũng sẽ được hình thành trong file R.java hoặc xoá một file hình ảnh thì đường dẫn tương ứng đến hình ảnh đó cũng tự động bị xoá public static final class anim { public static final int hyperjump=0x7f040000; public static final int zoom=0x7f040001; } public static final class array { public static final int ball_color_codes=0x7f060005; public static final int ball_colors=0x7f060004; public static final int bg_color_codes=0x7f060001; public static final int bg_colors=0x7f060000; public static final int wall_color_codes=0x7f060003; public static final int wall_colors=0x7f060002; }
1.4.
Vòng đời ứng dụng Android
Một tiến trình Linux gói gọn một ứng dụng Android đã được tạo ra cho ứng
7
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
dụng khi codes cần được run và sẽ còn chạy cho đến khi: Nó không phụ thuộc. Hệ thống cần lấy lại bộ nhớ mà nó chiếm giữ cho các ứng dụng khác Một sự khác thường và đặc tính cơ bản của Android là thời gian sống của tiến trình ứng dụng không được điều khiển trực tiếp bới chính nó. Thay vào đó, nó được xác định bởi hệ thống qua một kết hợp của: Những phần của ứng dụng mà hệ thống biết đang chạy Những phần quan trọng như thế nào đối với người dùng 1.4.1. Chu kỳ các thành phần Trong một ứng dụng Android có chứa nhiều thành phần và mỗi thành phần đều có một chu trình sống riêng. Và ứng dụng chỉ được gọi là kết thúc khi tất cả các thành phần trong ứng dụng kết thúc. Activity là một thành phần cho phép người dùng giao tiếp với ứng dụng. Tuy nhiên, khi tất cả các Activity kết thúc và người dùng không còn giao tiếp được với ứng dụng
nữa nhưng không có nghĩa là ứng dụng đã kết thúc. Bởi vì ngoài Activity là thành phần có khả năng tương tác người dùng thì còn có các thành phần không có khả năng tương tác với người dùng như là Service, Broadcast
8
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
1.4.2. Activity Stack Bên trong hệ thống các activity được quản lý như một activity stack. Khi một Activity mới được start, nó được đặt ở đỉnh của stack và trở thành activity đang chạy activity trước sẽ ở bên dưới activity mới và sẽ không thấy trong suốt quá trình activity mới tồn tại
Hình Activity stack 1.4.3. Các trạng thái của chu kỳ
Hình Chu kỳ sống của Activity
9
LTK5.KHMT2
1.5.
Nhóm7 – Trò chơi Pikachu
ANDROID EMULATOR
Android SDK và Plugin Eclipse được gọi là một Android Deverloper Tool (ADT). Các Android coder sẽ cần phải sử dụng công cụ IDE (Integrated Development Enveronment) này để phát triển, debugging và testing cho ứng dụng. Tuy nhiên, các coder cũng có thể không cần phải sử dụng IDE mà thay vào đó là sử dụng command line để biên dịch và tất nhiên là vẫn có Emulator như thường. Android Emulator được trang bị đầy đủ hầu hết các tính năng của một thiết bị thật. Tuy nhiên, một số đã bị giới hạn như là kết nối qua cổng USB, camera và video, nghe phone, nguồn điện giả lập và bluetooth. Android Emulator thực hiện các công việc thông qua một bộ xử lý mã nguồn mở, công nghệ này được gọi là QEMU ( />được phát triển bởi Fabrice Bellard.
10
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
CHƯƠNG 2: CÁC CONTROL TRONG ANDROID 2.1.
Control View
Trong một ứng dụng Android, giao diện người dùng được xây dựng từ các đối tượng View và ViewGroup. Có nhiều kiểu View và ViewGroup. Mỗi
một kiểu là một hậu duệ của class View và tất cả các kiểu đó được gọi là các Widget. Tất cả mọi widget đều có chung các thuộc tính cơ bản như là cách trình bày vị trí, background, kích thước, lề,… Tất cả những thuộc tính chung này được thể hiện hết ở trong đối tượng View. Trong Android Platform, các screen luôn được bố trí theo một kiểu cấu trúc phân cấp như hình dưới. Một screen là một tập hợp các Layout và các widget được bố trí có thứ tự. Để thể hiện một screen thì trong hàm onCreate của mỗi Activity cần phải được gọi một hàm là setContentView(R.layout.main); hàm này sẽ load giao diện từ file.
2.2.
Control LinearLayout
LinearLayout được dùng để bố trí các thành phần giao diện theo chiều ngang hoặc chiều dọc nhưng trên một line duy nhất mà không có xuống dòng.LinearLayout làm cho các thành phần trong nó không bị phụ thuộc vào kích thước của màn hình. Các thành phần trong LinearLayout được dàn theo những tỷ lệ cân xứng dựa vào các ràng buộc giữa các thành phần. <LinearLayout xmlns:android=" />android:orientation="vertical" android:layout_width="fill_parent"
Sở dĩ widget button được giới thiệu đầu tiên trong số các widget khác là vì đây là đối tượng có thể nói là được dùng nhiều nhất trong hầu hết các ứng dụng Android public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.about); View close = findViewById(R.id.closeAbout); ImageView image = (ImageView)findViewById(R.id.aboutImg); Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.zoom); image.startAnimation(hyperspaceJump); close.setOnClickListener(this); }
Được dùng để thể hiện một hình ảnh. Nó cũng giống như ImageButton, chỉ khác là không có hình dáng của một cái button public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.about); View close = findViewById(R.id.closeAbout); ImageView image = (ImageView)findViewById(R.id.aboutImg); Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.zoom); image.startAnimation(hyperspaceJump); close.setOnClickListener(this); } android:src="@drawable/about" android:layout_width="fill_parent" 12
Được sử dụng để thể hiện một danh sách các thông tin theo từng cell. Mỗi cell thông thường được load lên từ một file XML đã được cố định trên đó số lượng thông tin và loại thông tin cần được thể hiện Để thể hiện được một list thông tin lên một screen thì cần phải có 3 yếu tố chính : DataSource: Data Source có thể là một ArrayList, HashMap hoặc bất kỳ một cấu trúc dữ liệu kiểu danh sách nào. Adapter: Adapter là một class trung gian giúp ánh xạ dữ liệu trong Data Source vào đúng vị trí hiển thị trong ListView. Chẳng hạn, trong Data Source có một trường name và trong ListView cũng có một TextView để thể hiện trường name này. Tuy nhiên, ListView sẽ không thể hiển thị dữ liệu trong Data Source lên được nếu như Adapter không gán dữ liệu vào cho đối tượng hiển thị. ListView: ListView là đối tượng để hiển thị các thông tin trong Data Source ra một cách trực quan và người dùng có thể thao tác trực tiếp trên 2.6.
Control TextView
Trong Android đối tượng EditText được sử dụng như một TextField hoặc một Textbox : public void onClick(View view) { switch(view.getId()) { case R.id.bExit: finish(); break; case R.id.bNew: String[] levels = {"Bài 1", "Bài 2", "Bài 3"}; AlertDialog.Builder builder = AlertDialog.Builder(this);
13
new
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
builder.setTitle(getString(R.string.levelSelect)); builder.setItems(levels, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { Intent game = new Intent(Menu.this,Game.class); Maze maze = MazeCreator.getMaze(item+1);
game.putExtra("maze", maze); startActivity(game); } }); AlertDialog alert = builder.create(); alert.show(); break; case R.id.bAbout: Intent about = new Intent(Menu.this,About.class); startActivity(about); break; case R.id.bPrefs: Intent prefs = new Intent(Menu.this,AppPreferences.class);
CHƯƠNG III: GIỚI THIỆU CHỨC NĂNG, KIẾN TRÚC XÂY DỰNG TRÒ CHƠI 3.1.
Giới thiệu & mô tả trò chơi
Giao diện trò chơi đơn giản, thân thiện với mọi người chơi. Đặc biệt là người chơi đã quen thuộc với game pikachu trên PC thì khi chơi họ không cảm thấy khác biệt khi chơi trên PC và điện thoại. Trò chơi được chơi như sau: Người chơi phải click chuột vào 2 con Pokemon giống nhau và đường đi từ con Pokemon này đến Pokemon kia không quá 3 đường. Các Pokemon được sắp xếp ngẫu nhiên (random) trên lưới grid 9 cột và 10 dòng. Mỗi ô có kích thước 44x54 pixcel. Như vậy trên grid sẽ có tổng thể là 90 con Pokemon. Người chơi khi ăn được 2 con Pokemon thì sẽ tự động cộng được 20 điểm vào quỹ điểm. Khi người chơi chơi hết 1 bài thì trò chơi sẽ tự động chuyển sang bài thứ 2. Với cách chơi cũng tương tự như bài thứ nhất nhưng vị trí của Pokemon sẽ được thay đổi sau khi có Pokemon bị mất đi. Control được sử dụng để hiển thị các Pokemon trên lưới là control View. 3.2.
Phân tích trò chơi
- Mô hình tác nhân trò chơi
Trò chơi Pikachu
Người chơi - Mô hình phân rã chức năng
Level bài chơi
Trò chơi Pikachu
Tính điểm
Kết thúc
16
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
3.3.
Mô tả chức năng
TT
Tên chức năng
1
Level bài chơi
2
Tính điểm
Chương trình sẽ tích lũy điểm của tất cả các bài mà người chơi, đã chơi
3
Kết thúc
Thoát khỏi ứng dụng
3.4.
Mô tả chi tiết Sau khi chơi xong bài ở level thấp, chương trình sẽ tự động chuyển sang level khó hơn.
Yêu cầu kỹ thuật
STT Nội dung yêu cầu 1
Phần mềm hoạt động trên môi trường máy ảo SDK2.2, 4.2
2
Giao diện thân thiện với người chơi.
3
Thông số cài đặt đơn giản, dễ thực hiện
4
Độ khó của trò chơi sẽ được tăng dần theo từng bài
3.5.
Xây dựng các đối tượng trong trò chơi
Trong trò chơi sử dụng cả thảy 15 con Pokemon. Các Pokemon này là các hình ảnh được lưu trữ dạng Hezxa trong thư viện để nhằm mục đích kiểm tra tính đúng đắn theo luật của trò chơi và ảnh của Pokemon được lưu trong thư mục Resource của dự án. 15 đối tượng Pokemon này sẽ được đối tượng Random trong Android sẽ tự động lấy ngẫu nhiên để hiển thị lên lưới dữ liệu. Tại mỗi ô trong grid sẽ được đặt 1 đối tượng Pokemon. Khi người chơi click chọn vào 2 Pokemon thì trò chơi sẽ tự động kiểm tra xem có phải 2 đối tượng Pokemon đó giống nhau hay không. Và đường đi đến 2 đối tượng Pokemon đó có thỏa mãn điều kiện không quá 3 đường hay không. Ảnh đối tượng của Pokemon: Thuật toán tìm đường đi giữa 2 Pokemon là thuật toán tìm kiếm đường đi trên đồ thị (BFS).
17
LTK5.KHMT2
3.6.
Nhóm7 – Trò chơi Pikachu
Thuật toán BFS (Beadth First Search)
Thuật toán BFS là thuật toán tìm kiếm đường đi theo chiều rộng. Rất được ứng dụng trong trò chơi. - Ý tưởng của bài toán + Mảng int arrDiemLanCan với độ dài bằng số đỉnh (vì trường hợp cao nhất là tất cả các đỉnh đều được xét cùng lúc – chiều cao của cây = 1) + Biến int k, nhiệm vụ là đánh dấu tiến trình xét các phần tử, khi k=-1 là lúc arrDiemLanCan rỗng. + Mảng int arrDinh là nơi chứa các đỉnh có thể liên kết với nhau để đưa ra lời giải với đỉnh Start và Goal. + Cuối cùng là mảng 2 chiều matranLienKet => Ma trận. - Thực hiện: B1: Gán k = 0 Phần tử đầu mảng sẽ là Start (arrDiemLanCan[0] = Start). B2: Xét arrDiemLanCan[0] là Goal hoặc k = -1 (arrDiemLanCan rỗng) thì chạy B7. Ngược lại thì chạy B3. B3: Tạo vòng lặp xét tất cả các cột của dòng arrDiemLanCan[0] trong ma trận, col là cột trong ma trận và cũng là điểm lân cận nếu arrLienKet[arrDiemLanCan[0], col] = 1 => có liên kết thì xét arrDinh[col] có bằng -1 hay ko. Nếu bằng thì chạy B4. Ngược lại Không có liên kết hoặc khác -1, thì chạy B6. (Tránh trường hợp bị lặp liên tục trong liên kết 2 chiều)
B4: Xét điểm col có nằm trong arrDiemLanCan, đã xét hay chưa. Nếu chưa chạy B5. Còn đã tồn tại thì chạy B6. B5: Gán cho phần tử kế tiếp arrDiemLanCan là col (arrDiemLanCan[+ +k]=col). Gán cho phần tử thứ col trong mảng arrDinh[col] là điểm arrDiemLanCan[0]. B6: Đẩy mảng arrDiemLanCan từ phải qua trái 1 phần tử. Gán arrDiemLanCan[k] = -1 và giảm k--. Chạy B2. B7: Xét arrDinh[Dich] có khác -1 không và đường đi có dừng chân tại -2 hay không. Nếu khác thì quay lui, nếu không thì xuất "Không tìm được lời giải".
18
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
CHƯƠNG IV: KẾT QUẢ ĐẠT ĐƯỢC 4.1.
Giao diện trò chơi
4.2.
Tính điểm của trò chơi
19
LTK5.KHMT2
Nhóm7 – Trò chơi Pikachu
TÀI LIỆU THAM KHẢO 1. Giáo trình lập trình Android – Đại học Thái Nguyên 2. Video hướng dẫn học Android – Đại học Duy Tân. 3. Các