-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrfc.html
More file actions
97 lines (95 loc) · 7.32 KB
/
rfc.html
File metadata and controls
97 lines (95 loc) · 7.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Request For Comments</title>
<style>
a {
color: #000000;
}
</style>
</head>
<body>
<div class="rfc" id="0001">
<h3><a href="#0001">RFC #0001 - Стиль кода</a></h3>
Функции и переменные называются в стиле lowerCamelCase.<br>
Классы называются в стиле UpperCamelCase.<br>
Глобальные константы называются КАПСЛОКОМ_ЧЕРЕЗ_ПОДЧЁРКИВАНИЕ.<br>
Функции-геттеры называются getSmth()<br>
Функции-сеттеры называются setSmth()<br>
Мы не используем венгерскую нотацию, т. е. имя переменной не содержит указания на её тип.<br>
Заголовочные файлы имеют расширение .hpp, а не .h<br>
В заголовочных файлах используем include-guard, а не pragma once, т.е. пишем так:<br>
#ifndef SOMEFILE_HPP<br>
#define SOMEFILE_HPP<br>
// Code<br>
#endif<br>
В заголовочных файлах не пишем #include'ов, если необходимо использовать название класса пишем<br>
class Smth;<br>
в начале кода.<br>
private-часть объявляем в явном виде.<br>
Если необходимо использовать cin, cout etc пишем using namespace std;<br>
private, public и protected пишем без отступа от слова class.<br>
Фигурные скобочки ставим так:<br>
if (...) {<br>
...<br>
} else {<br>
...<br>
}<br>
Табуляцию делаем 4 пробелами (это не лучший вариант, но правильный мы сейчас не потянем), на конце файла должна стоять новая строка. Конец строки, если это настраивается в редакторе, делаем в Unix-style (LF а не CRLF).<br>
Множественные константы (типа side) делаем с помощью enum class'ов, именуя сам enum class и его элементы как классы:<br>
enum class Side { Left, Right, Back, Forward, Random };<br>
Непосредственно enum не используем никогда.<br>
В прототипе функции пишем только название типа аргумента, т. е.:<br>
void setWeight(int)<br>
Всегда явно указываем this->, даже когда это не необходимо.<br>
</div>
<div class="rfc" id="0002">
<h3><a href="#0002">RFC #0002 - класс Command</a></h3>
В конструкторе принимает Interpreter*.<br>
Класс Command содержит метод act(), который принимает в качестве аргумента только указатель на бактерию, флаг isPseudo, который показывает является ли действия завершающим ход.<br>
</div>
<div class="rfc" id="0003">
<h3><a href="#0003">RFC #0003 - enum class Side</a></h3>
В файле bactery.hpp содержится<br>
enum class Side { Left, Right, Back, Forward, Random };<br>
Его следует использовать для любых "сторон". Side::Random не должен быть состоянием объекта, т. е. когда чему-либо присваивается SideRandom он должен быть сразу изменён на какой-либо из других Side*.
</div>
<div class="rfc" id="0004">
<h3><a href="#0004">RFC #0004 - класс Bactery</a></h3>
Класс Bactery содержит поля:<br>
League *parent; // указатель на лигу, к которой принадлежит бактерия(Для того чтобы определять, команды какой лиги исполнять)<br>
Side turnSide; // Сторона, в которую повёрнута бактерия<br>
int weight; // Вес бактерии<br>
int lineNumber; // Номер строки кода, на которой находится бактерия<br>
int x, y; // Координаты бактерии<br>
Для всех этих полей установлены сеттеры-геттеры согласно <a href="#0001">RFC #0001</a>.<br>
У класса Bactery есть один конструктор. Он принимает (parent, weight, turnSide, lineNumber), где последние 3 параметра - необязательные. weight и turnSide автоматически устанавливаются соответственно константам в bactery.hpp, lineNumber в 1.<br>
Определён приватный метод turn(), который заменяет SideRandom на случайную сторону согласно <a href="#0003">RFC #0003</a>.
</div>
<div class="rfc" id="0005">
<h3><a href="#0005">RFC #0005 - класс League</a></h3>
Класс League содержит поля:<br>
vector<Bactery*> bacteries; // массив указателей клеток лиги<br>
vector<Command> commands; // массив комманд клеток этой лиги<br>
Interpreter* interpreter;// указатель на интерпритатор ибо надо это для удаления и добавления клеток<br>
Конструктор: принимает на вход имя файла интеллекта(по которому генерит массив комманд) и указатель на интерпретатор <br>
Публичные методы:<br>
deleteBactery(Bactery*) // удаляет клетку по передаваемому указателю<br>
addBactery(Bactery*) // добвляет указатель на бактерию в массив bacteries<br>
steps() // для каждой клетки вызывает его текущий Command::act<br>
</div>
<div class="rfc" id="0006">
<h3><a href="#0006">RFC #0006 - класс Interpreter</a></h3>
Класс Interpreter содержит поля:<br>
Приватные методы:<br>
Bactery* world[WORLD_SIZE][WORLD_SIZE] - двумерный массив поля, в котором двигаются наши бактерии, где WORLD_SIZE - размер поля, по умолчанию = 20(это еще нужно обсудить)<br>
vector <League> leagues; //Массив рас<br>
Публичные методы:<br>
Конструктор: принимает на вход массив строк с именами файлов каждой лиги бактерий<br>
act(); // метод выполняющий steps() для каждой лиги<br>
Bactery* getWorldItem(int x, int y) - возвращает ссылку на бактерию в x, y<br>
void setWorldItem(int x, int y, Bactery* bact) - задаёт бактерию в мире по координатам
</div>
</body>
</html>