Я очень новичок в программировании, и я экспериментировал с сетевой библиотекой SFML (идея такова: игра в крестики-нолики с сервером и клиентом).
Извините, большинство не на английском, но япришлось бы изменить почти все имена переменных и объектов, и я бы наверняка забыл о некоторых, что вызвало бы больше путаницы.
Я включу весь код, но проблема в отправке пакета
Я пытался зациклить его так, но он просто застревает в этом цикле.
Pakiet.clear();
Pakiet<<MapaStr;
while(Gniazdo.send(Pakiet,IP,port) != sf::Socket::Done)
{
Pakiet.clear();
Pakiet<<MapaStr;
}
Проблема:
if (event.mouseButton.button == sf::Mouse::Left && event.type == sf::Event::MouseButtonReleased)
{
if(naszKsztalt == kto)
{
if(naszKsztalt=='x')
Pola[myszkaX][myszkaY] = 'x';
else
Pola[myszkaX][myszkaY] = 'o';
for (int q = 0; q < 3; q++)
{
for (int t = 0; t < 3; t++)
{
MapaStr[q * 3 + t] = Pola[q][t];
}
}
Pakiet.clear();
Pakiet<<MapaStr;
Gniazdo.send(Pakiet,IP,port);
}
}
Весь код клиента, если вынужно это увидеть:
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>
int myszkaX,myszkaY;
sf::UdpSocket Gniazdo;
sf::IpAddress IP;
sf::Packet Pakiet;
unsigned short port;
int main()
{sf::Texture txtX,txtO;
if(!txtX.loadFromFile("X.png")) std::cout<<"Wczytywanie tekstury zakonczone niepowodzeniem."<<std::endl;
if(!txtO.loadFromFile("O.png")) std::cout<<"Wczytywanie tekstury zakonczone niepowodzeniem."<<std::endl;
std::string wiadomosc = "TESTOWA WIADOMOSC";
std::string IP__;
std::cout<<"IP serwera"<<std::endl;
/// std::cin>>IP__;
std::cout<<"Port na ktorym nasluchuje serwer"<<std::endl;
std::cin>>port;
Gniazdo.bind(sf::Socket::AnyPort);
Gniazdo.send(wiadomosc.c_str(), wiadomosc.size(),IP ,port);
///used "IP" here, because I'd rather it stayed not open to the public
char OdebranaWiad[1024];
std::size_t received = 0;
Gniazdo.setBlocking(true);
std::string testowaodp;
if(!Gniazdo.receive(Pakiet,IP,port)) std::cout<<"nie udalo sie odebrac pakietu"<<std::endl;
//!(Pakiet >> testowaodp)
Pakiet >> testowaodp;
std::cout << IP.toString() << " said: " << testowaodp << std::endl;
std::cout<<"LUL"<<std::endl;
Gniazdo.receive(Pakiet,IP,port);
unsigned short klucz;
Pakiet>>klucz;
std::cout<<"Nowy port dla polaczenia z serwerem : "<<port<<std::endl;
Sleep(3000);
/*Gniazdo.unbind();
Gniazdo.bind(port);*/
Gniazdo.setBlocking(true);
bool Czy2GraczJest=false;
std::string tempstr = "Serwer Oczekuje Na Drugiego Gracza";
std::string XczyO;
system("cls");
for(int i = 0;i<tempstr.length();i++)
{
std::cout<<tempstr[i];
Sleep(100);
}
bool CzyJa;
Gniazdo.receive(Pakiet,IP,port);
Pakiet>>Czy2GraczJest>>XczyO>>CzyJa;
std::cout<<XczyO<<std::endl;
Pakiet.clear();
std::string MapaStr = {"_________"};
sf::RenderWindow window(sf::VideoMode(900, 900), "SFML works!");
sf::RectangleShape celownik;
celownik.setOutlineColor(sf::Color::White);
celownik.setFillColor(sf::Color(255,219,151,200));
celownik.setOutlineThickness(3.0f);
celownik.setOutlineColor(sf::Color(255,219,0,150));
celownik.setSize(sf::Vector2f(300.f,300.f));
sf::Sprite PolaSprite[3][3];
Gniazdo.setBlocking(false);
for (int i = 0; i<3;i++)
{
for (int k = 0; k<3;k++)
{
PolaSprite[i][k].setPosition(sf::Vector2f(i*300,k*300));
}
}
char Pola[3][3];
for (int i = 0; i<3;i++)
{
for (int k = 0; k<3;k++)
{
Pola[i][k] = ' ';
}
}
char naszKsztalt;
char kto ='o';
if(XczyO == "Jestes O") naszKsztalt = 'o';
else naszKsztalt = 'x';
bool potwierdzenie = false;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
myszkaX = sf::Mouse::getPosition(window).x/300;
myszkaY = sf::Mouse::getPosition(window).y/300;
celownik.setPosition(sf::Vector2f(myszkaX*300,myszkaY*300));
if (event.type == sf::Event::Closed) window.close();
if (event.mouseButton.button == sf::Mouse::Left && event.type == sf::Event::MouseButtonReleased)
{
if(naszKsztalt == kto)
{
if(naszKsztalt=='x') Pola[myszkaX][myszkaY] = 'x';
else Pola[myszkaX][myszkaY] = 'o';
for (int q = 0; q < 3; q++)
{
for (int t = 0; t < 3; t++)
{
MapaStr[q * 3 + t] = Pola[q][t];
}
}
Pakiet.clear();
Pakiet<<MapaStr;
Gniazdo.send(Pakiet,IP,port)
}
}
}
Gniazdo.receive(Pakiet,IP,port);
Pakiet>>MapaStr>>&kto;
{
int q = 0;
for (int i = 0; i<3;i++)
{
for (int k = 0; k<3;k++)
{
///TUTAJ ZE STRING NA CHAR
Pola[i][k] = MapaStr[q];
q++;
}
}
}
for (int i = 0; i<3;i++)
{
for (int k = 0; k<3;k++)
{
if(Pola[i][k]=='x') PolaSprite[i][k].setTexture(txtX);
if(Pola[i][k]=='o') PolaSprite[i][k].setTexture(txtO);
}
}
//system("cls");
std::cout<<MapaStr.size()<<std::endl;
window.clear();
std::cout<<"JESTEM W PKT 4"<<std::endl;
for (int i = 0; i<3;i++)
{
for (int k = 0; k<3;k++)
{
std::cout<<Pola[i][k];
}
std::cout<<std::endl;
}
for (int i = 0; i<3;i++)
{
for (int k = 0; k<3;k++)
{
window.draw(PolaSprite[i][k]);
}
}
window.draw(celownik);
window.display();
;
}
return 0;
}