vito-Z80

Untitled

Dec 12th, 2018
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 6.54 KB | None | 0 0
  1. object Pool {
  2.  
  3.     private val tmp = List(10) {
  4.         Transmitter()
  5.     }
  6.  
  7.     val objects = List(40) {
  8.         when {
  9.             it < 10 -> Colored(Region.rndColorName(), Shell(), Direction.DOWN).also { it.isVisible = false }
  10.             it < 30 -> Arrow(Name.ARROW, Shell(), Direction.DOWN).also { it.isVisible = false }
  11.             else -> Bomb(Name.BOMB, Shell(), Direction.DOWN).also { it.isVisible = false }
  12.         }
  13.     }
  14.  
  15.     fun add(name: Name, shell: Shell, direction: Direction) {
  16.         for (id in tmp.indices) {
  17.             if (tmp[id].name == null) {
  18.                 tmp[id].name = name
  19.                 tmp[id].shell = shell
  20.                 tmp[id].direction = direction
  21.                 Transmitter.counter++
  22.                 break
  23.             }
  24.         }
  25.     }
  26.  
  27.     //  objects должен содержать только один класс, так как Colored,Arrow,Bomb в objects не имеют значения.
  28.     //  проход завершается если в tmp закончились объекты tmp[N].var == null
  29.     fun update() {
  30.         var tmpId = 0
  31.         for (id in objects.indices) {
  32.             if (Transmitter.counter == 0) {
  33.                 println(id)
  34.                 break
  35.             }
  36.             if (!objects[id].isVisible) {
  37.                 if (tmp[tmpId].name == null || tmpId >= tmp.size - 1) {
  38.                     clearTmp()
  39.                     return
  40.                 } else {
  41.                     objects[id].reuse(
  42.                             tmp[tmpId].name!!,
  43.                             tmp[tmpId].shell!!,
  44.                             tmp[tmpId].direction!!
  45.                     )
  46.                     tmpId++
  47.                     Transmitter.counter--
  48.                 }
  49.             }
  50.         }
  51.         clearTmp()
  52.     }
  53.  
  54.     //  проход завершается как будет найден последний объект из tmp в objects по имени
  55.     //  tmp постоянно прогоняется полностью
  56.     fun update2() {
  57.         for (id in objects.indices) {
  58.             if (Transmitter.counter == 0) {
  59.                 println(id)
  60.                 break
  61.             }
  62.             if (!objects[id].isVisible) {
  63.                 for (i in tmp.indices) {
  64.                     if (objects[id].name == tmp[i].name) {
  65.                         objects[id].reuse(
  66.                                 tmp[i].name!!,
  67.                                 tmp[i].shell!!,
  68.                                 tmp[i].direction!!
  69.                         )
  70.                         tmp[i].name = null
  71.                         tmp[i].shell = null
  72.                         tmp[i].direction = null
  73.                         Transmitter.counter--
  74.                         break
  75.                     }
  76.                 }
  77.             }
  78.         }
  79.         clearTmp()
  80.     }
  81.  
  82.     private fun clearTmp() {
  83.         for (id in tmp.indices) {
  84.             tmp[id].name = null
  85.             tmp[id].shell = null
  86.             tmp[id].direction = null
  87.         }
  88.         Transmitter.counter = 0
  89.     }
  90. }
  91.  
  92. class Transmitter {
  93.     var name: Name? = null
  94.     var shell: Shell? = null
  95.     var direction: Direction? = null
  96.  
  97.     companion object {
  98.         var counter = 0
  99.     }
  100. }
  101.  
  102. fun test() {
  103.  
  104.     Pool.add(Name.RED, Shell(), Direction.LEFT)
  105.     Pool.add(Name.ARROW, Shell(), Direction.MISSING)
  106.     Pool.add(Name.BOMB, Shell(), Direction.UP)
  107. //    Pool.update()   //  всего 3 прохода, так как нужное находится при первом name == null
  108.     Pool.update2()  //  30 проходов, так как BOMB встречается на позиции 30 в objects
  109.  
  110.     var isVisible = 0
  111.     for (o in Pool.objects) {
  112.         if (o.isVisible) isVisible++
  113.         println("ID = ${o.id}, Name: ${o.name}, ${o.isVisible}")
  114.     }
  115.     println("В пул добавлены $isVisible объекта")
  116. }
  117.  
  118. //------------------------------------------------------------------------------------------------------------------
  119. results:
  120. update()
  121. 3 прохода objects (первые 3 ячейки из objects )
  122. ID = 16, Name: RED, true
  123. ID = 17, Name: ARROW, true
  124. ID = 18, Name: BOMB, true
  125. ID = 19, Name: GREEN, false
  126. ID = 20, Name: RED, false
  127. ID = 21, Name: GREEN, false
  128. ID = 22, Name: BLUE, false
  129. ID = 23, Name: YELLOW, false
  130. ID = 24, Name: LIGHT_BLUE, false
  131. ID = 25, Name: LIGHT_BLUE, false
  132. ID = 26, Name: ARROW, false
  133. ID = 27, Name: ARROW, false
  134. ID = 28, Name: ARROW, false
  135. ID = 29, Name: ARROW, false
  136. ID = 30, Name: ARROW, false
  137. ID = 31, Name: ARROW, false
  138. ID = 32, Name: ARROW, false
  139. ID = 33, Name: ARROW, false
  140. ID = 34, Name: ARROW, false
  141. ID = 35, Name: ARROW, false
  142. ID = 36, Name: ARROW, false
  143. ID = 37, Name: ARROW, false
  144. ID = 38, Name: ARROW, false
  145. ID = 39, Name: ARROW, false
  146. ID = 40, Name: ARROW, false
  147. ID = 41, Name: ARROW, false
  148. ID = 42, Name: ARROW, false
  149. ID = 43, Name: ARROW, false
  150. ID = 44, Name: ARROW, false
  151. ID = 45, Name: ARROW, false
  152. ID = 46, Name: BOMB, false
  153. ID = 47, Name: BOMB, false
  154. ID = 48, Name: BOMB, false
  155. ID = 49, Name: BOMB, false
  156. ID = 50, Name: BOMB, false
  157. ID = 51, Name: BOMB, false
  158. ID = 52, Name: BOMB, false
  159. ID = 53, Name: BOMB, false
  160. ID = 54, Name: BOMB, false
  161. ID = 55, Name: BOMB, false
  162. В пул добавлены 3 объекта
  163.  
  164. update2()
  165. 31 проход objects (первый найденый: RED = 18, ARROW = 26, BOMB = 46 )
  166. ID = 16, Name: YELLOW, false
  167. ID = 17, Name: LIGHT_BLUE, false
  168. ID = 18, Name: RED, true
  169. ID = 19, Name: ORANGE, false
  170. ID = 20, Name: ORANGE, false
  171. ID = 21, Name: PURPLE, false
  172. ID = 22, Name: PURPLE, false
  173. ID = 23, Name: PURPLE, false
  174. ID = 24, Name: BLUE, false
  175. ID = 25, Name: ORANGE, false
  176. ID = 26, Name: ARROW, true
  177. ID = 27, Name: ARROW, false
  178. ID = 28, Name: ARROW, false
  179. ID = 29, Name: ARROW, false
  180. ID = 30, Name: ARROW, false
  181. ID = 31, Name: ARROW, false
  182. ID = 32, Name: ARROW, false
  183. ID = 33, Name: ARROW, false
  184. ID = 34, Name: ARROW, false
  185. ID = 35, Name: ARROW, false
  186. ID = 36, Name: ARROW, false
  187. ID = 37, Name: ARROW, false
  188. ID = 38, Name: ARROW, false
  189. ID = 39, Name: ARROW, false
  190. ID = 40, Name: ARROW, false
  191. ID = 41, Name: ARROW, false
  192. ID = 42, Name: ARROW, false
  193. ID = 43, Name: ARROW, false
  194. ID = 44, Name: ARROW, false
  195. ID = 45, Name: ARROW, false
  196. ID = 46, Name: BOMB, true
  197. ID = 47, Name: BOMB, false
  198. ID = 48, Name: BOMB, false
  199. ID = 49, Name: BOMB, false
  200. ID = 50, Name: BOMB, false
  201. ID = 51, Name: BOMB, false
  202. ID = 52, Name: BOMB, false
  203. ID = 53, Name: BOMB, false
  204. ID = 54, Name: BOMB, false
  205. ID = 55, Name: BOMB, false
  206. В пул добавлены 3 объекта
Advertisement
Add Comment
Please, Sign In to add comment