Алгоритм заполнения шахматной доски
Достаточно простая, но тем не менее интересная задача для разминки программиста. Думаю, все видели, как выглядит шахматная доска, а также слышали выражение «расставить в шахматном порядке». На случай, если не видели, это поле, состоящее размером 8 на 8 клеток, имеющих разные цвета – черный и белый. При этом, клетки одного цвета не могут быть смежными, а расположены через одну: белый, черный, белый… как по вертикали, так и по горизонтали.
Мы выведем в шахматном порядке восемь строк по восемь символов в каждой. Черный цвет у нас будет изображать символ «X», а белый – «O».
Самое первое, что приходит в голову:
- создать двумерный массив соответствующего размера;
- двойным циклом заполнить одним белым цветом все поля;
- затем можно запустить еще дополнительные циклы, которые будут обходить нужные клетки и назначать «черный» цвет.
Отмечу, что код примера реализован в синтаксисе языка Pascal, но постараюсь писать как можно более универсально, чтобы можно было легко перевести на любой язык программирования. В итоге, самое сложное, что я мог придумать для реализации такого неоптимального алгоритма выглядит следующим образом:
var i, j : Integer; // переменные для циалов masChess : array[1..8, 1..8] of Char; // массив с полем begin // заполняем массив "белым" цветом for i := 1 to 8 do for j := 1 to 8 do masChess[i, j] := 'O'; // закрашиваем "черным" отдельные ячейки i := 1; while (i
Пример выше, свою задачу выполняет, но код очень громоздкий. Чтобы заполнить все нужные ячейки, приходится использовать два отдельных присвоения значения как бы в разных плоскостях.
Если подойти к задаче более творчески, можно найти более интересное решение. Для этого достаточно заметить закономерности в расположении клеток. Все они идут через одну по вертикали и по горизонтали. То есть, одноцветные не могут быть рядом. Если присмотреться еще внимательнее, можно заметить еще одну очевидную вещь: номер каждой клетки как по вертикали, так и по горизонтали может быть как четным, так и нечетным. Но главное, что номер каждой «белой» клетки будет одновременно четным или нечетным по каждому направлению. «Черные» клетки при этом будут всегда со разными значениями – одно четное, другое нечетное.
неч | чет | неч | Чет | |
неч | 0 | X | 0 | X |
чет | X | 0 | X | 0 |
неч | 0 | X | 0 | X |
чет | X | 0 | X | 0 |
В итоге, задачу можно решить очень простым и коротким методом: двойной цикл и одно условие, которое будет определять одинаковы ли значения четности каждой клетки.
var i, j : Integer; // переменные для циалов masChess : array[1..8, 1..8] of Char; // массив с полем begin // заполняем все ячейки for i := 1 to 8 do for j := 1 to 8 do if odd(i) = odd(j) then masChess[i, j] := 'O' else masChess[i, j] := 'X'; // вывод результата for i := 1 to 8 do begin for j := 1 to 8 do Write(masChess[i, j], ' '); Writeln; end; end.
Большинство задач можно решить различными способами. Работа же программиста найти наиболее функциональный и грамотный метод, позволяющий выполнить поставленную задачу наиболее эффективным путем.
Вывод на экран шахматной доски
Программа, которая выводит на экран изображение шахматной доски
и снова привет! мне опять нужна ваша помощь. вот код, который жутко глючит((( < // Напишите.
Написать программу, которая выводит на экран изображение шахматной доски
Написать программу, которая выводит на экран изображение шахматной доски.
Разрезание шахматной доски
Написать программу нахождения всех способов разрезания шахматной доски с числом клеток nxn.
Король шахматной доски
Король шахматной доски размером 8х8 находится на коне в одной из клеток своего королевства. Он.
Регистрация: 14.12.2008
Сообщений: 26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include int main() { int i, j; printf("Pered vami - shahmatnaya doska:\n"); for (i=0; i7; i++){ //* izmenenie stolbcov for (j=0; j7; j++) { //* izmenenie strok if(i%2==1) if (j%2==1) printf(" "); else printf("*"); else if (j%2==1) printf("*"); else printf(" "); } printf("\n"); } }
попробуй так
Регистрация: 22.11.2008
Сообщений: 36
Большое спасибо!
Регистрация: 05.02.2010
Сообщений: 12
Доброго времени суток.
Даны 2 задачи на вариацию шахматной доски.
1. Высота и ширина доски задаётся пользователем.
Нарисовать шахматную доску в консоли. Размер ячейки доски фиксирован - одно знакоместо.
Чёрные клетки - символ 'x', белый - символ '-'.
Тут сложностей нет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int h, w, i, j; cout "Введите высоту шахматной доски.\nh = "; cin >> h; cout "Введите ширину шахматной доски.\nw = "; cin >> w; for (i=0; ih; i++) cout '\n'; } cout "\n\n\n";
2. условия те же, только размер ячейки не фиксирован, а задаётся пользователем.
Т.е., например, высота доски - 3, ширина - 4, размер ячейки - 3 знакоместа.
На выводе должно быть так:
И вот тут у меня проблемы.
Помогите пожалуйста подсказкой как это реализовать, готовый код не надо - хочется самому разобраться.
Из обязательных условий: использование только циклов - никаких массивов, консольный вывод (cout).
Добавлено через 3 часа 53 минуты
Вторую задачу-таки победил
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
#include using namespace std; void main() { setlocale (LC_CTYPE, ".1251"); int h, a, w; cout "Введите высоту шахматной доски.\nh = "; cin >> h; cout "Введите ширину шахматной доски.\nw = "; cin >> w; cout "Введите величину ячейки шахматной доски.\na = "; cin >> a; for (int i=0; ih; i++) { for (int jj=0; jja; jj++) { for (int j=0; jw; j++) { for (int ii=0; iia; ii++) { ((i+j)%2) ? (cout '-') : (cout 'x'); } } cout '\n'; } } cout "\n\n\n"; }
Если у кого-то есть идеи по оптимизации решения - с интересом бы посмотрел.
1178 / 988 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
Тут сложностей нет.
Grayswandir, Задача решена совершенно грамотно.
И никаких оптимизаций тут в принципе быть не может
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
Day, ошибаешься, очень даже может. Как минимум так
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
#include using namespace std; int main() { setlocale (LC_CTYPE, ".1251"); int h, a, w; cout "Введите высоту шахматной доски.\nh = "; cin >> h; cout "Введите ширину шахматной доски.\nw = "; cin >> w; cout "Введите величину ячейки шахматной доски.\na = "; cin >> a; int i, jj, j, ii; for (i=0; ih; i++) { for (jj=0; jja; jj++) { for (j=0; jw; j++) { for (ii=0; iia; ii++) { (!(i+j) & 1) ? (cout '-') : (cout 'x'); } } cout '\n'; } } cout "\n\n\n"; return 0; }
Регистрация: 05.02.2010
Сообщений: 12
M128K145, Ваш вариант работает неверно
И хотелось бы узнать, в чём именно заключается Ваша оптимизация, за исключением объявления счётчиков цикла до их начала, и присваивание функции main типа int?
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
Grayswandir, в 22 надо убрать отрицание, т.е. так
1 2 3 4 5 6
int i, jj, j, ii; for (i = 0; i h; ++i) for (jj = 0; jj a; ++jj, std::cout:: endl) for (j = 0; j w; ++j) for (ii = 0; ii a; ++ii) std::cout<((i + j) & 1 ? '-' : 'x');
Оптимизация? Да никакой в принципе, если не учитывать затраты на создание N переменных типа int. Для вашего кода N = h * a * w + 1, для моего N = 4. А если взять значения h, a, w немногим более тысячи? Еще вопросы?
Регистрация: 05.02.2010
Сообщений: 12
Спасибо. Об этом как-то и не подумал.
Регистрация: 19.01.2017
Сообщений: 1
Я только учусь . Но Вот так вот доска шахматная должна выглядеть.
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
#include using namespace std; void main() { setlocale(LC_ALL, "rus"); int h, a, w; cout "Введите высоту шахматной доски.\nh = "; cin >> h; cout "Введите ширину шахматной доски.\nw = "; cin >> w; cout "Введите величину ячейки шахматной доски.\na = "; cin >> a; for (int i = 0; i h; i++) //проход по высоте доски { if (i % 2 == 0) for (int i = 0; i w/2; i++) //проход ***--- по ширине доски { for (int i = 0; i a; i++) cout "*"; for (int i = 0; i a; i++) cout "-"; } else for (int i = 0; i w/2; i++) //проход ---*** по ширине доски { for (int i = 0; i a; i++) cout "-"; for (int i = 0; i a; i++) cout "*"; } cout "\n"; } cout "\n\n"; }
angelwarcode, теме 7 лет ,как вы ее нашли..
Меню пользователя @ Dimension |
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include int main() { const int N = 8; bool flag = true; for (int i = 0; i N * N; i++) { if (i % N == 0) { std::cout <'\n'; flag = !flag; } std::cout <(i & 1 ^ flag ? '*' : ' '); } }
Регистрация: 12.11.2017
Сообщений: 1
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
#include #include #include #include #include #include using namespace std; void main() { bool x = true; int answer; answer = 0; while (x) { setlocale(LC_ALL, "Russian"); system("pause"); system("cls"); char simbol, simbol1; int k, n; cout "Введите ширину" endl; cin >> k; cout "Введите символ # и -" endl; cin >> simbol; cin >> simbol1; cout "Введите высоту" endl; cin >> n; for (int l2 = 1; l2 n; l2++) { for (int l1 = 1; l1 n; l1++) { for (int l = 0; l k; l++) { for (int i = 0; i k; i++) { // simbol=k; cout ' ' simbol; } for (int j = 0; j k; j++) { // simbol1=k; cout ' ' simbol1; } } } for (int l = 1; l n; l++) { for (int l = 1; l n; l++) { for (int i = 0; i k; i++) { //simbol1 = k; cout ' ' simbol1; } for (int j = 0; j k; j++) { //simbol = k; cout ' ' simbol; } } } } cout endl; cout endl; cout "Желаете продолжить работу?" endl; cout "Да - 1, нет - 0: "; cin >> answer; if (answer = 1) x = true; else x = false; } }
Добавлено через 33 секунды
Немного доделать.)))
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include using std::cout; int main() { cout "\xDA\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xBF\n"; cout "\xB3\xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xB3\n"; cout "\xB3 \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD\xB3\n"; cout "\xB3\xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xB3\n"; cout "\xB3 \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD\xB3\n"; cout "\xB3\xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xB3\n"; cout "\xB3 \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD\xB3\n"; cout "\xB3\xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xB3\n"; cout "\xB3 \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD \xDE\xDB\xDD\xB3\n"; cout "\xC0\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xC4\xD9\n"; }
5146 / 2759 / 464
Регистрация: 05.10.2013
Сообщений: 7,281
Записей в блоге: 145
SFML, OpenGL 3.3 Core, проект VS2015: Chessboard_SFML.zip
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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
#define GLEW_STATIC #include #include #include #include #include #include #include #include #include #include extern "C" _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; unsigned int CreateShaderProgram(const GLchar* vertexShaderText, const GLchar* fragmentShaderText); std::string LoadFileContents(const std::string filePath); int main() sf::ContextSettings settings; settings.majorVersion = 3; settings.minorVersion = 3; settings.depthBits = 24; sf::RenderWindow window(sf::VideoMode(500, 500), "Chessboard", sf::Style::Titlebar float vertices[] = { 0.0f, 1.0f, // (x, y) 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f }; GLuint vbo; GLuint vao; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, (GLvoid*)0); glEnableVertexAttribArray(0); //std::string vertexShaderText = LoadFileContents("shader.vert.glsl"); //std::string fragmentShaderText = LoadFileContents("shader.frag.glsl"); std::string vertexShaderSource = "#version 330 core\n" "layout(location = 0) in vec2 a_position;" "uniform mat4 u_mpMatrix;" "void main()" " " gl_Position = u_mpMatrix * vec4(a_position, 0.0, 1.0);" ">"; std::string fragmentShaderSource = "#version 330 core\n" "uniform vec3 u_color;" "out vec4 outColor;" "void main()" " " outColor = vec4(u_color, 1.0);" ">"; GLuint shaderProgram = CreateShaderProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str()); glUseProgram(shaderProgram); GLint u_Color = glGetUniformLocation(shaderProgram, "u_color"); glm::mat4x4 modelMatrix; glm::mat4 mpMatrix; glm::mat4 projectionMatrix = glm::ortho(0.0f, 8.0f, 0.0f, 8.0f); glViewport(20, 20, 460, 460); GLint u_mpMatrix = glGetUniformLocation(shaderProgram, "u_mpMatrix"); while (window.isOpen()) { sf::Event ev; while (window.pollEvent(ev)) { if (ev.type == sf::Event::Closed) { window.close(); } } glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); for (size_t row = 0; row 8; row++) else { glUniform3f(u_Color, 0.823f, 0.690f, 0.356f); } glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } } window.display(); } return 0; } GLuint CreateShaderProgram(const GLchar * vertexShaderText, const GLchar * fragmentShaderText) { GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); GLuint shaderProgram = glCreateProgram(); glShaderSource(vertexShader, 1, &vertexShaderText, nullptr); glCompileShader(vertexShader); GLint success; GLchar infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog); std::cout "Vertex Shader compilation failed: " infoLog std::endl; } glShaderSource(fragmentShader, 1, &fragmentShaderText, nullptr); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog); std::cout "Fragment Shader compilation failed: " infoLog std::endl; } glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog); std::cout "Program failed to link: " infoLog std::endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); return shaderProgram; } std::string LoadFileContents(const std::string filePath) { std::ifstream file(filePath); std::stringstream sstream; if (!file.is_open()) { std::cout "Could not find the file: " filePath std::endl; } sstream file.rdbuf(); return sstream.str(); }
Ждем следующую доску в 3D 😀
Меню пользователя @ QuakerRUS |
684 / 4921 / 262
Регистрация: 11.08.2016
Сообщений: 3,142
Неплохо бы знать, какой у тебя C++. Borland C++ 3.0? Visual C++? Builder? MinGW? DevCPP? Ещё что-нибудь?
5146 / 2759 / 464
Регистрация: 05.10.2013
Сообщений: 7,281
Записей в блоге: 145
Сообщение от Ivandur
Неплохо бы знать, какой у тебя C++. Borland C++ 3.0? Visual C++? Builder? MinGW? DevCPP? Ещё что-нибудь?
Автор создал тему в 2008 году.
Сообщение от QuakerRUS
Ждем следующую доску в 3D
SFML, OpenGL 3.3 Core, проект VS2015: Chessboard3D.zip
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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
#define GLEW_STATIC #include #include #include #include #include #include #include #include #include #include extern "C" _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; unsigned int CreateShaderProgram(const GLchar* vertexShaderText, const GLchar* fragmentShaderText); std::string LoadFileContents(const std::string filePath); void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b); glm::mat4 mvpMatrix; glm::mat4 modelMatrix; glm::mat4 normalMatrix; glm::mat4 viewMatrix; glm::mat4 projectionMatrix; GLint u_color; GLint u_normalMatrix; GLint u_mvpMatrix; int main() sf::ContextSettings settings; settings.majorVersion = 3; settings.minorVersion = 3; settings.depthBits = 24; sf::RenderWindow window(sf::VideoMode(500, 500), "Chessboard", sf::Style::Titlebar // v6----- v5 // /| /| // v1------v0| // | | | | // | |v7---|-|v4 // |/ |/ // v2------v3 GLfloat vertices[] = { 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, // v0-v1-v2-v3 front 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, // v0-v3-v4-v5 right 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, // v0-v5-v6-v1 up -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, // v1-v6-v7-v2 left -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, // v7-v4-v3-v2 down 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5 // v4-v7-v6-v5 back }; GLfloat normals[] = { 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // v0-v1-v2-v3 front 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // v0-v3-v4-v5 right 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // v0-v5-v6-v1 up -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, // v1-v6-v7-v2 left 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // v7-v4-v3-v2 down 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0 // v4-v7-v6-v5 back }; GLushort indices[] = { 0, 1, 2, 0, 2, 3, // front 4, 5, 6, 4, 6, 7, // right 8, 9, 10, 8, 10, 11, // up 12, 13, 14, 12, 14, 15, // left 16, 17, 18, 16, 18, 19, // down 20, 21, 22, 20, 22, 23 // back }; GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLuint vertexVBOID; glGenBuffers(1, &vertexVBOID); glBindBuffer(GL_ARRAY_BUFFER, vertexVBOID); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, (GLvoid*)0); glEnableVertexAttribArray(0); GLuint normalVBOID; glGenBuffers(1, &normalVBOID); glBindBuffer(GL_ARRAY_BUFFER, normalVBOID); glBufferData(GL_ARRAY_BUFFER, sizeof(normals), normals, GL_STATIC_DRAW); glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, (GLvoid*)0); glEnableVertexAttribArray(1); GLuint indexVBOID; glGenBuffers(1, &indexVBOID); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); //std::string vertexShaderText = LoadFileContents("shader.vert.glsl"); //std::string fragmentShaderText = LoadFileContents("shader.frag.glsl"); std::string vertexShaderSource = "#version 330 core\n" "layout(location = 0) in vec3 a_position;" "layout(location = 1) in vec3 a_normal;" "uniform vec3 u_lightDir;" "uniform mat4 u_normalMatrix;" "uniform mat4 u_mvpMatrix;" "out float v_dot;" "void main()" " " gl_Position = u_mvpMatrix * vec4(a_position, 1.0);" " vec4 normal = u_normalMatrix * vec4(a_normal, 1.0);" " v_dot = max(dot(normalize(normal.xyz), u_lightDir), 0.0);" ">"; std::string fragmentShaderSource = "#version 330 core\n" "uniform vec3 u_color;" "out vec4 outColor;" "in float v_dot;" "void main()" " " vec3 diffuse = vec3(u_color * v_dot);" " vec3 ambient = vec3(0.2, 0.2, 0.2) * u_color;" " outColor = vec4(diffuse + ambient, 1.0);" ">"; GLuint shaderProgram = CreateShaderProgram(vertexShaderSource.c_str(), fragmentShaderSource.c_str()); glUseProgram(shaderProgram); u_color = glGetUniformLocation(shaderProgram, "u_color"); viewMatrix = glm::lookAt( glm::vec3(12, 15, 23), // Camera is at (x, y, z), in World Space glm::vec3(3, 2, 4), // and looks at the origin glm::vec3(0, 1, 0) // Head is up (set to 0,-1,0 to look upside-down) ); GLint u_lightDir = glGetUniformLocation(shaderProgram, "u_lightDir"); glm::vec4 lightDir = glm::vec4(2.0f, 10.0f, 4.0f, 0.0f); lightDir = glm::normalize(lightDir); glm::vec3 lightDir_eye = viewMatrix * lightDir; lightDir_eye = glm::normalize(lightDir_eye); glUniform3f(u_lightDir, lightDir_eye.x, lightDir_eye.y, lightDir_eye.z); u_normalMatrix = glGetUniformLocation(shaderProgram, "u_normalMatrix"); projectionMatrix = glm::perspective(glm::radians(30.0f), 1.0f, 0.1f, 1000.0f); u_mvpMatrix = glGetUniformLocation(shaderProgram, "u_mvpMatrix"); glEnable(GL_DEPTH_TEST); while (window.isOpen()) { sf::Event ev; while (window.pollEvent(ev)) { if (ev.type == sf::Event::Closed) { window.close(); } } glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //modelMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f)); //mvpMatrix = projectionMatrix * viewMatrix * modelMatrix; //glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]); //normalMatrix = glm::inverse(modelMatrix); //normalMatrix = glm::transpose(normalMatrix); //glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]); //glUniform3f(u_color, 0.823f, 0.690f, 0.356f); //glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0); // Cells for (size_t row = 0; row 8; row++) else { glUniform3f(u_color, 0.823f, 0.690f, 0.356f); } glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0); } } GLfloat color[] = { 0.368, 0.188, 0.109 }; // Front border for (size_t i = 0; i 8; i++) { DrawCube(glm::vec3(i, 0.0f, 8.0), color[0], color[1], color[2]); } // Left border for (int i = -1; i 9; i++) { DrawCube(glm::vec3(-1.0f, 0.0f, i), color[0], color[1], color[2]); } // Back border for (size_t i = 0; i 8; i++) { DrawCube(glm::vec3(i, 0.0f, -1.0), color[0], color[1], color[2]); } // Right border for (int i = -1; i 9; i++) { DrawCube(glm::vec3(8.0f, 0.0f, i), color[0], color[1], color[2]); } window.display(); } return 0; } void DrawCube(glm::vec3 pos, GLfloat r, GLfloat g, GLfloat b) { modelMatrix = glm::translate(glm::mat4(), pos); mvpMatrix = projectionMatrix * viewMatrix * modelMatrix; glUniformMatrix4fv(u_mvpMatrix, 1, false, &mvpMatrix[0][0]); normalMatrix = glm::inverse(modelMatrix); normalMatrix = glm::transpose(normalMatrix); glUniformMatrix4fv(u_normalMatrix, 1, false, &normalMatrix[0][0]); glUniform3f(u_color, r, g, b); glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, (GLvoid*)0); } GLuint CreateShaderProgram(const GLchar * vertexShaderText, const GLchar * fragmentShaderText) { GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); GLuint shaderProgram = glCreateProgram(); glShaderSource(vertexShader, 1, &vertexShaderText, nullptr); glCompileShader(vertexShader); GLint success; GLchar infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog); std::cout "Vertex Shader compilation failed: " infoLog std::endl; } glShaderSource(fragmentShader, 1, &fragmentShaderText, nullptr); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog); std::cout "Fragment Shader compilation failed: " infoLog std::endl; } glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog); std::cout "Program failed to link: " infoLog std::endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); return shaderProgram; } std::string LoadFileContents(const std::string filePath) { std::ifstream file(filePath); std::stringstream sstream; if (!file.is_open()) { std::cout "Could not find the file: " filePath std::endl; } sstream file.rdbuf(); return sstream.str(); }
Регистрация: 17.08.2018
Сообщений: 1
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
#include using namespace std; int main() { setlocale(LC_ALL, "rus"); cout "Размер= "; int a, k = 1, p = 1, v = 0; cin >> a; while (k a) { for (int r = 0; r 4; r++) { for (int k = 0; k a; ) { cout "*"; k++; if (k == a) { for (int l = 0; l a; l++) { cout "-"; } } } } cout endl; k++; } while (p a) { for (int r = 0; r 4; r++) { for (int k = 0; k a; ) { cout "-"; k++; if (k == a) { for (int l = 0; l a; l++) { cout "*"; } } } } cout endl; p++; } while (v a) { for (int r = 0; r 4; r++) { for (int k = 0; k a; ) { cout "*"; k++; if (k == a) { for (int l = 0; l a; l++) { cout "-"; } } } } cout endl; v++; } system("pause"); }
Регистрация: 20.07.2018
Сообщений: 24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include #include int main() { const char WHITE = '#'; const char BLACK = ' '; int x,y,w; std::cout "Enter size : "; std::cin >> x; y = x; std::cout "Enter width of cell : "; std::cin >> w; int c,z,r; for(c = 0;cy;c++) { for(z = 0;zw;z++) { for(r = 0;rx;r++) std::cout (c%2==0 ?r%2==0 ?std::string(w,WHITE):std::string(w,BLACK):r%2==0?std::string(w,BLACK):std::string(w,WHITE)); std::cout std::endl; } } return 0; }
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Задачка. Поле шахматной доски
Поле шахматной доски задается парой натуральных чисел: Первое указывает номер вертикали при счете.
Обход конём шахматной доски
Приветствую всех форумчан! Нужно решить задачу: обойти конём шахматное поле размером n*n (n<=8).
Обход шахматной доски конем
Добрый вечер , форумчане. Передо мной стоит проблема написать программу на С++ (задача о ходе .
Написать шаблон шахматной доски
Всем доброго времени суток! Я только начала учить циклы. Пока тяжело писать коды. Помогите.
Пишем простой шахматный движок на Go
В данной статье мы постараемся разобраться, как работают шахматные движки путем портирования шахматного движка sunfish на Go. Sunfish примечателен своей простотой и небольшим размером, но при этом он все-таки способен сыграть достойную шахматную партию. Go в свою очередь известен как простой и хорошо читаемый язык программирования, поэтому я надеюсь, что вместе они составят отличную пару.
Чтобы создать шахматный движок, для начала необходимо определиться с тремя важными моментами:
- Каким образом представить шахматную доску (клетки, фигуры, допустимые ходы)?
- Как оценивать доску (кто выиграет с большей вероятностью)?
- Как выполнять поиск оптимального хода?
Клетки и фигуры
Важно найти удобное представление доски, не занимающее много места, так как во время поиска оптимального хода в памяти будут храниться тысячи вариантов досок.
Обычно доска представляет собой набор клеток. Мы добавим отступы вокруг стандартной доски 8x8, чтобы недопустимые ходы фигур попадали в эту область. Это позволит нам избежать проверки границ и значительно упростит код.
Мы будем использовать линейный массив. Самое большое расстояние, на которое может переместиться шахматная фигура, — это ход коня на 2 клетки. Конечно, другие скользящие фигуры могут перемещаться на большие расстояния, но такие ходы будут последовательно оцениваться по мере преодоления каждой клетки, а значит границы доски будут обнаружены раньше, чем фигура сможет выйти за них.
Таким образом, нам необходим отступ по краям доски в две клетки. Мы могли бы создать доску 12x12, но так как мы представляем ее в виде линейного массива, нам нужна доска 12x10, потому что крайний правый квадрат отступа в предыдущей строке может использоваться в качестве крайнего левого квадрата отступа в следующей строке (× = отступ):
В нашем обозначении “a1” выглядела бы как 9×10+1=91, а “a8” — как “2×10+1"=21.
Каждая ячейка в массиве доски представляла бы шахматную фигуру, пустую клетку или зону отступа. Мы могли бы использовать числовые константы для этих значений, но, чтобы упростить отладку, используем символы, понятные человеку. Прописными и строчными буквами будут обозначаться фигуры, пробелом — зоны отступа, а точками — пустые клетки:
| | RNBQKBNR | PPPPPPPP | . | . | . |
Расшифровка сокращений
R — rook — ладья
N — knight — конь
B — bishop — слон
Q — queen — ферзь
K — king — король
Наконец мы можем начать писать код:
type Piece byte func (p Piece) Value() int < . >func (p Piece) Ours() bool < . >func (p Piece) Flip() Piece < . >type Board [120]piece func (b Board) Flip() Board < . >type Square int func (s Square) Flip() Square
Фигуры имеют определенную ценность. Эти значения нужны, чтобы оценивать позиции на доске и понимать, кто выигрывает. Обычно пешка = 100, конь = 280, слон = 320, ладья = 479, ферзь = 929, а король имеет настолько высокую ценность, что она превосходит 8 ферзей (пешки, превратившиеся в ферзей) в совокупности с парами коней, слонов и ладей. Если мы обладаем всем этим богатством, но теряем короля, подсчет все равно покажет, что мы проиграем.
Каждый тип имеет метод переворота (Flip() method), который возвращает то же самое значение после переворота доски перед ходом противника. У фигур он меняет регистр символа фигуры. У клеток он возвращает 119 клеток (считая с другого конца доски). Что касается доски, он копирует все фигуры с клеток в обратном порядке, меняя их регистр.
Генератор ходов
Итак, у нас уже есть «кирпичики» для движка, и теперь мы можем подумать об игровых позициях. Позиция — это доска с фигурами и дополнительные состояния в игре, такие как квадрат прохода, блуждающий квадрат и возможности рокировки. Если бы мы хотели упростить игру, мы бы могли повторно использовать тип доски (Board type), но мы создадим отдельный тип позиции (Position type), отвечающий за ходы и оценку доски.
Что такое ход? Это комбинация двух клеток — клетка, на которой фигура находилась до совершения хода, и клетка, куда переместились фигура. Позиция — это шахматная доска со счетом, правилами рокировки для каждого игрока и квадратами прохода / блуждающими квадратами. Оба типа также имеют метод переворота (Flip() method) для ходов соперника.
type Move struct < from Square to Square >func (m Move) Flip() Move < . >type Position struct < board Board // текущая доска score int // очки по доске — чем их больше, тем лучше wc [2]bool // возможности рокировки для белых bc [2]bool // возможности рокировки для черных ep Square // битое поле, где пешка может быть взята на проходе kp Square // поле во время рокировки, где король может быть взят >func (p Position) Flip() Position
Теперь мы можем написать первый большой метод — генератор допустимых ходов. Нам важны только белые фигуры, так как для игры черными мы будем переворачивать доску и снова ходить белыми.
Чтобы сгенерировать все допустимые ходы, нам нужно:
- составить список всех одношаговых ходов в каждом направлении для каждой фигуры;
- выполнить то же самое для всех клеток, игнорируя не белые фигуры;
- обозначить ход в каждом возможном направлении для каждой белой фигуры;
- если длина хода фигуры не ограничена (ладья, слон, ферзь), продолжайте двигать ее, пока на пути не встретится препятствие: фигура соперника или отступ за краем доски.
Чтобы сделать арифметику направлений более читаемой, мы будем использовать константы направления N/E/S/W:
const N, E, S, W = -10, 1, 10, -1 var directions = map[Piece][]Square< 'P': , 'N': , 'B': , 'R': , 'Q': , 'K': , > func (pos Position) Moves() (moves []Move) < for index, p := range pos.board < if !p.ours() < continue >i := Square(index) for _, d := range directions[p] < for j := i + d; ; j = j + d < q := pos.board[j] if q == ' ' || (q != '.' && q.ours()) < break >if p == 'P' < if (d == N || d == N+N) && q != '.' < break >if d == N+N && (i < A1+N || pos.board[i+N] != '.') < break >> moves = append(moves, Move) if p == 'P' || p == 'N' || p == 'K' || (q != ' ' && q != '.' && !q.ours()) < break >> > > return moves >
Вот и все правила игры в шахматы, которые нам нужно учитывать, чтобы делать допустимые ходы. Следующим шагом будет применение хода к позиции для создания новой игровой позиции. Без учета взятия на проходе, превращения пешки и рокировки метод будет выглядеть следующим образом:
func (pos Position) Move(m Move) (np Position)
Он просто передвигает фигуру, помечает клетку, на которой она находилась ранее, как пустую и переворачивает доску. Полную реализацию метода можно найти на Github, он правильно обрабатывает все специальные ходы пешки и короля.
На этом этапе можно играть в шахматы «человек против человека», контролируя процесс и делая только допустимые ходы. Или же можно создать примитивный шахматный движок, который делает случайные ходы пока не проиграет.
Но как понять, что мы проигрываем?
Оценка доски
За каждую позицию на доске начисляются очки. Изначально счет равняется нулю, так как оба игрока начинают в равных условиях. После выполнения хода счет меняется в зависимости от того, какие фигуры были взяты и как фигуры поменяли положение на доске.
В самом простом случае мы можем сосчитать фигуры на доске и сложить их ценность (за вычетом фигур противника). Такой подсчет покажет, если королю будет объявлен шах и мат. Но это очень слабая система оценки.
Гораздо более точный и удивительно простой подход — это таблицы соотношения фигур и клеток (PST — Piece-Square Tables). Для каждой фигуры создается таблица такого же размера, как шахматная доска, где для каждой клетки назначается соответствующая ценность. Эти значения являются эмпирическими, поэтому я просто взял их из движка Sunfish.
На самом деле, более продвинутые шахматные движки обновляют PST-таблицы во время игры, потому что ценность фигур меняется (т. е. пешки становятся более ценными к концу игры). Но у нас будет простой движок.
Чтобы оценить позицию после хода, нам нужно:
- определить рейтинг текущей позиции,
- вычесть ценность передвигаемой фигуры,
- прибавить новую ценность фигуры в соответствии с таблицей PTS,
- прибавить ценность захваченной фигуры, если такие имеются.
var pst = map[Piece][120]int< 'P': < . >, 'N': < . >, 'B': < . >, 'R': < . >, 'Q': < . >, 'K': < . >, > func (pos Position) value(m Move) int < i, j := m.from, m.to p, q := Piece(pos.board[i]), Piece(pos.board[j]) // Настроить значение передвигаемой фигуры в PST-таблице score := pst[p][j] - pst[p][i] if q != '.' && q != ' ' && !q.ours() < // Настроить значение захваченной фигуры в PST-таблице score += pst[q.Flip()][j.Flip()] >return score >
Теперь мы можем сделать немного более продвинутый движок, который будет выбирать наилучший возможный ход, а не любой из допустимых.
Но настоящие шахматные движки проводят более глубокую аналитику и перебирают ветви возможных ходов с каждой стороны, чтобы найти наилучший возможный ход в долгосрочной перспективе.
Алгоритм поиска
Наиболее распространенный алгоритм поиска в шахматных движках попроще — поиск в глубину, который начинается с корня и спускается до заданного предела глубины, повторяя все возможные ходы перед возвратом. Для каждого хода вычисляется ценность позиции с использованием алгоритма минимакс (minimax) c альфа-бета отсечением (alpha-beta pruning).
Минимакс — это правило, используемое для минимизации возможных потерь при наихудшем раскладе: игрок рассматривает все лучшие ходы противника и выбирает такой ход, чтобы лучшая стратегия противника приносила как можно больше очков.
Простой алгоритм минимакс будет слишком медленным для шахмат, он потребует повторения слишком большого количества ходов, чтобы найти хороший.
Альфа-бета отсечение (alpha-beta pruning) используется для ускорения алгоритма минимакс путем удаления узлов, которые не стоит рассматривать. В основе альфа-бета отсечения лежит следующая логика: представьте, что вы играете в шахматы и обнаруживаете очень хороший ход А. Вы продолжаете смотреть на доску и находите еще более удачный ход B. Но затем вы анализируете ситуацию глубже и понимаете, что в случае выбора хода B противник объявит вам шах и мат через несколько ходов. Теперь вы отбросите ход B и не будете тратить время на анализ других возможных комбинаций после хода B.
Как минимакс, так и альфа-бета отсечение важны для понимания принципа работы шахматного движка. Движок Sunfish использует усовершенствованный алгоритм поиска MDF(f), который также является вариантом алгоритма минимакс, совмещенного с отсечением.
В нашем движке мы будем постепенно увеличивать глубину поиска и вызывать алгоритм MDF(f) для поиска нижних и верхних границ оптимального результата. Алгоритм MDF (f) будет использовать итерации альфа-бета отсечения с кэшем транспозиции.
Кэш транспозиции — это кэш, где для каждой позиции на доске мы запоминаем глубину, счет и ход, который привел нас к этой позиции. Затем при рассмотрении новой позиции она сначала проверяется по таблице транспозиции.
Я не буду публиковать здесь код алгоритма поиска, так как он представляет собой всего лишь несколько строк рекурсивного поиска, но вы всегда можете найти полные исходники шахматного движка на GitHub.
Что дальше?
Если вам интересны простые шахматные движки, настоятельно рекомендую сыграть с Sunfish. Кстати, основой для Sunfish послужил движок Micromax, к нему прилагается замечательная документация от автора, которую определенно стоит прочитать.
Что касается нашего движка в Go, я добавил небольшую реализацию протокола UCI, чтобы его можно было использовать с пользовательским интерфейсом PyChess. Скорее всего, в нем еще куча ошибок и большой потенциал для улучшений, но это был интересный путь: от идеи о разработке шахматного движка до готовой, работающей компьютерной шахматной программы.
Да, он слабенький, но он играет настоящие шахматные партии!
Надеюсь, вам понравилась эта статья. Вы можете подписаться на меня в Github, Twitter или подписаться через rss.
Вопросы с меткой [консоль]
Используйте данную метку для вопросов по разработке консольных приложений и особенностям консольного интерфейса. Для вопросов по интерпретаторам команд используйте метки соответствующего ПО: [cmd], [shell], [bash]
1,692 вопроса
Конкурсные
Неотвеченные
- Конкурсные 0
- Неотвеченные
- Цитируемые
- Рейтинг
- Неотвеченные (мои метки)
Параллельный ввод и и вывод данных в консоль python
Столкнулся с проблемой, что хотелось бы одновременно вводить и выводить данные из консоли python. Порылся на stackoverflow, всё что нашёл, так это таймауты для ввода. Такое мне не особо подошло, нужно .
задан 11 июн 2022 в 8:56
202 показа
Как сделать так, чтобы консоль не закрывалась?
У каждого окна в Windows есть справа сверху 3 кнопки - Свернуть, Во весь экран/Развернуть и Закрыть. Мне нужно сделать так, чтобы консоль Python по вызову функции, делала кнопку Закрыть недоступной. .
задан 10 июн 2022 в 17:55
729 показов
Как создать квадратный символ в консоли Python?
Моя задача - сделать символ с одинаковой длиной и шириной и вывести его в консоль. Как это сделать?
задан 10 июн 2022 в 15:44
495 показов
Как стереть последнюю напечатанную в консоль строку на C, Linux
Необходимо для пагинации частями выдавать данные в консоль, нужно стереть "press any key" после того как нажата любая клавиша, пробовал разные спецсимволы и переносы кареток, ни чего не .
задан 9 июн 2022 в 21:33
40 показов
C# логика работы со строками
Подскажите логику работы со строками Есть список one в нем 20 строк и второй список two в нем 100 строк. Нужно чтобы если я указал использовать строку из списка one, 5 раз например, чтобы он записал в .
задан 9 июн 2022 в 18:34
97 показов
Python Модуль sys, ошибка при запуске IndexError: list index out of range
from datetime import datetime import requests API_KEY = ". " def convert_currency(src, dst, amount): """converts `amount` from the `src` currency to `dst` using the .
задан 9 июн 2022 в 14:44
196 показов
Как выполнить код в .cs файле через консоль, не создавая при этом project и не используя IDE?
Я только начал изучать C#. Делаю лабораторные работы по синтаксису языка, по книге C# 10 Quick Syntax Reference, автор M.Olsson. Одна глава — одна лаба. Лабораторная работа должна быть в виде файла cs.
задан 9 июн 2022 в 12:39
Не получается запустить чистый проект Vue ErrorStackParser.parse is not a function
вот ошибка : ERROR TypeError: ErrorStackParser.parse is not a function TypeError: ErrorStackParser.parse is not a function at getOriginalErrorStack (C:\Users\Nefrittt\Desktop\test\node_modules@soda\.
задан 6 июн 2022 в 15:58
59 показов
Какие команды нужно прописать в командном окне (терминале), чтобы получить из .cpp файл статической библиотеки .lib
Во всех источниках рассказывается как это делать через Visual Studio, а я хочу понять как это пошагово работает -- через терминал. Использую компилятор g++. Помогите разобраться пожалуйста)
задан 3 июн 2022 в 21:38
174 показа
Как отловить принудительное завершение консольного приложения? C#
Существует консольное приложение. В общий лог пишется кто и когда его запускал, ну и всякие нужные входные данные. Так вот, необходимо отловить те случаи, когда закрывают консоль, либо убивают процесс .
задан 1 июн 2022 в 5:03
178 показов
Что лучше использовать вместо WCF для клиент-сервер?
Делаю клиент-сервер на c#, приложение консольное. Не могу понять что лучше использовать. Увидел WCF, посмотрел про него и узнал что с помощью его можно делать клиент-сервер где пользователи которые .
user460198
задан 31 мая 2022 в 14:51
385 показов
"bin" не является внутренней или внешней командой
Не работают команды плагина maker в symfony 5. PATH для php прописан. Также, не работает команда из директории "bin"
задан 30 мая 2022 в 10:15
Терминал vsc, отступ
Столкнулся с проблемой , при открытии терминала , у меня появляется отступ после расположения файла, как его убрать ? https://i.stack.imgur.com/swrnC.jpg
задан 25 мая 2022 в 14:29
70 показов
Как в консольном приложении вводить данные по образцу?
Смысл в том, что у меня есть уравнение (a + b)^2, где неизвестны переменные a и b - их значение задаёт пользователь. Я хочу сделать так, чтобы когда пользователь вводил переменные в консоли, то они бы .