int sz;
char buf[1024];
while(1)
{ char msg[101]={0};
scanf("%100[^\n]%*c",msg);
if(!msg[0]) break; // если введена пустая строка
// передать строку на сервер - можно передать любую струкутру данных
send(s, msg, strlen(msg), 0);
// принять ответ - можно получать любую структуру, возвращается количество полученных байт
if((sz = recv(s, buf, sizeof(buf)-1, 0))<=0) break; // передача была завершена сервером
buf[sz]=0; // вывести ответ
printf("%s\n",buf);
}
// завершить передачу
shutdown(s, SD_SEND);
closesocket(s);
```
// проверка попадания на пункт меню
int on_menu_item(menu_item *mi, int mx, int my) {
return mi->x<=mx && mx<=mi->x+mi->w && mi->y<=my && my<=mi->y+mi->h;
}
// пункты главного меню
menu_item main_menu[4]= {
{(MAXW-MENU_WIDTH)/2,100,MENU_WIDTH,30,"Новая игра"},
{(MAXW-MENU_WIDTH)/2,200,MENU_WIDTH,30,"Правила игры"},
{(MAXW-MENU_WIDTH)/2,300,MENU_WIDTH,30,"О программе"},
{(MAXW-MENU_WIDTH)/2,400,MENU_WIDTH,30,"Выход"}
};
// выбор из меню
int select_menu(menu_item menu[], int nmenu) {
int si=0; // текущий выбранный пункт
while (1) {
setbkcolor(LIGHTGRAY);
clearviewport();
for (int i=0; i<nmenu; ++i)
draw_menu_item(&main_menu[i],si==i);
int k=getch(2);
if (k==KEY_SPECIAL+KEY_UP) {
if (si>0) --si;
else si=3;
}
else if (k==KEY_SPECIAL+KEY_DOWN) {
if (si<nmenu-1) ++si;
else si=0;
}
else if (k==KEY_ENTER)
return si;
else if (k==KEY_ESC)
return nmenu-1;
else if (k==MOUSE_LCLICK) {
int mx=mousex(), my=mousey();
for (int i=0; i<nmenu; ++i)
if (on_menu_item(&menu[i],mx,my)) return i;
}
}
}
const char *rules_text[7]= {
"В игре в слова участвуют 2 человека.",
"Каждый участник называет слово в именительном падеже, начинающееся на букву,",
"которой заканчивается слово, названное предыдущим участником.",
"Первый участник может назвать слово, начинающееся с любой буквы.",
"Если слово заканчивается на ь, ъ или ы, то выбирается предыдущая буква.",
"Нельзя называть слово, которое уже было названо предыдущим участником.",
"Чтобы сдаться, нажмите клавишу Esc."
};
// вывод правил
void rules() {
setbkcolor(BLUE);
clearviewport();
setcolor(WHITE);
for (int i=0; i<7; ++i)
outtextxy(10,i*20+5,rules_text[i]);
getch(2);
}
// о программе
void about() {
setbkcolor(BLACK);
clearviewport();
setcolor(YELLOW);
outtextxy(10,10,"Пример программы");
getch(2);
}
int nwords=0; // количество слов
char words[1000][32]; // использованные слова
char last_bukva=0; // последняя буква
int iplayer; // текущий игрок 1-клиент 2-сервер
// вывод сообщения
void show_message(const char fmt[], int i) {
char msg[100];
setfillstyle(SOLID_FILL,LIGHTGRAY);
bar(10,40,500,70);
setcolor(BLACK);
sprintf(msg,fmt,i);
outtextxy(10,40,msg);
}
// ввод строки
void input_string(int x, int y, char s[], int maxlen) {
int len=0;
s[0]=0;
int flg=0;
if (nwords==0)
show_message("Введите слово",0);
else
show_message("Введите слово, начинающееся с %c",last_bukva);
while (1) {
setfillstyle(SOLID_FILL,BLACK);
bar(x,y,x+textwidth("ш")*maxlen,y+30);
setcolor(WHITE);
setbkcolor(NO_COLOR);
outtextxy(x+2,y+5,s);
int k=getch(1);
char c=k; // так как нужно сравнивать с [signed] char
show_message("",0);
if (k==KEY_ENTER && len>0) {
s[len]=0;
flg=1;
for (int i=0; i<nwords; ++i)
if (strcmp(words[i],s)==0) {
flg=0;
break;
}
if (flg==1) return;
show_message("Слово уже называлось",0);
}
else if (k==KEY_BACKSPACE && len>0) {
--len;
s[len]=0;
}
else if (k==KEY_ESC) {
s[0]='-'; // Сдаться
s[1]=0;
return;
}
else if (len==0 && last_bukva!=0 && c!=last_bukva)
show_message("Слово должно начинаться с буквы %c",last_bukva);
else if ((c>='а' && c<='я') || c=='ё') {
s[len++]=c;
s[len]=0;
}
else
show_message("Слово должно содержать русские буквы",0);
}
}
// добавить слово и вывести
void add_word(const char w[]) {
int len=strlen(w)-1;
if (w[len]=='ь' || w[len]=='ъ' || w[len]=='ы')
len--;
last_bukva=w[len];
strcpy(words[nwords],w);
setcolor(BLACK);
outtextxy((nwords/15)*200+10,(nwords%15)*30+100,w);
nwords++;
}
// игра
void game() {
char word[32];