Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/140: Рейтинг темы: голосов - 140, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 11.04.2009
Сообщений: 7

Сеть, игра "Крестики-нолики"

11.04.2009, 10:57. Показов 29756. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По заданию нужно: Написать игру крестики-нолики (шашки) с использованием С# ,С++, но мой выбор, нужно 2 программы клиент - сервер. Пока нет совершенно ничего, но при появление буду выкладывать сюда. Графическая часть не нужна, вернее по желанию.
Вопрос: Посоветуйте литературу, именно под эту задачу.
П.С. Небольшой опыт программирования есть.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2009, 10:57
Ответы с готовыми решениями:

Игра крестики-нолики
как сделать так чтобы после окнчания игры в отдельном окне выводилось сообщение кто победил или ничья..

Игра Крестики-нолики
Всем привет. Сделал игру Крестики-нолики на консоли, хотел бы узнать можно ее как-нибудь улучшить, упростить код(если возможно). Сама...

Игра судоку (крестики-нолики)
Люди подскажите пожалуйста. Препод дал задание написать игру судоку ну типа крестики нолики. Поле 9 на 9 . Выигрывает в том случае если 5...

57
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
11.04.2009, 16:15
Вот исходник моих крестиков ноликов(C BUILDER 6). Клиентом тут есть Веб браузер(http://127.0.0.1). Графической части как таковой почти нет, добавишь если захочешь. Есть возможность играть против компа(типа сервер это бот), либо с человеком который будет сидеть на сервере. Короче разберешься если захочешь. Если что непонятно, спрашивай.
Вложения
Тип файла: rar Krestik nolik.rar (5.3 Кб, 2506 просмотров)
2
0 / 0 / 0
Регистрация: 11.04.2009
Сообщений: 7
13.04.2009, 21:03  [ТС]
Благодарен Вам за помощь, сейчас буду разбираться , это 3 на 3 ?!
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
13.04.2009, 21:37
Ага. 3х3
0
0 / 0 / 0
Регистрация: 11.04.2009
Сообщений: 7
13.04.2009, 21:49  [ТС]
Значит, будет работать только с C++ Builder 6 ?! на Висуал выходит такая ошибка: "fatal error C1083: Cannot open include file: 'vcl.h' " Переделать можно ?!
а переделать 5 на 5 ть намного сложнее, интересно , я потихоньку разберусь в этих кодах, книгу куплю.
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
13.04.2009, 22:08
Да, исходник работает только на билдере. Но там, в принципе,не сложно. Главное понять идею.
В Билдере есть компонент THTTPServer, который есть сервером, а как это на визуале я даже и не знаю, так как никогда таким серьезно не занимался.
0
1 / 1 / 0
Регистрация: 10.03.2009
Сообщений: 24
14.04.2009, 11:29
Крестики-нолики не работают
Code
1
#include <myclasses.cpp>
в проекте нету такого файла (разумеется компилятор ругается).
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
14.04.2009, 22:50
глянь вот сюда [cut]
0
0 / 0 / 0
Регистрация: 11.04.2009
Сообщений: 7
25.04.2009, 12:08  [ТС]
Спасибо Отака =) Мне не дали эту прогу, в виду ее "легкости" , решил взять чат , и пишу его на Борланде, Возможно видели ... траблы уже есть =) но мне нравится Борланд
0
math4me
31.05.2009, 20:29
Привет!Срочно нужен код для крестики-нолики во флеше с комментариями!!!! SOS!!!
 Аватар для gorin
209 / 16 / 4
Регистрация: 18.08.2009
Сообщений: 571
09.02.2010, 20:50
Otaka, Привет я написал крестики нолики но я хочу добавить интелект моей игре, подскажи как можно замутить это!!!

Добавлено через 9 минут
Вот код моей игры он простенький и я хлчу добавить интелект
C++
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
void __fastcall TForm1::a1Click(TObject *Sender)
{
int diya=1;
dynamic_cast<TSpeedButton*>(Sender)->Enabled=false;
if ((diya%1==0)&&(diya%2==0)){
dynamic_cast<TSpeedButton*>(Sender)->Caption="O";
dynamic_cast<TSpeedButton*>(Sender)->Tag=2;}
else{
dynamic_cast<TSpeedButton*>(Sender)->Caption="X";
dynamic_cast<TSpeedButton*>(Sender)->Tag=1;}
diya++;
AnsiString name=dynamic_cast<TSpeedButton*>(Sender)->Name;
if(name=="a1"||name=="a2"||name=="a3"){
if((a1->Tag==a2->Tag)&&(a2->Tag==a3->Tag))
Image1->Visible=true;}
if(name=="a4"||name=="a5"||name=="a6"){
if((a4->Tag==a5->Tag)&&(a5->Tag==a6->Tag))
Image1->Visible=true;}
if(name=="a7"||name=="a8"||name=="a9"){
if((a7->Tag==a8->Tag)&&(a8->Tag==a9->Tag))
Image1->Visible=true;}
if(name=="a1"||name=="a4"||name=="a7"){
if((a1->Tag==a4->Tag)&&(a4->Tag==a7->Tag))
Image1->Visible=true;}
if(name=="a2"||name=="a5"||name=="a8"){
if((a2->Tag==a5->Tag)&&(a5->Tag==a8->Tag))
Image1->Visible=true;}
if(name=="a3"||name=="a6"||name=="a9"){
if((a3->Tag==a6->Tag)&&(a6->Tag==a9->Tag))
Image1->Visible=true;}
if(name=="a1"||name=="a5"||name=="a9"){
if((a1->Tag==a5->Tag)&&(a5->Tag==a9->Tag))
Image1->Visible=true;}
if(name=="a3"||name=="a5"||name=="a7"){
if((a3->Tag==a5->Tag)&&(a5->Tag==a7->Tag))
Image1->Visible=true;}
}
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
09.02.2010, 21:04
Глянь ка в эту темку:https://www.cyberforum.ru/grap... 93716.html
1
 Аватар для gorin
209 / 16 / 4
Регистрация: 18.08.2009
Сообщений: 571
09.02.2010, 21:38
Otaka, Спасибо канечно, но мне нужно бота зделать, а по твоему нужно много песать у меня просто, ти только помоги бота написать, зарание спасибо
0
 Аватар для gorin
209 / 16 / 4
Регистрация: 18.08.2009
Сообщений: 571
28.02.2010, 21:04
Otaka, Привет можеш мне подсказать принцип работи бота вот код моих крестиков ноликов:
C++
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Byte pole[3][3];
String vari[3]={" ","X","O"};
Byte turn=1;
Graphics::TBitmap *bmp1[3];
int intellect;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
bmp1[0]= new Graphics::TBitmap;
bmp1[1]= new Graphics::TBitmap;
bmp1[2]= new Graphics::TBitmap;
bmp1[0]->LoadFromFile("p.bmp");
bmp1[1]->LoadFromFile("k.bmp");
bmp1[2]->LoadFromFile("n.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender){klik(1);}
void __fastcall TForm1::Image2Click(TObject *Sender){klik(2);}
void __fastcall TForm1::Image3Click(TObject *Sender){klik(3);}
void __fastcall TForm1::Image4Click(TObject *Sender){klik(4);}
void __fastcall TForm1::Image5Click(TObject *Sender){klik(5);}
void __fastcall TForm1::Image6Click(TObject *Sender){klik(6);}
void __fastcall TForm1::Image7Click(TObject *Sender){klik(7);}
void __fastcall TForm1::Image8Click(TObject *Sender){klik(8);}
void __fastcall TForm1::Image9Click(TObject *Sender){klik(9);}
//---------------------------------------------------------------------------
void TForm1::vivod()
{
  for (int k=0;k<3;k++) {
  if (pole[0][0]==k) Form1->Canvas->Draw(10,10,bmp1[k]);
  if (pole[0][1]==k) Form1->Canvas->Draw(110,10,bmp1[k]);
  if (pole[0][2]==k) Form1->Canvas->Draw(210,10,bmp1[k]);
  if (pole[1][0]==k) Form1->Canvas->Draw(10,110,bmp1[k]);
  if (pole[1][1]==k) Form1->Canvas->Draw(110,110,bmp1[k]);
  if (pole[1][2]==k) Form1->Canvas->Draw(210,110,bmp1[k]);
  if (pole[2][0]==k) Form1->Canvas->Draw(10,210,bmp1[k]);
  if (pole[2][1]==k) Form1->Canvas->Draw(110,210,bmp1[k]);
  if (pole[2][2]==k) Form1->Canvas->Draw(210,210,bmp1[k]);
  } 
}
//-----------------------------------------------
void TForm1::klik(int n)
{
if (pole[0][n-1]==0) pole[0][n-1]=turn;
if (turn==1) turn=2;
else turn=1;
vivod();
if (prov()==1) return;
}
//----------------------------------------------------
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
Application->Terminate();        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
for (int i=0;i<3;i++) {
  for (int j=0;j<3;j++) {
    pole[i][j]=0;
    }
  }
vivod();        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
if (X>=10&&X<=100&&Y>=10&&Y<=100)    klik(1);
if (X>=110&&X<=200&&Y>=10&&Y<=100)   klik(2);
if (X>=210&&X<=300&&Y>=10&&Y<=100)   klik(3);
if (X>=10&&X<=100&&Y>=110&&Y<=200)   klik(4);
if (X>=110&&X<=200&&Y>=110&&Y<=200)  klik(5);
if (X>=210&&X<=300&&Y>=110&&Y<=200)  klik(6);
if (X>=10&&X<=100&Y>=210&&Y<=300)    klik(7);
if (X>=110&&X<=200&&Y>=210&&Y<=300)  klik(8);
if (X>=210&&X<=300&&Y>=210&&Y<=300)  klik(9);        
}
//---------------------------------------------------------------------------
int TForm1::prov()
{
for(int i=0;i<3;i++){
  if(pole[i][0]==pole[i][1]&&pole[i][1]==pole[i][2]&&pole[i][2])
  {over(pole[i][2]);return 1;}  //рядок
 }
 for(int i=0;i<3;i++){
  if(pole[0][i]==pole[1][i]&&pole[1][i]==pole[2][i]&&pole[2][i])
  {over(pole[2][i]);return 1;}  //стопчик
 }
 if(pole[0][0]==pole[1][1]&&pole[1][1]==pole[2][2]&&pole[2][2])
   {over(pole[2][2]);return 1;} //діагональ
 if(pole[0][2]==pole[1][1]&&pole[1][1]==pole[2][0]&&pole[2][0])
   {over(pole[2][0]);return 1;}
return 0;
}
//------------------------------------------------------------------------
void TForm1::over(int n)
{
if (n==1) ShowMessage("Победили хрестики!");
if (n==2) ShowMessage("Побелили нолики!");
if (n==3) ShowMessage("Нечья...");
//if (n==1&&n==2&&n==3) turn=0;
}
//---------------------------------------------------------------------------
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.02.2010, 21:48
А что сложного? Смотришь, если почти заполнена ботовская линия, её нужно заполнить, и тогда бот выиграл.
По самому простому алгоритму, можно делать так, чтобы в случае отсутствия опасности бот пытался заполнить какую-нибудь из линий, если опасность есть, бот должен её пресечь.
Если поле пусто, можно ставить наобум(куда угодно). Если почти заполнена линия человека, нужно тоже поставить свою фишку, чтобы не дать человеку победить. Вот и все. Когда готово это, можно пробовать реализовывать всяческие вилочки, ловушки итд.
0
 Аватар для gorin
209 / 16 / 4
Регистрация: 18.08.2009
Сообщений: 571
28.02.2010, 21:49
Otaka, Так это понятно а как запрограмировать сам ход компютера, а то чьото не как додуматсп не могу!!!!
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.02.2010, 21:51
Ну, например так:
C++
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
TForm1::HodComputera()
{
 
 //Поиск ситуаций, когда один ход сразу же принесет победу (0 0)
 for(int i=0;i<3;i++)
 {
 if((Game[0][i]==2)&&(Game[1][i]==2)&&(Game[2][i]==0)){Game[2][i]=2;return 0;} //110
 else
 if((Game[1][i]==2)&&(Game[2][i]==2)&&(Game[0][i]==0)){Game[0][i]=2;return 0;} //011
 else
 if((Game[0][i]==2)&&(Game[2][i]==2)&&(Game[1][i]==0)){Game[1][i]=2;return 0;} //101
 else                                                                    //вертикаль
 if((Game[i][0]==2)&&(Game[i][1]==2)&&(Game[i][2]==0)){Game[i][2]=2;return 0;} //110
 else
 if((Game[i][1]==2)&&(Game[i][2]==2)&&(Game[i][0]==0)){Game[i][0]=2;return 0;} //011
 else
 if((Game[i][0]==2)&&(Game[i][2]==2)&&(Game[i][1]==0)){Game[i][1]=2;return 0;} //101
 }                                                                           //Диагональ слева направо
 if((Game[0][0]==2)&&(Game[1][1]==2)&&(Game[2][2]==0)){Game[2][2]=2;return 0;} //110
 else
 if((Game[1][1]==2)&&(Game[2][2]==2)&&(Game[0][0]==0)){Game[0][0]=2;return 0;} //011
 else
 if((Game[0][0]==2)&&(Game[2][2]==2)&&(Game[1][1]==0)){Game[1][1]=2;return 0;} //101
 else                                                                        //Диагональ справа на лево
 if((Game[2][0]==2)&&(Game[1][1]==2)&&(Game[0][2]==0)){Game[0][2]=2;return 0;} //110
 else
 if((Game[1][1]==2)&&(Game[0][2]==2)&&(Game[2][0]==0)){Game[2][0]=2;return 0;} //011
 else
 if((Game[2][0]==2)&&(Game[0][2]==2)&&(Game[1][1]==0)){Game[1][1]=2;return 0;} //101
 
 
 
//Поиск опасных ситуаций  типа XX
 for(int i=0;i<3;i++)
 {
 if((Game[0][i]==1)&&(Game[1][i]==1)&&(Game[2][i]==0)){Game[2][i]=2;return 0;} //110
 else
 if((Game[1][i]==1)&&(Game[2][i]==1)&&(Game[0][i]==0)){Game[0][i]=2;return 0;} //011
 else
 if((Game[0][i]==1)&&(Game[2][i]==1)&&(Game[1][i]==0)){Game[1][i]=2;return 0;} //101
 else                                                                    //вертикаль
 if((Game[i][0]==1)&&(Game[i][1]==1)&&(Game[i][2]==0)){Game[i][2]=2;return 0;} //110
 else
 if((Game[i][1]==1)&&(Game[i][2]==1)&&(Game[i][0]==0)){Game[i][0]=2;return 0;} //011
 else
 if((Game[i][0]==1)&&(Game[i][2]==1)&&(Game[i][1]==0)){Game[i][1]=2;return 0;} //101
 }                                                                           //Диагональ слева направо
 if((Game[0][0]==1)&&(Game[1][1]==1)&&(Game[2][2]==0)){Game[2][2]=2;return 0;} //110
 else
 if((Game[1][1]==1)&&(Game[2][2]==1)&&(Game[0][0]==0)){Game[0][0]=2;return 0;} //011
 else
 if((Game[0][0]==1)&&(Game[2][2]==1)&&(Game[1][1]==0)){Game[1][1]=2;return 0;} //101
 else                                                                        //Диагональ справа на лево
 if((Game[2][0]==1)&&(Game[1][1]==1)&&(Game[0][2]==0)){Game[0][2]=2;return 0;} //110
 else
 if((Game[1][1]==1)&&(Game[0][2]==1)&&(Game[2][0]==0)){Game[2][0]=2;return 0;} //011
 else
 if((Game[2][0]==1)&&(Game[0][2]==1)&&(Game[1][1]==0)){Game[1][1]=2;return 0;} //101
 
 if(Game[1][1]==0){Game[1][1]=2;return 0;}
for(int j=0;j<3;j++)
        for(int i=0;i<3;i++)
                if(Game[i][j]==0){Game[i][j]=2;return 0;}
return 0;
}
 
int TForm1::TestForVictory()
{
for(int i=0;i<3;i++)
{
if((Game[i][0]==1)&&(Game[i][1]==1)&&(Game[i][2]==1))
{ViktoryLine1=Point(i,0);ViktoryLine2=Point(i,2);return 1;}
 
if((Game[0][i]==1)&&(Game[1][i]==1)&&(Game[2][i]==1))
{ViktoryLine1=Point(0,i);ViktoryLine2=Point(2,i);return 1;}
 
if((Game[i][0]==2)&&(Game[i][1]==2)&&(Game[i][2]==2))
{ViktoryLine1=Point(i,0);ViktoryLine2=Point(i,2);return 2;}
 
if((Game[0][i]==2)&&(Game[1][i]==2)&&(Game[2][i]==2))
{ViktoryLine1=Point(0,i);ViktoryLine2=Point(2,i);return 2;}
}
 
if((Game[0][0]==1)&&(Game[1][1]==1)&&(Game[2][2]==1))
{ViktoryLine1=Point(0,0);ViktoryLine2=Point(2,2);return 1;}
if((Game[2][0]==1)&&(Game[1][1]==1)&&(Game[0][2]==1))
{ViktoryLine1=Point(2,0);ViktoryLine2=Point(0,2);return 1;}
 
if((Game[0][0]==2)&&(Game[1][1]==2)&&(Game[2][2]==2))
{ViktoryLine1=Point(0,0);ViktoryLine2=Point(2,2);return 2;}
if((Game[2][0]==2)&&(Game[1][1]==2)&&(Game[0][2]==2))
{ViktoryLine1=Point(2,0);ViktoryLine2=Point(0,2);return 2;}
 
if(!EndOfGame)
{bool err=false;
for(int j=0;j<3;j++)
        for(int i=0;i<3;i++)
                if(Game[i][j]==0)err=true;
 
if(err==false)return 3;
}
return 0;
}
0
 Аватар для gorin
209 / 16 / 4
Регистрация: 18.08.2009
Сообщений: 571
28.02.2010, 21:53
Otaka, А для чего нам нужене этот метод int TForm1::TestForVictory()?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
28.02.2010, 21:56
А это проверка того, выиграл ли кто-то, но у тебя он, в принципе, уже есть, поэтому не обращай внимания на него.
1
 Аватар для gorin
209 / 16 / 4
Регистрация: 18.08.2009
Сообщений: 571
28.02.2010, 22:01
Otaka, У меня еще один вопрос!!!

Добавлено через 29 секунд
У мен при компиляции компютер ход не делает!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.02.2010, 22:01
Помогаю со студенческими работами здесь

Не могу продумать цикл. Игра крестики нолики.
Здраствуйте. Игра крестики нолики поле 9 на 9 победа возникает если 5 крестиков идут подряд не могу описать цикл который проходит по...

Крестики нолики
Я вот написал алгоритм для крестиков ноликов, а он чегото не работает( посмотрите пожалуйста. ...

Крестики Нолики
Здравствуйте есть одна проблема нашел на этом форуме исходники к игре крестики нолики однако не получается адекватно настроить начисление...

Крестики-нолики-ошибки
Добрый день. Я вот хотел посмотреть работу игры крестики-нолики (судя по всему, речь идет о этой теме...

Код игры Крестики Нолики
Нужно пояснение каждой строчки кода которая относится к самой игре. Хочу понять на чём построена игра. С++ начал изучать недавно. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru