Tìm kiếm bài viết

Làm ứng dụng học toán đơn giản với React Native - Phần 3

03.02.2021

5.0/5 (1 Reviews)

Cùng học thiết kế ứng dụng game học toán cơ bản đơn giản bằng React Native bài 3. Học React Native cùng LPTech để cùng lập trình ra những ứng dụng hay.

    Chào các bạn, vậy là mình đã trở lại với series về ứng dụng học toán đơn giản với React Native, qua từng bài viết, mình sẽ dần dần update app bằng việc thêm các tính năng, kỹ thuật cho app. Nếu đây là lần đầu các bạn đọc bài về series của mình thì đây là link của các phần trước

    1. Đổi icon app trên điện thoại android

    Các bạn có thể lựa bất cứ 1 icon nào mà mình thích, lưu ý là chọn icon vuông nhé, vì nếu lựa icon hình dạng khác nó sẽ bị hiển thị sai trên điện thoại, các đổi icon cho app trên android rất đơn giản, chỉ việc vào theo đường link sau tên-app-của-bạn\android\app\src\main\res, trong đó bạn sẽ thấy 4 folder lần lượt là mipmap-hdpi, mipmap-xhdpi, mipmap-xxhdpi, mipmap-xxxhdpi, trong mỗi folder, bạn sẽ thấy 2 file png là ic_launcher_round.pngic_launcher.png, bạn chỉ việc xóa nó, và thay vào đó bằng icon bạn muốn và nhớ đổi lại tên y chang vậy là được. Đơn giản phải ko :3

    2. Chức năng battle trong app

    Nhận thấy việc người dùng chỉ có thể chọn đúng và sai với các phép toán đơn giản trong chức năng practice, việc đó sẽ nhanh chóng gây nhàm chán và khiến người dùng xóa app trong 30 giây sau khi sử dụng nên mình sẽ thêm vào cho nó 1 chức năng để tương tác thêm với người chơi khác, đó là chức năng battle.

    Chức năng này được mình triển khai khá đơn giản, đó là nhân đôi màn hình practice lên và xoay ngược 1 cái lại, vậy là 2 người có thể đối đầu trực tiếp với nhau, bên cạnh đó mình cũng áp dụng thêm 1 số luật như, ai được 10 điểm trước sẽ thắng, nếu ai trả lời sai sẽ bị trừ 1 điểm, đúng sẽ cộng 1 điểm, sau khi trả lời câu hỏi mới sẽ được tiếp tục. Đó là ý tưởng của mình, giờ bắt đầu thôi

    Đầu tiên chúng ta cần thêm 2 biến trong file route.js của trang practice Battle: 'Battle', Success: 'Success',

    Tiếp tục chúng ta tạo ra 2 màn hình là battle và success.

    //Battle.js
    import {observer} from 'mobx-react';
    import React, {useState, useEffect} from 'react';
    import {>

    Trong file battle.js này, chúng t dùng lại tầm các hàm đã có trong practice, tuy nhiên cũng custom lại để phù hợp với việc chơi 2 người. Chẳng hạn như, trong function pressAnswer, chúng ta sẽ thêm 1 parameter là player để biết là player nào sử dụng, và thêm vào đó điều kiện nếu đúng sẽ cộng 1, sai sẽ trừ 1, và ai đạt 10 trước giành chiến thắng.

    Ở phần giao diện của player1, mình đã dùng thuộc tính transform để xoay ngược sân chơi của player 1 lại 180%, vậy là 2 người chơi sẽ đối đầu nhau transform: [{rotate: '180deg'}],. Thêm vào đó, nếu bạn chú ý kỹ, sẽ thấy mình đã viết thêm 1 store là BattleStore.js, đây là code của nó

    import {observable, action, computed} from 'mobx';
    
    class BattleStore {
      @observable firstParameter = 0;
      @observable secondParameter = 0;
      @observable player1 = {
        point: 0,
      };
      @observable player2 = {
        point: 0,
      };
    
      @action setFirstParameter(item) {
        this.firstParameter = item;
      }
      @action setSecondParameter(item) {
        this.secondParameter = item;
      }
    
      @action setPoint(point, player) {
        this[`player${player}`].point = point;
      }
    
      @computed get FirstParameter() {
        return this.firstParameter;
      }
      @computed get SecondParameter() {
        return this.secondParameter;
      }
    
      randomNumber = (to, from) => {
        return Math.floor(Math.random() * from) + to;
      };
    
      calculateResult = () => {
        const isTrue = Math.floor(Math.random() * 4);
        if (isTrue === 0) {
          return this.firstParameter + this.secondParameter;
        }
        const isBigger = Math.floor(Math.random() * 4);
        let resultFalse = 0;
        if (isBigger === 0) {
          resultFalse =
            this.firstParameter +
            this.secondParameter +
            Math.floor(Math.random() * 2);
        } else {
          resultFalse =
            this.firstParameter +
            this.secondParameter -
            Math.floor(Math.random() * 2);
        }
        return resultFalse < 0 ? 0 : resultFalse;
      };
    }
    
    const battleStore = new BattleStore();
    export default battleStore;
    

    Trong mobx bạn hoàn toàn có thể khai là 1 object như mình làm với player1 = {point: 0}, tạm thời nó sẽ chỉ có property là point, sau này phát triển thêm sẽ có thêm các trường là name, rank, ... .

    1 lưu ý nhỏ với những bạn chưa biết về syntax này thì BattleStore[`player${player}`].point ( hoặc this[`player${player}`].point) tương đương với BattleStore.player1.point hoặc BattleStore.player2.point, tùy vào biến player mình nhập là 1 hoặc 2.

    Vầy là chúng ta đã thêm vào được chức năng battle, nhưng khoan, vẫn còn thiếu 1 thứ, đó là màn hình thông báo người chiến thắng nữa

    3. Màn hình success thông báo người chiến thắng

    Chúng ta sẽ thiết kế nó dựa trên màn hình failed, tuy nhiên, sẽ chỉ hiện tên người chiến thắng và nút chơi lại, vì vậy giao diện sẽ đơn giản hơn rất nhiều, dưới đây là code để mọi người cùng tham khảo:

    import React, {useState} from 'react';
    import {>

    Chúng ta sẽ cho hiện tên và thông báo người chiến thắng theo từng màu khác nhau.

    4. Tổng kể

    Vậy là xem như đã xong rồi, cùng chạy thử nào.

    Vào game

    Bấm nút play, chọn chế độ chơi

    Vào chế độ battle, xin lỗi nếu màu sắc của nó hiếp dâm thị giác của bạn

    Và khi có người chiến thắng

    Làm lại ván khác để xem ai giỏi hơn nào

    Bài viết của mình đến đây là đã hết, cảm ơn các bạn đã chịu khó đọc và hẹn gặp lại vào phần tiếp theo trong 1 ngày không xa.

    Bài viết trên do 1 bạn chia sẻ trên internet, chúng tôi tổng hợp và trích soạn. Cảm ơn bạn đã có những bài viết hay cho cộng cồng.

    CÓ THỂ BẠN QUAN TÂM

    Bài Viết Cùng Chuyên Mục

    XEM THÊM
    thumbnail

    Kubernetes bài 6 - Vận hành k8s Day-Two Operations và Quản trị bằng GitOps

    22.05.2026

    Khi cụm Kubernetes của bạn đã được bảo mật cấu hình, tối ưu tài nguyên và thiết lập tự phục hồi, câu hỏi đặt ra là làm sao để duy trì sự ổn định đó trong nhiều năm tiếp theo mà không bị phụ thuộc

    thumbnail

    Kubernetes bài 5 - bảo mật Cloud Native và chuẩn DevSecOps cho K8s

    22.05.2026

    Việc siết chặt an ninh (Hardening) không phải là cấu hình một vài thông số rồi bỏ đó, mà là một tư duy phòng thủ chiều sâu.

    thumbnail

    Kubernetes bài 4 - Tối ưu Resource Auto-Healing và Scale Zero-Downtime

    22.05.2026

    Bài viết này sẽ đi sâu vào các cơ chế ở tầng Kernel giúp hệ thống tự phục hồi, chống lại các đợt tấn công cạn kiệt tài nguyên và cập nhật phiên bản mới mà người dùng không hề hay biết.

    thumbnail

    Kubernetes bài 3 - Bảo mật cấu hình k8s và config Security trên Production

    22.05.2026

    Kubernetes giải quyết bài toán này bằng hai đối tượng chuyên biệt nhưng nếu không hiểu rõ bản chất bảo mật ở tầng dưới, bạn đang tự tay dâng toàn bộ chìa khóa hệ thống cho hacker.

    thumbnail

    Kubernetes bài 2 - Mạng lưới k8s và luồng Traffic ở Packet Level

    22.05.2026

    Pod không chỉ là một container: Rất nhiều người nhầm lẫn Pod 1-1 với Container. Thực chất, Pod là đơn vị triển khai nhỏ nhất, có thể chứa một hoặc nhiều container

    Mục lục bài viết