JavaRush /Блоги Java /Random-TG /Бахши "Бозиҳо" дар JavaRush: Назарияи муфид

Бахши "Бозиҳо" дар JavaRush: Назарияи муфид

Дар гурӯҳ нашр шудааст
Дар бахши "Бозиҳо" -и JavaRush шумо лоиҳаҳои ҷолибро барои навиштани бозиҳои маъмули компютерӣ хоҳед ёфт. Оё шумо мехоҳед versionи шахсии худро аз бозиҳои маъмули "2048", "Сапер", "Снак" ва дигар бозиҳо созед? Ин оддӣ аст. Мо навиштани бозиро ба раванди қадам ба қадам табдил додем. БобБарои санҷидани худ ҳамчун таҳиягари бозӣ, ба шумо лозим нест, ки барномасози пешрафта бошед, аммо ҳанӯз ҳам маҷмӯи муайяни донишҳои Java талаб карда мешавад. Дар ин ҷо шумо маълумоте хоҳед ёфт , ки ҳангоми навиштани бозиҳо муфид хоҳанд буд .

1. Мерос

Кор бо муҳаррики бозии JavaRush истифодаи меросро дар бар мегирад. Аммо агар шумо намедонед, ки ин чист? Аз як тараф, шумо бояд ин мавзӯъро фаҳмед: он дар сатҳи 11 омӯхта мешавад . Аз тарафи дигар, муҳаррик дидаву дониста хеле содда тарҳрезӣ шудааст, бинобар ин шумо метавонед бо дониши сатҳии мерос ба даст оред. Пас, мерос чист? Ба таври содда гуем, мерос ин муносибати байни ду синф аст. Яке аз онҳо волидайн ва дуюмӣ фарзанд (синфи вориси) мешавад. Дар ин ҳолат, синфи волидайн ҳатто намедонад, ки синфҳои наслӣ дорад. Онхое. аз мавҷудияти синфҳои меросхӯр ягон фоидаи махсус намебинад. Аммо мерос ба синфи насл бартариҳои зиёд медиҳад. Ва чизи асосӣ ин аст, ки ҳама тағирёбандаҳо ва усулҳои синфи волидайн дар синфи кӯдак пайдо мешаванд, гӯё рамзи синфи волидайн ба синфи кӯдак нусхабардорӣ шуда бошад. Ин комилан дуруст нест, аммо барои фаҳмиши соддакардашудаи мерос ин кор хоҳад кард. Инҳоянд чанд мисол барои беҳтар фаҳмидани мерос. Мисоли 1: соддатарин мерос.
public class Родитель {

}
Синфи Child аз синфи волидайн бо истифода аз калимаи калидии extends мерос мегирад .
public class Потомок extends Родитель {

}
Мисоли 2: Истифодаи тағирёбандаҳои синфи волидайн.
public class Родитель {

   public int age;
   public String name;
}
Синфи Child метавонад тағирёбандаҳои синну сол ва номи синфи волидайнро тавре истифода барад , ки гӯё онҳо дар он эълон шуда бошанд.
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(name+" "+age);
   }
}
Мисоли 3: Истифодаи усулҳои синфи волидайн.
public class Родитель {

   public int age;
   public String name;

   public getName() {
      return name;
   }
}
Синфи Child метавонад тағирёбандаҳо ва усулҳои синфи волидайнро тавре истифода барад , ки гӯё онҳо дар он эълон шуда бошанд. Дар ин мисол мо усули getName () -ро истифода мебарем .
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}
Синфи Descendant аз нуқтаи назари компилятор чунин аст :
public class Потомок extends Родитель {

   public int age; //  унаследованная переменная
   public String name; //  унаследованная переменная

   public getName() { //  унаследованный метод.
      return name;
  }
   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}

2. Бартарии усули

Баъзан ҳолатҳое ҳастанд, ки мо синфи Насли худро аз баъзе синфи хеле муфиди Волидон дар баробари ҳама тағирёбандаҳо ва усулҳо мерос гирифтаем, аммо баъзе усулҳо маҳз ҳамон тавре ки мо мехоҳем кор намекунанд. Ё умуман на ба тавре ки мо намехоҳем. Дар ин вазъият чӣ бояд кард? Мо метавонем усулеро, ки ба мо маъқул нест, бекор кунем. Ин хеле содда анҷом дода мешавад: дар синфи Descendant мо мо танҳо методеро бо ҳамон имзо (сарлавҳа) бо усули синфи Волидон эълон мекунем ва рамзи худро дар он менависем. Мисоли 1: Барқароркунии усул.
public class Родитель {

   public String name;

   public void setName (String nameNew) {
       name = nameNew;
  }

   public getName() {
      return name;
  }
}
Усули printInfo() ибораи "Луко, Не!!!"- ро чоп мекунад.
public class Потомок extends Родитель {

   public void setName (String nameNew) {
       name = nameNew + ",No!!!";
  }

   public void printInfo() {

      setName("Luke");
      System.out.println( getName());
   }
}
Синфи Descendant аз нуқтаи назари компилятор чунин аст :
public Потомок extends Родитель {

   public String name; //  унаследованная переменная

   public void setName (String nameNew) { //  Переопределенный метод взамен унаследованного

       name = nameNew + ", No!!!";
   }
   public getName() { //  унаследованный метод.

      return name;
   }
   public void printInfo() {

     setName("Luke");
     System.out.println(getName());
   }
}
Мисоли 2: ҷодуи каме мерос (ва бартарии усули).
public class Родитель {

   public getName() {
      return "Luke";
  }
   public void printInfo() {

     System.out.println(getName());
   }
}
public class Потомок extends Родитель {

   public getName() {
      return "I'm your father, Luke";
  }
}
Дар ин мисол: агар усул printInfo(аз синфи Parent) дар синфи Descendant бекор карда нашавад, вақте ки ин усул дар an objectи синфи Descendant даъват карда мешавад, усули он номида мешавад getName(), на getName()синфи Волӣ.
Родитель parent = new Родитель ();
parent.printnInfo();
Ин рамз навиштаҷоти "Луқо" -ро дар экран нишон медиҳад .
Потомок child = new Потомок ();
child.printnInfo();
Дар ин рамз навиштаҷоти "Ман падари ту Луқо ҳастам;" .
Синфи Descendant аз нуқтаи назари компилятор чунин аст :
public class Потомок extends Родитель {

   public getName() {
      return "I'm your father, Luke";
   }
   public void printInfo() {

     System.out.println(getName());
   }
}

3. Рӯйхатҳо

Агар шумо то ҳол бо Рӯйхатҳо вохӯрда бошед, ин ҷо як дастури зуд аст. Шумо метавонед маълумоти пурраро дар сатҳҳои 6-7 курси JavaRush пайдо кунед . Рӯйхатҳо бо массивҳо умумӣ доранд:
  • метавонад миқдори зиёди маълумотро дар намуди муайян нигоҳ дорад;
  • ба шумо имкон медиҳад, ки элементҳоро аз рӯи индекс/рақамашон дарёфт кунед;
  • индексҳои элементҳо аз 0 оғоз мешаванд.
Бартарии рӯйхатҳо: Баръакси массивҳо, рӯйхатҳо метавонанд андозаи динамикӣ тағйир диҳанд. Дарҳол пас аз эҷод, рӯйхат андозаи 0 дорад. Вақте ки шумо элементҳоро ба рӯйхат илова мекунед, андозаи он зиёд мешавад. Намунаи сохтани рӯйхат:
ArrayList<String> myList = new ArrayList<String>(); // создание нового списка типа ArrayList
Қимат дар қавсҳои кунҷӣ навъи маълумотест, ки рӯйхат метавонад захира кунад. Инҳоянд чанд усулҳои кор бо рӯйхат:
Кодекс Тавсифи мухтасари он, ки code чӣ кор мекунад
ArrayList<String> list = new ArrayList<String>(); Эҷоди рӯйхати нави сатрҳо
list.add("name"); Ба охири рӯйхат элемент илова кунед
list.add(0, "name"); Ба аввали рӯйхат элемент илова кунед
String name = list.get(5); Элементро аз рӯи индексаш гиред
list.set(5, "new name"); Элементро аз рӯи индексаш тағир диҳед
int count = list.size(); Шумораи элементҳоро дар рӯйхат гиред
list.remove(4); Элементро аз рӯйхат хориҷ кунед
Шумо метавонед дар бораи рӯйхатҳо аз ин мақолаҳо маълумоти бештар гиред:
  1. Синфи ArrayList
  2. ArrayList кории дар расмҳо
  3. Хориҷ кардани элемент аз ArrayList

4. Массивҳо

Матритса чист? Матритса як ҷадвали росткунҷаест, ки онро бо маълумот пур кардан мумкин аст. Ба ибораи дигар, он массиви дученака аст. Тавре ки шумо эҳтимол медонед, массивҳо дар Java an objectҳо мебошанд. Навъи стандартии массиви якченака intчунин менамояд:
int [] array = {12, 32, 43, 54, 15, 36, 67, 28};
Биёед инро ба таври визуалӣ тасаввур кунем:
0 1 2 3 4 5 6 7
12 32 43 54 15 36 67 28
Сатри боло суроғаҳои чашмакҳоро нишон медиҳад. Яъне, барои ба даст овардани рақами 67, шумо бояд ба элементи массив бо индекси 6 дастрасӣ пайдо кунед:
int number = array[6];
Дар ин ҷо ҳама чиз хеле оддӣ аст. Массиви дученака массив аз массивҳои якченака мебошад. Агар шумо бори аввал дар ин бора мешунавед, бас кунед ва онро дар сари худ тасаввур кунед. Массиви дученака чунин ба назар мерасад:
0 Массиви якченака Массиви якченака
1 Массиви якченака
2 Массиви якченака
3 Массиви якченака
4 Массиви якченака
5 Массиви якченака
6 Массиви якченака
7 Массиви якченака
Дар code:
int [][] matrix = {
{65, 99, 87, 90, 156, 75, 98, 78}, {76, 15, 76, 91, 66, 90, 15, 77}, {65, 96, 17, 25, 36, 75, 54, 78}, {59, 45, 68, 14, 57, 1, 9, 63}, {81, 74, 47, 52, 42, 785, 56, 96}, {66, 74, 58, 16, 98, 140, 55, 77}, {120, 99, 13, 90, 78, 98, 14, 78}, {20, 18, 74, 91, 96, 104, 105, 77} }
0 0 1 2 3 4 5 6 7
65 99 87 90 156 75 98 78
1 0 1 2 3 4 5 6 7
76 15 76 91 66 90 15 77
2 0 1 2 3 4 5 6 7
65 96 17 25 36 75 54 78
3 0 1 2 3 4 5 6 7
59 45 68 14 57 1 9 63
4 0 1 2 3 4 5 6 7
81 74 47 52 42 785 56 96
5 0 1 2 3 4 5 6 7
66 74 58 16 98 140 55 77
6 0 1 2 3 4 5 6 7
120 99 13 90 78 98 14 78
7 0 1 2 3 4 5 6 7
20 18 74 91 96 104 105 77
Барои ба даст овардани арзиши 47, шумо бояд ба унсури матритса дар [4][2] дастрасӣ пайдо кунед.
int number = matrix[4][2];
Агар шумо мушоҳида кунед, координатҳои матритса аз системаи координатаҳои росткунҷаи классикӣ (системаи координатаҳои декартӣ) фарқ мекунанд. Ҳангоми дастрасӣ ба матритса шумо аввал y ва баъд x -ро нишон медиҳед , дар ҳоле ки дар математика аввал x(x, y)-ро муайян кардан маъмул аст. Шояд шумо аз худ бипурсед: "Чаро матритсаро дар тасаввуроти худ баргардонед ва ба унсурҳо ба таври муқаррарӣ тавассути (x, y) дастрасӣ пайдо накунед? Ин мундариҷаи матритсаро тағир намедиҳад." Бале, ҳеҷ чиз тағир намеёбад. Аммо дар ҷаҳони барномасозӣ ба матритсаҳо дар шакли “аввал y, баъд x” истинод кардан одат шудааст. Инро як чизи муқаррарӣ қабул кардан лозим аст. Акнун биёед дар бораи тарҳрезии матритса ба муҳаррики мо (синф Game) сӯҳбат кунем. Тавре ки шумо медонед, муҳаррик дорои усулҳои зиёде мебошад, ки ҳуҷайраҳои майдони бозиро дар координатҳои додашуда тағир медиҳанд. Масалан, setCellValue(int x, int y, String value). Он ячейкаи муайянро бо координатҳо (x, y) ба арзиши муқаррар мекунад value. Тавре ки шумо пай бурдед, ин усул аввал маҳз x-ро мегирад, мисли системаи координатаҳои классикӣ. Усулҳои боқимондаи муҳаррик низ ҳамин тавр кор мекунанд. Ҳангоми таҳияи бозиҳо, аксар вақт зарурати таҷдиди ҳолати матритса дар экран пайдо мешавад. Инро чй тавр бояд кард? Аввалан, дар як давр шумо бояд тамоми унсурҳои матритсаро такрор кунед. Дуюм, барои ҳар яки онҳо, усулеро даъват кунед, ки бо координатҳои INVERTED намоиш дода шавад. Мисол:
private void drawScene() {
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) {
            setCellValue(j, i, String.valueOf(matrix[i][j]));
        }
    }
}
Табиист, ки инversion дар ду самт кор мекунад. setCellValueШумо метавонед (i, j) -ро ба усули гузаронед, аммо дар айни замон элементи [j][i]-ро аз матритса гиред. Инversion метавонад каме душвор ба назар расад, аммо он чизест, ки бояд дар хотир дошт. Ва ҳамеша, агар ягон мушкилот ба миён ояд, он меарзад, ки як пораи коғазро бо қалам гирифта, матритсаро кашед ва дубора тавлид кунед, ки чӣ гуна равандҳо бо он рӯй медиҳанд.

5. Рақамҳои тасодуфӣ

Бо генератори рақамҳои тасодуфӣ чӣ гуна бояд кор кард? Синф Gameметодро муайян мекунад getRandomNumber(int). Дар зери сарпӯш, он синфро Randomаз бастаи java.util истифода мебарад, аммо ин принсипи кор бо генератори рақамҳои тасодуфиро тағир намедиҳад. getRandomNumber(int)Як ададро ҳамчун аргумент мегирад. Ин рақам сарҳади болоӣ хоҳад буд, ки генератор метавонад баргардад. Ҳадди поёнӣ 0 аст. Муҳим! Генератор ҳеҷ гоҳ рақами сарҳади болоро барнамегардонад. Масалан, агар getRandomNumber(3)ба таври тасодуфӣ даъват карда шавад, он метавонад 0, 1, 2-ро баргардонад. Тавре ки шумо мебинед, он наметавонад 3-ро баргардонад. Ин истифодаи генератор хеле содда аст, аммо дар бисёр ҳолатҳо хеле самаранок аст. Шумо бояд рақами тасодуфиро дар доираи баъзе маҳдудиятҳо ба даст оред: Тасаввур кунед, ки ба шумо рақами се-рақама лозим аст (100..999). Тавре ки шумо аллакай медонед, рақами ҳадди ақали баргардонидашуда 0 аст. Ҳамин тавр, шумо бояд ба он 100 илова кунед, аммо дар ин ҳолат шумо бояд эҳтиёт шавед, ки аз ҳадди болоӣ зиёд нашавед. Барои ба даст овардани 999 ҳамчун арзиши максималии тасодуфӣ, шумо бояд усулро getRandomNumber(int)бо аргументи 1000 даъват кунед. Аммо мо дар бораи иловаи минбаъдаи 100 дар хотир дорем: ин маънои онро дорад, ки ҳудуди болоӣ бояд 100 паст карда шавад. Яъне, рамзи ба даст овардани як рақами тасодуфии се рақам чунин хоҳад буд:
int number = 100 + getRandomNumber(900);
Аммо барои содда кардани чунин тартиб, муҳаррик усулеро пешниҳод мекунад getRandomNumber(int, int), ки шумораи ҳадди ақалро ҳамчун далели аввал бармегардонад. Бо истифода аз ин усул, мисоли қаблиро метавон дубора навишт:
int number = getRandomNumber(100, 1000);
Рақамҳои тасодуфиро барои ба даст овардани элементи массиви тасодуфӣ истифода бурдан мумкин аст:
String [] names = {"Andrey", "Валентин", "Сергей"};
String randomName = names[getRandomNumber(names.length)]
Оғози рӯйдодҳои муайян бо эҳтимолияти муайян. Субҳи шахс аз рӯи сенарияҳои имконпазир оғоз меёбад: Аз хоб рафтан - 50%; сари вақт аз хоб хестан - 40%; Як соат пештар аз интизорӣ бархост - 10%. Тасаввур кунед, ки шумо эмулятори субҳи инсониро менависед. Шумо бояд рӯйдодҳоро бо эҳтимолияти муайян оғоз кунед. Барои ин, боз, шумо бояд генератори рақамҳои тасодуфиро истифода баред. Амалиётҳо метавонанд гуногун бошанд, аммо соддатаринаш бояд алгоритми зеринро риоя кунад:
  1. мо маҳдудиятҳоеро муқаррар мекунем, ки дар доираи он рақам бояд тавлид шавад;
  2. тавлиди рақами тасодуфӣ;
  3. Мо рақами натиҷаро коркард мекунем.
Ҳамин тавр, дар ин ҳолат, маҳдудият 10 хоҳад буд. Биёед усулро даъват кунем getRandomNumber(10)ва таҳлил кунем, ки он ба мо чӣ бармегардад. Он метавонад 10 рақамро (аз 0 то 9) баргардонад ва ҳар як бо эҳтимолияти якхела - 10%. Ҳоло мо бояд ҳамаи натиҷаҳои имконпазирро якҷоя кунем ва онҳоро бо рӯйдодҳои имконпазири худ мувофиқ созем. Вобаста ба тасаввуроти шумо метавонад бисёр комбинатсияҳо бошад, аммо садоҳои равшантар: «Агар рақами тасодуфӣ дар дохor [0..4] ҷойгир бошад - ба ҳодисаи «Безор хобида» занг занед, агар рақам дар дохor [5..8 бошад». ] - "Дар вақташ бедор шавед" ва танҳо агар рақам 9 бошад, пас "ман як соат пештар аз интизорӣ хестам". Ҳама чиз хеле содда аст: дар дохor [0..4] 5 адад мавҷуд аст, ки ҳар яки онҳо метавонанд бо эҳтимолияти 10% баргарданд, ки дар маҷмӯъ 50% хоҳад буд; дар дохor [5..8] 4 адад вуҷуд дорад ва 9 ягона рақамест, ки бо эҳтимолияти 10% пайдо мешавад. Дар code, ин тарҳи оқилона боз ҳам соддатар менамояд:
int randomNumber = getRandomNumber(10);
if (randomNumber < 5) {
    System.out.println("Проспал ");
} else if (randomNumber < 9) {
    System.out.println("Встал вовремя ");
} else {
    System.out.println("Встал на час раньше положенного ");
}
Умуман, барои истифодаи рақамҳои тасодуфӣ имконоти зиёде мавҷуданд. Ҳама чиз танҳо ба тасаввуроти шумо вобаста аст. Аммо онҳо самараноктар истифода мешаванд, агар ба шумо лозим ояд, ки ягон натиҷаро такроран ба даст оред. Он гоҳ ин натиҷа аз пештара фарқ мекунад. Бо баъзе эҳтимолият, албатта. Ҳамааш ҳамин! Агар шумо хоҳед, ки дар бораи бахши Бозиҳо маълумоти бештар гиред, дар ин ҷо ҳуҷҷатҳои муфиде ҳастанд, ки метавонанд кӯмак расонанд:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION