Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import sys
- import time
- import random
- class Animals:
- def __init__(self, k, sm, sw, g, l, o): # k - вид, sm - символ об-ий самца, sw - символ об-ий самку, l - срок жизни, o - отряд
- self.kind = k # название вида
- self.symbol = [sm, sw] # обозночение ['самец', 'самка']
- self.gender = g # пол 0 - мужской, 1 женский
- self.lifetime = l # срок жизни
- self.order = o # отряд 1 - плотоядные, 2 - травоядные
- animals = []
- animals.append(Animals('Зайцы', 'З', 'з', 0, 8, 2))
- animals.append(Animals('Волки', 'В', 'в', 0, 15, 1))
- animals.append(Animals('Медведи', 'М', 'м', 0, 40, 1))
- animals.append(Animals('Лоси', 'Л', 'л', 0, 15, 2))
- def clear():
- try:
- os.system('cls')
- except:
- os.system('clear')
- def outputm():
- mp = []
- for i in range(1, 25):
- s =''
- for j in range(1, 80):
- if (m[i][j] == ' '):
- s += m[i][j]
- else:
- s += m[i][j].symbol[m[i][j].gender]
- mp.append(s)
- clear()
- 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 год' % (
- 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],
- mp[15], mp[16], mp[17], mp[18], mp[19], mp[20], mp[21], mp[22], mp[23], year), end='')
- def kindofsymbol(s): # определение вида по символу
- kind = -1
- for i in range(len(animals)):
- if ((animals[i].symbol[0] == s)or(animals[i].symbol[1] == s)):
- kind = i
- return kind
- def firstgeneration(): # ввод первого поколения
- clear()
- print('Как будете расставлять первых животных?\n 1 - расставил их в файле firstgeneration.txt\n 2 - расставить случайно')
- o = int(input('введите ответ (1/2): '))
- if (o == 1)and(os.path.isfile(os.path.join(sys.path[0],'firstgeneration.txt'))):
- f = open(os.path.join(sys.path[0],'firstgeneration.txt'), 'r')
- i = -1
- for line in f:
- i += 1
- for j in range(79):
- k = kindofsymbol(line[j])
- if (line[j] != ' ')and(line[j] != '')and(k > -1):
- 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)
- m[i+1][j+1].gender = 0 if (line[j] == m[i+1][j+1].symbol[0]) else 1
- if (i == 23):
- break
- f.close()
- elif (o == 1):
- input('файл firstgeneration.txt не найден,\n положение первых живых клеток будет расставленно случайно')
- o = 2
- if (o == 2):
- for i in range(1, 25):
- for j in range(1, 80):
- r = random.choice(['З', 'з', ' ', ' ', 'В', 'в', ' ', ' ', 'М', 'м', ' ', ' ', 'Л', 'л', ' ', ' '])
- if (r != ' ')and(kindofsymbol(r) > -1):
- k = kindofsymbol(r)
- m[i][j] = Animals(animals[k].kind, animals[k].symbol[0], animals[k].symbol[1], animals[k].gender, animals[k].lifetime, animals[k].order)
- m[i][j].gender = 0 if (r == m[i][j].symbol[0]) else 1
- clear()
- global t
- t = int(input('\n сколько лет дадите на существование жизни в этом "лесу"?\n (1 год = 1 "поколение" = 1 итерация = 1 секунда вашего времени)\n ' ))
- input('\n игра прекратится, если не будет изменений в течение 10 "поколений",'
- '\n или после окончания отведенного вами времени (%d с)' % t)
- def nextgeneration():
- memliven = [] # адреса клеток которые нужно оживить
- memlivenv = [] # вид который нужно добавить
- memkill = [] # адреса клеток которые нужно убить
- for i in range(1, 25):
- for j in range(1, 80):
- if (m[i][j] != ' '):
- m[i][j].lifetime -= 1 # увеличить возраст животного
- for v in range(4): # 0 1 2 3 - проход по видам
- if (m[i][j] == ' ')and(klc(i, j, v) == 3): # условие размножения одного вида
- memliven.append(i)
- memliven.append(j)
- memlivenv.append(Animals(animals[v].kind, animals[v].symbol[0], animals[v].symbol[1], animals[v].gender, animals[v].lifetime, animals[v].order))
- memlivenv[len(memlivenv)-1].gender = random.choice([0, 1])
- memlivenv.append(' ')
- break
- 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 ( # условие смерти от перенаселения или одиночества одного вида
- (m[i][j] != ' ')and(m[i][j].order == 2)and(nearpredator(i, j) > 0)) or ( # плотоядный съедает травоядного
- (m[i][j] != ' ')and(m[i][j].lifetime == 0)): # смерть от старости
- memkill.append(i)
- memkill.append(j)
- break
- global yearb
- if (memliven == [])and(memkill == []):
- yearb += 1
- else:
- yearb = 0
- for i in range(0, len(memliven), 2):
- m[memliven[i]][memliven[i+1]] = memlivenv[i]
- for i in range(0, len(memkill), 2):
- m[memkill[i]][memkill[i+1]] = ' '
- def klc(i, j, v): # подсчет количества соседних животных того же вида
- km = 0 # кол-во самцов
- kw = 0 # кол-во самок того же вида
- k = 0 # количество соседних животных того же вида
- for a in [-1, 0, 1]:
- for b in [-1, 0, 1]:
- if (m[i+a][j+b] != ' '):
- 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
- 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
- if (m[i][j] == ' ')and(km > 0)and(kw > 0):
- k = km + kw
- if (m[i][j] != ' ')and(m[i][j].kind == animals[v].kind):
- k = km + kw
- return k
- def nearpredator(i, j): # проверка есть ли рядом хищник
- k = 0
- for a in [-1, 0, 1]:
- for b in [-1, 0, 1]:
- if (m[i+a][j+b] != ' '):
- k += 1 if ((m[i+a][j+b].order == 1)and([i+a, j+b] != [i, j])) else 0
- return k
- m = [[], []] # пустое поле
- m = [[' ' for j in range(81)] for i in range(26)]
- year = 0 # какой год
- yearb = 0 # какой год идет без движения
- firstgeneration()
- outputm()
- input()
- while (t > year)and(yearb < 10):
- year += 1
- nextgeneration()
- outputm()
- time.sleep(1)
- input()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement