Saya sedang dalam proses membuat fitur Level UP & XP untuk proyek Android Studio.

Konteks:

Membuat Database dengan kolom Total XP (diperbarui saat aplikasi dibuka)

Kolom level diperbarui saat aplikasi dibuka

Yang harus saya lakukan:

GetTotalXP dari database dan periksa apakah memenuhi kriteria untuk naik level. Update database dengan level berdasarkan kriteria.

Contoh:

Tingkat 0: XP <100

Tingkat 1: 100 <= XP < 199

Tingkat 2: 200 <= XP <299

Dll..

Anda mendapatkan idenya. Untungnya, jumlah XP yang dibutuhkan tidak berubah saat Anda naik level. Namun ini akan menjadi fitur bonus tambahan jika seseorang dapat menjelaskan bagaimana saya akan melakukannya.

Saya awalnya telah membuat hardcode metode saya sehingga saya mendapatkan gambaran umum tentang apa yang saya inginkan. Saya baru mengenal pemrograman dan memahami bahwa logika saya cacat di bawah ini:

 public int updateLocalLevel() {

    int currentLevel = Integer.parseInt(returnDBLevel());
    int currentTotalXP = Integer.parseInt(returnDBTotalXP());

    if(currentTotalXP < 100) {
        //still level 0
        //do nothing
    }
    else if(currentTotalXP >= 100 & currentTotalXP < 199) {
        //level up to level 1
        //get db level
        //add 1 to level
        currentLevel++;            
    }
    else if(currentTotalXP >= 200 & currentTotalXP < 299) {
        //level up to level 2
        //get db level
        //add 1 to level
        currentLevel++;
        //update local level            
    }
    else if(currentTotalXP >= 300 & currentTotalXP < 399) {
        //level up to level 3
        //get db level
        //add 1 to level
        currentLevel++;
        //update local level            
    }
    else if(currentTotalXP >= 400 & currentTotalXP < 499) {
        //level up to level 4
        //get db level
        //add 1 to level
        currentLevel++;
        //update local level            
    }
    else if(currentTotalXP >= 500 & currentTotalXP < 599) {
        //level up to level 5
        //get db level
        //add 1 to level
        currentLevel++;
        //update local level
    }
    else{
        android.util.Log.d(TAG, "ReachedMaxLevel: " + returnDBLevel());

    }
    return currentLevel;
}

Saya bertujuan untuk menggunakan dua metode: updateLocalLevel() dan updateDBLevel() Metode di atas memperbarui level secara lokal sebelum diteruskan ke metode updateDBLevel() {belum dibuat sampai sekarang}.

Masalahnya adalah terlalu banyak pernyataan if dan else if. Saya ingin levelnya tidak terbatas dan oleh karena itu saya perlu mengubah metode ini sepenuhnya. Saya tidak yakin bagaimana melakukan ini. Terimakasih banyak.

0
Jungle Is Massive 15 Januari 2021, 20:06

3 jawaban

Jawaban Terbaik

Jika Anda ingin membuat setiap level mengambil jumlah XP yang sama maka saya sarankan hanya membagi XP dengan kebutuhan XP. Jika Anda memiliki exp sebagai int maka itu akan selalu dibulatkan ke bawah.

public int CalculateLevel(int xp){
  int xpPerLevel = 100;
  return xp/xpPerLevel;
}

Jika Anda ingin persyaratan EX yang berbeda per level, coba

public int CalculateLevel(int xp){
  int[] xpPerLevel = {100,200,500,1000,2000,5000};
  int level = 0;
  for(int i: xpPerLevel ){
    if( xp / i > 0){
      level++;
    }
    else break;
  }
  return level;
}

EDIT:

Ini mungkin akan lebih baik:

public int CalculateLevel(int xp){
    int[] xpPerLevel = {100,200,500,1000,2000,5000};
    int level = 0;
    for(int i: xpPerLevel ){
        if( xp >= i){
            level++;
        }
        else break;
    }
    return level;
}

EDIT 2: Mungkin Anda ingin melakukan sesuatu untuk setiap level dan bukan hanya menghitung level. Maka saya sarankan pertama menghitung level dengan fungsi di sana dan kemudian meletakkan hasilnya melalui metode seperti ini:

public void EvaluateLevel(int level){
    switch(level){
        case 4:
            //do stuff for level 4
        case 3:
            //do stuff for level 3
        case 2:
            //do stuff for level 2
        case 1:
            //do stuff for level 1
        case 0:
            //do stuff for level 0
    }
}

Sekedar mengingatkan, jika di switch Anda tidak menggunakan break; pada dan dari setiap blok kasus maka semua blok kasus di bawah ini juga dijalankan. Jika Anda tidak ingin efek level menumpuk satu sama lain, gunakan break; setelah setiap blok.

0
David Brož 15 Januari 2021, 17:52

Melihat kode Anda dan kasus yang Anda ekspos, saya kira Anda dapat membuat kode Anda lebih efisien dengan 2 kondisi:

Jika xp Anda saat ini kurang dari 100 atau lebih tinggi 599 Anda tidak menambah variabel

Atau jika xp Anda saat ini diakhiri dengan X99, Anda dapat menambahkan variabel seperti ini:

public static int updateLocalLevel(String cLevel, String cXp) {

    int currentLevel = Integer.parseInt(cLevel);
    int currentTotalXP = Integer.parseInt(cXp);

    if(currentTotalXP < 100 || currentTotalXP > 599) {
        System.out.println("Level less than 100 or max level reached");
    }
    else if(String.valueOf(currentTotalXP).endsWith("99")) {
        currentLevel++;
        System.out.println("Level ends with x99 -> Level should be incremented ");
    }

    return currentLevel;
}

Jika Anda ingin menambahkan lebih banyak level, Anda hanya perlu mengubah nilai tinggi 599 di if pertama.

0
Juanjo Berenguer 15 Januari 2021, 17:54

Anda terlalu memikirkan seluruh proses ini. Level baru Anda tidak tergantung pada level Anda saat ini tetapi hanya pada jumlah XP saat ini. Oleh karena itu, Anda memerlukan metode yang mengambil total XP dan menghitung level darinya. Melihat kode Anda, Anda bermaksud agar level terdistribusi secara linier. Untuk setiap 100 XP, levelnya harus meningkat 1. Logika ini dapat dicapai dengan cuplikan singkat ini:

public int getLevel(int totalXp) {
    return totalXp / 100;
}

Untuk mengintegrasikan metode ini dalam seluruh konteks, Anda dapat menggunakan sesuatu di sepanjang baris...

int totalXP = Integer.parseInt(returnDBTotalXP());
int newLevel = getLevel(totalXP);
updateDBLevel(newLevel);

Dengan kode berikut, Anda dapat dengan mudah menguji pada XP tingkat baru yang dicapai (berguna untuk pengujian):

int maxInt = 800;
int currentLevel = -1;
for (int xp = 0; xp <= maxInt; xp++) {
    int newLevel = getLevel(xp);
    if (currentLevel != newLevel) {
        System.out.println(xp + " => " + newLevel);
        currentLevel = newLevel;
    }
}

Keluaran:

0 => 0
100 => 1
200 => 2
300 => 3
400 => 4
500 => 5
600 => 6
700 => 7
800 => 8
0
Matt 15 Januari 2021, 18:04