Advertisement
Guest User

1

a guest
Apr 29th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.30 KB | None | 0 0
  1. import os
  2. import sys
  3. import time
  4. import random
  5.  
  6. class Animals:
  7.     def __init__(self, k, sm, sw, g, l, o): # k - вид, sm - символ об-ий самца, sw - символ об-ий самку, l - срок жизни, o - отряд
  8.         self.kind = k # название вида
  9.         self.symbol = [sm, sw] # обозночение ['самец', 'самка']
  10.         self.gender = g # пол 0 - мужской, 1 женский
  11.         self.lifetime = l # срок жизни
  12.         self.order = o # отряд 1 - плотоядные, 2 - травоядные
  13. animals = []
  14. animals.append(Animals('Зайцы', 'З', 'з', 0, 8, 2))
  15. animals.append(Animals('Волки', 'В', 'в', 0, 15, 1))
  16. animals.append(Animals('Медведи', 'М', 'м', 0, 40, 1))
  17. animals.append(Animals('Лоси', 'Л', 'л', 0, 15, 2))
  18.  
  19. def clear():
  20.     try:
  21.         os.system('cls')
  22.     except:
  23.         os.system('clear')
  24.  
  25. def outputm():
  26.     mp = []
  27.     for i in range(1, 25):
  28.         s =''
  29.         for j in range(1, 80):
  30.             if (m[i][j] == ' '):
  31.                 s += m[i][j]
  32.             else:
  33.                 s += m[i][j].symbol[m[i][j].gender]
  34.         mp.append(s)
  35.     clear()
  36.     print('%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n %s год' % (
  37.     mp[0], mp[1], mp[2], mp[3], mp[4], mp[5], mp[6], mp[7], mp[8], mp[9], mp[10], mp[11], mp[12], mp[13], mp[14],
  38.     mp[15], mp[16], mp[17], mp[18], mp[19], mp[20], mp[21], mp[22], mp[23], year), end='')
  39.  
  40. def kindofsymbol(s): # определение вида по символу
  41.     kind = -1
  42.     for i in range(len(animals)):
  43.         if ((animals[i].symbol[0] == s)or(animals[i].symbol[1] == s)):
  44.             kind = i
  45.     return kind
  46.  
  47. def firstgeneration(): # ввод первого поколения
  48.     clear()
  49.     print('Как будете расставлять первых животных?\n 1 - расставил их в файле firstgeneration.txt\n 2 - расставить случайно')
  50.     o = int(input('введите ответ (1/2): '))
  51.     if (o == 1)and(os.path.isfile(os.path.join(sys.path[0],'firstgeneration.txt'))):
  52.         f = open(os.path.join(sys.path[0],'firstgeneration.txt'), 'r')
  53.         i = -1
  54.         for line in f:
  55.             i += 1
  56.             for j in range(79):
  57.                 k = kindofsymbol(line[j])
  58.                 if (line[j] != ' ')and(line[j] != '')and(k > -1):
  59.                     m[i+1][j+1] = Animals(animals[k].kind,animals[k].symbol[0], animals[k].symbol[1], animals[k].gender, animals[k].lifetime, animals[k].order)
  60.                     m[i+1][j+1].gender = 0 if (line[j] == m[i+1][j+1].symbol[0]) else 1
  61.             if (i == 23):
  62.                 break
  63.         f.close()
  64.     elif (o == 1):
  65.         input('файл firstgeneration.txt не найден,\n положение первых живых клеток будет расставленно случайно')
  66.         o = 2
  67.     if (o == 2):
  68.         for i in range(1, 25):
  69.             for j in range(1, 80):
  70.                 r = random.choice(['З', 'з', ' ', ' ', 'В', 'в', ' ', ' ', 'М', 'м', ' ', ' ', 'Л', 'л', ' ', ' '])
  71.                 if (r != ' ')and(kindofsymbol(r) > -1):
  72.                     k = kindofsymbol(r)
  73.                     m[i][j] = Animals(animals[k].kind, animals[k].symbol[0], animals[k].symbol[1], animals[k].gender, animals[k].lifetime, animals[k].order)
  74.                     m[i][j].gender = 0 if (r == m[i][j].symbol[0]) else 1
  75.     clear()
  76.     global t
  77.     t = int(input('\n сколько лет дадите на существование жизни в этом "лесу"?\n  (1 год = 1 "поколение" = 1 итерация = 1 секунда вашего времени)\n ' ))
  78.     input('\n игра прекратится, если не будет изменений в течение 10 "поколений",'
  79.           '\n или после окончания отведенного вами времени (%d с)' % t)
  80.  
  81. def nextgeneration():
  82.     memliven = [] # адреса клеток которые нужно оживить
  83.     memlivenv = [] # вид который нужно добавить
  84.     memkill = [] # адреса клеток которые нужно убить
  85.     for i in range(1, 25):
  86.         for j in range(1, 80):
  87.             if (m[i][j] != ' '):
  88.                 m[i][j].lifetime -= 1 # увеличить возраст животного
  89.             for v in range(4): # 0 1 2 3 - проход по видам
  90.                 if (m[i][j] == ' ')and(klc(i, j, v) == 3): # условие размножения одного вида
  91.                     memliven.append(i)
  92.                     memliven.append(j)
  93.                     memlivenv.append(Animals(animals[v].kind, animals[v].symbol[0], animals[v].symbol[1], animals[v].gender, animals[v].lifetime, animals[v].order))
  94.                     memlivenv[len(memlivenv)-1].gender = random.choice([0, 1])
  95.                     memlivenv.append(' ')
  96.                     break
  97.                 elif ((m[i][j] != ' ')and(m[i][j].kind == animals[v].kind)and((klc(i, j, v) != 2)and(klc(i, j, v) != 3))) or ( # условие смерти от перенаселения или одиночества одного вида
  98.                 (m[i][j] != ' ')and(m[i][j].order == 2)and(nearpredator(i, j) > 0)) or ( # плотоядный съедает травоядного
  99.                 (m[i][j] != ' ')and(m[i][j].lifetime == 0)):  # смерть от старости
  100.                     memkill.append(i)
  101.                     memkill.append(j)
  102.                     break
  103.     global yearb
  104.     if (memliven == [])and(memkill == []):
  105.         yearb += 1
  106.     else:
  107.         yearb = 0
  108.         for i in range(0, len(memliven), 2):
  109.             m[memliven[i]][memliven[i+1]] = memlivenv[i]
  110.         for i in range(0, len(memkill), 2):
  111.             m[memkill[i]][memkill[i+1]] = ' '
  112.  
  113. def klc(i, j, v): # подсчет количества соседних животных того же вида
  114.     km = 0 # кол-во самцов
  115.     kw = 0 # кол-во самок того же вида
  116.     k = 0 # количество соседних животных того же вида
  117.     for a in [-1, 0, 1]:
  118.         for b in [-1, 0, 1]:
  119.             if (m[i+a][j+b] != ' '):
  120.                 km += 1 if ((m[i+a][j+b].kind == animals[v].kind)and(m[i+a][j+b].gender == 0)and([i+a, j+b] != [i, j])) else 0
  121.                 kw += 1 if ((m[i+a][j+b].kind == animals[v].kind)and(m[i+a][j+b].gender == 1)and([i+a, j+b] != [i, j])) else 0
  122.     if (m[i][j] == ' ')and(km > 0)and(kw > 0):
  123.         k = km + kw
  124.     if (m[i][j] != ' ')and(m[i][j].kind == animals[v].kind):
  125.         k = km + kw
  126.     return k
  127.  
  128. def nearpredator(i, j): # проверка есть ли рядом хищник
  129.     k = 0
  130.     for a in [-1, 0, 1]:
  131.         for b in [-1, 0, 1]:
  132.             if (m[i+a][j+b] != ' '):
  133.                 k += 1 if ((m[i+a][j+b].order == 1)and([i+a, j+b] != [i, j])) else 0
  134.     return k
  135.  
  136. m = [[], []] # пустое поле
  137. m = [[' ' for j in range(81)] for i in range(26)]
  138.  
  139. year = 0 # какой год
  140. yearb = 0 # какой год идет без движения
  141. firstgeneration()
  142. outputm()
  143. input()
  144. while (t > year)and(yearb < 10):
  145.     year += 1
  146.     nextgeneration()
  147.     outputm()
  148.     time.sleep(1)
  149. input()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement