Войти

Показать полную графическую версию : статистическая инфа по TBs/rts


kontox
23-10-2014, 11:59
Ребят подскажите пожалуйста, как можно собрать разную статистическую, аналитическую инфу по играм TBs/rts на платформе стим. Что вообще можно к этой инфе отнести?

mrcnn
23-10-2014, 16:27
Наименование
Разработчик
Издатель
Дата выхода
Платформы
Технология рендеринга
Системные требования
Цена

Собирать вручную можно и автоматически.

kontox
23-10-2014, 21:36
mrcnn, а как можно собирать автоматически.
Я думаю к стат.информации можно ещё отнести, пол ,возраст)

mrcnn
24-10-2014, 05:48
Вам о пользователях нужна статистическая информация, имеется в виду?

Автоматически можно собирать информацию, если будет написана программа, которая скачает страницы с сайта по протоколу http и обработает ее, получив с помощью разных методов обработки текста, сведения, которые находятся на странице. Во-первых, можно написать программу на языках C/C++/C#, во-вторых, на скриптовых языках таких как Perl и PHP. Скачивание производится с помощью сокетов, которые на самом низком уровне в операционной системе являются средством передачи данных по стеку протоколов TCP/IP. Автоматическая обработка текстов производится с помощью регулярных выражений.

На форумах программистов и на фриланс сайтах можно разместить объявление, что вам нужно за определенное количество часов сделать эту задачу, и вам ее быстро и качественно делают в случае если вы сами программировать не умеете.

kontox
24-10-2014, 13:01
mrcnn, ну вообще перед мной стоит задание подготовить краткую аналитику по рынку PC RTS/TBS на Steam платформе за 2014 год и прогноз развития рынка в 2015 году. Вот только исходные данные мне не дали)

mrcnn
24-10-2014, 15:02
Игры на платформе Steam можно разделить на две большие группы:
1. "древние" игры, которые вышли до условно 2006 года, имеющие простую, устаревшую графику
2. "современные" игры, которые вышли после условно 2006 года

Причем контент на платформе можно разделить на две группы
1. "платформа" игры, подобная диску
2. дополнения для игры, включающие пакеты каких-то данных(одежда, саундтрек, юниты и т.п.)

Нужно разделить проекты на:
1. готовые
2. проекты с ранним доступом, которые еще делаются и которые занимаются сбором средств для завершения проекта с использованием steam

Для платформы характерно указание разных жанров для одного проекта, что ставит необходимость вручную определять базовый жанр для игры. У меня не получается, например, точно понять, к какому жанру действительно относится игра.

По стоимости проекты можно разделить на:
1. бесплатные
2. платные

Стратегии вообще(без учёта steam) можно разделить на базовые крупные блоки:
1. RTS типа Warcraft, к которым можно отнести Starcraft, Warcraft II, Warcraft III
2. TBS типа Civilization
3. TBS типа Heroes of might and magic к которым возможно можно отнести disciples, king's bounty
4. экономические RTS типа port royale
5. строительные RTS типа sims
6. военные RTS типа sudden strike
7. исторические RTS типа total war
8. стратегии типа Victoria, день победы

Нужно отдельно рассмотреть крупные проекты, вышедшие в 2014, как то King's bounty: dark side, civilization: beyond earth и другие подобные. По цене применяется стртегия снятия сливок.

mrcnn
04-11-2014, 12:55
Попытался автоматически получить страницу. Сервер выдает 408 request timeout. Не знаю, как быть


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#pragma comment (lib, "wsock32.lib")

// буфер
struct buf
{
unsigned char* buf1;
int n;

buf() { n = 0; buf1 = NULL; }
~buf() { if (buf1) delete buf1;}
buf(int i) { buf1 = new unsigned char[i+1]; buf1[i] = '\0'; n = i; }
void add0(unsigned char a) { buf1 = new unsigned char[2]; buf1[0] = a; buf1[1] = '\0'; n = 1; }
void add(unsigned char a) { if (n == 0) { add0(a); print(); return; } int i; unsigned char* buf2 = new unsigned char[n+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; buf2[n] = a; buf2[n+1] = '\0'; n = n+1; delete [] buf1; buf1 = buf2; print(); }
void add10(unsigned char* a, int n1) { int i; buf1 = new unsigned char[n1+1]; for(i=0;i<n1;i++) buf1[i] = a[i]; buf1[n1] = '\0'; n = n1; }
void add1(unsigned char* a, int n1) { if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
int len(unsigned char* a) { int n; int i; n = 0; for(i=0; a[i]!='\0'; i++) n++; return n; }
void add1(unsigned char* a) { int n1 = len(a); if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
void print() { if (buf1) { int i; for(i=0;i<n;i++) printf("%c", buf1[i]); printf("\n"); } }
};

// HTTP-запрос
struct request
{
buf* t;
request() { t = 0; }
~request() { if(t) delete t; }
};

// адрес
struct address
{
buf* t;

address() { t = 0; }
~address() { if(t) delete t; }
};

// ссылка
struct link
{
buf* t;

link() { t = 0; }
~link() { if(t) delete t; }
};

// HTTP-ответ
struct response
{
buf* t;
response() { t = 0; }
~response() { if(t) delete t; }
};


// загрузчик
struct loader
{

WSADATA data;
SOCKET sock;
SOCKADDR_IN sockaddr;
PHOSTENT phe;
int i;
response* a;
char buf1[1024];
address* b;
request* c;

loader()
{
a = 0;
b = 0;
c = 0;
}

void create_object()
{
if (!a)
{
a = new response;
a->t = new buf;
}
if(!b)
{
b = new address;
b->t = new buf;
}
if (b->t)
b->t->add1( (unsigned char* ) "steampowered.com\0" ); // problem 0: don't know why explicit conversion: (unsogned char* )
else
exit(0);
if (!(b->t))
exit(0);
}

void socket_startup()
{
WSAStartup(0x101, &data);
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == 0)
exit(0);
}

void create_address()
{
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(80);
if (b->t)
phe = gethostbyname((char * )b->t->buf1);
else
exit(0);
memcpy((char FAR*)&(sockaddr.sin_addr), phe->h_addr, phe->h_length);
}

void socket_connect()
{
connect(sock, (PSOCKADDR) &sockaddr,sizeof(sockaddr));
}

void create_request()
{
c = new request;
c->t = new buf;
c->t->add1( (unsigned char* ) "GET /\nHost: \0");
c->t->add1( (unsigned char* ) b->t->buf1, b->t->len(b->t->buf1));
c->t->add1( (unsigned char* ) "\n\n\0");
}

void socket_send()
{
send(sock, (char *) c->t->buf1, 21, NULL);
}

void socket_shutdown()
{
WSACleanup();
}

void socket_recv()
{
while (recv(sock, buf1, 1024, NULL))
{
printf("%s\n",buf1);


for(i=0; buf1[i] != '\0' && i < 1024; i++)
;
a->t->add1( (unsigned char* ) buf1, i+1);

}
}

void main() {
create_object();
socket_startup();
create_address();
socket_connect();
create_request();
socket_send();
socket_recv();
socket_shutdown();
}

};


int main()
{
loader x;
x.main();

return 0;
}


Загрузчик пишется примерно следующим образом

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#pragma comment (lib, "wsock32.lib")



// буфер
struct buf
{
unsigned char* buf1;
int n;

buf() { n = 0; buf1 = 0; }
~buf() { if (buf1) delete buf1;}
buf(int i) { buf1 = new unsigned char[i+1]; buf1[i] = '\0'; n = i; }
void add0(unsigned char a) { buf1 = new unsigned char[2]; buf1[0] = a; buf1[1] = '\0'; n = 1; }
void add_(unsigned char a) { if (n == 0) { add0(a); return; } int i; unsigned char* buf2 = new unsigned char[n+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; buf2[n] = a; buf2[n+1] = '\0'; n = n+1; delete [] buf1; buf1 = buf2; }
void add(unsigned char a) { if (n == 0) { add0(a); print(); return; } int i; unsigned char* buf2 = new unsigned char[n+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; buf2[n] = a; buf2[n+1] = '\0'; n = n+1; delete [] buf1; buf1 = buf2; print(); }
void add10(unsigned char* a, int n1) { int i; buf1 = new unsigned char[n1+1]; for(i=0;i<n1;i++) buf1[i] = a[i]; buf1[n1] = '\0'; n = n1; }
void add1_(unsigned char* a, int n1) { if (n == 0) { add10(a, n1); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; delete [] buf1; buf1 = buf2; }
void add1(unsigned char* a, int n1) { if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
int len(unsigned char* a) { int n; int i; n = 0; for(i=0; a[i]!='\0'; i++) n++; return n; }
void add1_(unsigned char* a) { int n1 = len(a); if (n == 0) { add10(a, n1); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; delete [] buf1; buf1 = buf2; }
void add1(unsigned char* a) { int n1 = len(a); if (n == 0) { add10(a, n1); print(); return; } int i, j; unsigned char* buf2 = new unsigned char[n + n1+2]; for(i=0;i<n;i++) buf2[i] = buf1[i]; for(i=n,j=0;j<n1;j++, i++) buf2[i] = a[j]; buf2[n+n1] = '\0'; n = n + n1; printf("%d\n", n);delete [] buf1; buf1 = buf2; print(); }
void print() { if (buf1) { int i; for(i=0;i<n;i++) printf("%c", buf1[i]); printf("\n"); } }

void print1()
{
struct link* fg;
int state = 0;
buf* link1 = new buf;
int f;
f = 0;
int k;
k = 0;

if (buf1)
{
int i;
for(i=0;i<n;i++)
{
if (buf1[i] == '>')
printf("%c\n", buf1[i]);
else if (buf1[i] == '<')
printf("\n%c", buf1[i]);
else if (buf1[i] == '=')
printf(" %c ", buf1[i]);
else
{
if (buf1[i] == 'h' && f == 0)
f++;
else if (buf1[i] == 't' && f == 1)
f++;
else if (buf1[i] != 't' && f == 1)
f=0;
else if (buf1[i] == 't' && f == 2)
f++;
else if (buf1[i] != 't' && f == 2)
f=0;
else if (buf1[i] == 'p' && f == 3)
f++;
else if (buf1[i] != 'p' && f == 3)
f=0;
else if (buf1[i] == ':' && f == 4)
f++;
else if (buf1[i] != ':' && f == 4)
f=0;
else if (buf1[i] == '/' && f == 5)
f++;
else if (buf1[i] != '/' && f == 5)
f=0;
else if (buf1[i] == '/' && f == 6)
f++;
else if (buf1[i] != '/' && f == 6)
f=0;

if (buf1[i] == '"' && f == 7)
{
FILE* f1;
char atr[15];
sprintf(atr, "atr%d\0", k);
f1 = fopen(atr, "w");
fprintf(f1, "%s", link1->buf1);
fclose(f1);
delete link1;
link1 = new buf;
k++;

f = 0;
}

if (f == 7)
{
link1->add_(buf1[i]);
}

printf("%c", buf1[i]);
}
}
printf("\n");
}
}



};

// HTTP-запрос
struct request
{
buf* t;
request() { t = 0; }
~request() { if(t) delete t; }
};

// адрес
struct address
{
buf* t;

address() { t = 0; }
~address() { if(t) delete t; }
};

// HTTP-ссылка
struct link
{
buf* t;
link* next;

buf* host;
buf* page;

link() { t = 0; next = 0; host = 0; page=0; }
link(buf* p) { next = 0; t = new buf; t->add1_(p->buf1); host = 0; page=0; }
~link() { if(t) delete t; }
void add(struct buf *p) { t = new buf; t->add1_(p->buf1); }
void add_next(struct buf *p) { link* y = this; while(y->next) y = y->next; y->next = new link(p); }
void print() { printf("link: "); t->print(); if(next) next->print();}

void print1(buf* u)
{
buf* link1 = new buf;
int i;
int f;
int k;
int state;
f = 0;
k = 0;
if (!t) state = 0;
else state = 1;
if (u->buf1)
{
for(i=0;i<u->len(u->buf1);i++)
{
if (u->buf1[i] == '>') ; else if (u->buf1[i] == '<') ; else if (u->buf1[i] == '=') ;
else
{
if (u->buf1[i] == 'h' && f == 0) f++;
else if (u->buf1[i] == 't' && f == 1) f++; else if (u->buf1[i] != 't' && f == 1) f=0;
else if (u->buf1[i] == 't' && f == 2) f++; else if (u->buf1[i] != 't' && f == 2) f=0;
else if (u->buf1[i] == 'p' && f == 3) f++; else if (u->buf1[i] != 'p' && f == 3) f=0;
else if (u->buf1[i] == ':' && f == 4) f++; else if (u->buf1[i] != ':' && f == 4) f=0;
else if (u->buf1[i] == '/' && f == 5) f++; else if (u->buf1[i] != '/' && f == 5) f=0;
else if (u->buf1[i] == '/' && f == 6) f++; else if (u->buf1[i] != '/' && f == 6) f=0;
if (u->buf1[i] == '"' && f == 7)
{
if (state == 0) { add(link1); state = 1; }
else add_next(link1);
delete link1;
link1 = new buf;
k++;
f = 0;
}
if (f == 7) link1->add_(u->buf1[i]);
}
}
}
}

void _host()
{
int state = 0;
int i;
host = new buf;
page = new buf;
for(i=0; i<t->len(t->buf1); i++)
{
if (state == 0 && t->buf1[i] == '/') { state = 1; }
else if (state == 1 && t->buf1[i] != '/') { printf("%c", t->buf1[i]); host->add_(t->buf1[i]); }
else if (state == 1 && t->buf1[i] == '/') { state = 2; }
else if (state == 1 && t->buf1[i] == ' ') { state = 3; delete page; page = 0; }
else if (state == 1 && t->buf1[i] == '\x0d') { state = 3; delete page; page = 0; }
else if (state == 2) { state = 4; printf("%c", t->buf1[i]); page->add_(t->buf1[i]);}
else if (state == 4) { printf("%c", t->buf1[i]); page->add_(t->buf1[i]);}
}
if (state == 1 || state == 2)
{
delete page; page = 0;
}

if (host)
{
printf("host: ");
host->print();
printf("\n");
}
if (page)
{
printf("page: ");
page->print();
printf("\n");
}
}

};

// HTTP-ответ
struct response
{
buf* t;
response() { t = 0; }
~response() { if(t) delete t; }
};


// загрузчик
struct loader
{
WSADATA data;
SOCKET sock;
SOCKADDR_IN sockaddr;
PHOSTENT phe;
int i;
response* a;
char buf1[1024];
address* b;
request* c;
link* d;

loader() { a = 0; b = 0; c = 0; d = 0; }
void create_object(unsigned char* addr) { if (!a) { a = new response; a->t = new buf; } if(!b) { b = new address; b->t = new buf; } if(!d) { d = new link; } if (b->t) b->t->add1( (unsigned char* ) addr ); }
void create_address(unsigned char* addr) { sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(80); phe = gethostbyname((char * ) addr); memcpy((char FAR*)&(sockaddr.sin_addr), phe->h_addr, phe->h_length); }
void create_request(buf* p, buf* p1) { if (c) delete c; c = new request; c->t = new buf; c->t->add1( (unsigned char* ) "GET /\0"); if (p1) c->t->add1( (unsigned char* ) p1->buf1, p1->len(p1->buf1)); c->t->add1( (unsigned char* ) "\nHost: \0"); c->t->add1( (unsigned char* ) p->buf1, p->len(p->buf1)); c->t->add1( (unsigned char* ) "\n\n\0"); }
void socket_startup() { WSAStartup(0x101, &data); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == 0) exit(0); }
void socket_connect() { connect(sock, (PSOCKADDR) &sockaddr,sizeof(sockaddr)); }
void socket_send() { send(sock, (char *) c->t->buf1, c->t->len(c->t->buf1), NULL); }
void socket_shutdown() { WSACleanup(); }

void socket_recv()
{
int state;
state = 0;
while (recv(sock, buf1, 1024, NULL))
{
printf("%s\n",buf1);
for(i=0; buf1[i] != '\0' && i < 1024; i++);
a->t->add1_( (unsigned char* ) buf1, i+1);
}
d->print1(a->t);
d->print();
delete a->t;
a->t = new buf;
}

void get_links()
{
printf("get_links\n");
link* cl = d;
cl->_host();
while(cl->next)
{
socket_startup();
create_address(cl->host->buf1);
socket_connect();
create_request(cl->host, cl->page);
socket_send();
socket_recv();
socket_shutdown();
cl = cl->next;
cl->_host();
}
}
void main()
{
create_object((unsigned char*)"ya.ru\0");
socket_startup();
create_address(b->t->buf1);
socket_connect();
create_request(b->t, 0);
socket_send();
socket_recv();
socket_shutdown();
get_links();
}

};


int main()
{
loader x;
x.main();

return 0;
}

kontox
10-11-2014, 19:19
mrcnn, долго меня не было, хотел Вам в ЛС написать, но у Вас видимо он переполнен.




© OSzone.net 2001-2012