toh com serios problemas num jogo da cobrinha q eu fiz akew....
a logica dele é simples...ele adiciona um ponto a frent da atual cabeça e depois o atribui para uma variavel cauda(tail) e segue todos os pontos proximos por if....
o foda é que quando ela axa mais de um caminho possivel dá bug...entaum eu usei algo parecido com um bool para poder tirar a
probabilidade de ir nos dois caminhos... o problema é q se a cobra ir para o ponto errado (ela sempre faz
isso....aff danada!!!)babaus... entaum eu usei uma função ow coisa parecida para determinar um nivel
de prioridade para q ela faça sempre a escolha certa.....
mas quando passa uma parte do corpo da cobra ao lado do resto do corpo dela e clika para esquerda ou direita (se ela tiver subindo ou descendo) ou para cima ou baixo (se ela tiver para direita ou esquerda) gera um conflito com a prioridade gerando um loop-in infinito dentro do laço for.....dai eu adicionei um contador para impedir o loop-in infinito e concertou em duas posiçoes só q nas outras duas acontecem erros muito feios.....quem puder dá uma olhada e compilar o codigo pra fragar direito o problema....
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
void MAP();
void CONTROL();
void FOOD();
void PRIORITY();
int option, i, j, tail_x, tail_y, food_x, food_y, priority, contador;
const int com = 20, lar = 50;
int block [com][lar];
int snake_x = 10, snake_y = 25, head_x = -1, head_y = 0, size = 3, off = 0, points = 0;
int speed = 2, pr_u = 1, pr_d = 2, pr_l = 3, pr_r = 4;
char key2, key = 'w', key_up = 'w', key_down = 's', key_left = 'a', key_right = 'd';
bool end = false, upgrade = false, start_food = false, r = false, l = false, u = true, d = false, end_turn = false;
int main()
{
do
{
system("color 1f");
cout<<"\n\n\t\t\t SNAKE --- NEW VERSION\n\n";
cout<<"\t\t This Game is a product by Lukaum\n\n\n\n";
if (key == 'x')
{
cout<<"0_ Continue\n";
}
cout<<"1_ Play\n";
cout<<"2_ Instructions\n";
cout<<"3_ Option\n";
cout<<"4_ Exit\n";
cin>>option;
if (option == 1 || (option == 0 && key == 'x'))
{
system("cls");
if (option == 0 && key == 'x')
{
key = key_up;
}
else
{
snake_x = 10, snake_y = 25, head_x = -1, head_y = 0, size = 3, off = 0, points = 0;
key = key_up;
start_food = false;
for (i = 0; i < com; i++)
{
for (j = 0; j < lar; j++)
{
block [i][j] = ' ';
}
}
for (i = 0; i < com; i++)
{
block [i][0] = char(186);
block [i][lar - 1] = char(186);
}
for (j = 0; j < lar; j++)
{
block [0][j] = char(205);
block [com - 1][j] = char(205);
}
block [0][0] = char(201);
block [com - 1][0] = char(200);
block [0][lar - 1] = char(187);
block [com - 1][lar - 1] = char(188);
block [snake_x][snake_y] = char(254);
block [snake_x + 1][snake_y] = char(254);
block [snake_x + 2][snake_y] = char(254);
}
do
{
MAP();
FOOD();
CONTROL();
snake_x += head_x;
snake_y += head_y;
if (block [snake_x][snake_y] == char(186) || block [snake_x][snake_y] == char(205) || block [snake_x][snake_y] == char(254))
{
end = true;
}
else
{
if (block [snake_x][snake_y] == '*')
{
size++;
upgrade = true;
start_food = false;
points += (5 * speed);
}
block [snake_x][snake_y] = char(254);
PRIORITY();
tail_x = snake_x;
tail_y = snake_y;
contador = 4 * size;
if (upgrade != true)
{
for (i = 0; i < size; i++)
{
if (block [tail_x + 1][tail_y] == char(254) && off != 2 && end_turn != true && pr_u == priority)
{
tail_x += 1;
off = 1;
end_turn = true;
}
if (block [tail_x - 1][tail_y] == char(254) && off != 1 && end_turn != true && pr_d == priority)
{
tail_x -= 1;
off = 2;
end_turn = true;
}
if (block [tail_x][tail_y - 1] == char(254) && off != 4 && end_turn != true && pr_r == priority)
{
tail_y -= 1;
off = 3;
end_turn = true;
}
if (block [tail_x][tail_y + 1] == char(254) && off != 3 && end_turn != true && pr_l == priority)
{
tail_y += 1;
off = 4;
end_turn = true;
}
if (end_turn != true)
{
if (priority > 3)
{
priority = 1;
}
else
{
priority++;
}
i--;
if (contador == 0)
{
i = size;
}
}
contador--;
end_turn = false;
}
off = 0;
block [tail_x][tail_y] = ' ';
}
cout<<"Points: "<<points;
upgrade = false;
Sleep(200 / speed);
system("cls");
}
}while (key != 'x' && end != true);
if (end == true)
{
system("cls");
cout<<"\n\n\n\n\t\t\t\tYOU LOSE!!!!\n\n\n\n\n";
cout<<"\n\n\n\n\t\t\t\tyou did "<<points;
cout<<" points \n\n\n";
cout<<"press ENTER to continue...";
system("pause > nul");
system("cls");
}
if (key != 'x')
{
snake_x = 10, snake_y = 25, head_x = -1, head_y = 0, size = 3, off = 0, points = 0;
end = false, upgrade = false, start_food = false, r = false, l = false, u = true, d = false;
}
}
if (option == 2)
{
system("cls");
cout<<"\n\n\n\nUse the buttons: 'w', 's', 'd', 'a', for up, down, right and left, respective.\n\n";
cout<<"Click in 'x' for pause the game.\n\n";
cout<<"Change the keys and the snake's speed in the menu, options.\n\n\n\n";
cout<<"press ENTER to continue...";
system("pause > nul");
system("cls");
}
if (option == 3)
{
do
{
system("cls");
cout<<"\n\n\n\nUse the keys '+' or '-' for change the snake's speed\n\n";
cout<<"Use 'e' for edit the control. (just use characters)\n\n";
cout<<"Press 'x' for exit of this options.\n\n";
cout<<"Speed of Snake: "<<speed;
if (kbhit())
{
key2 = getch();
if (key2 == '+' && speed != 5)
{
speed++;
}
if (key2 == '-' && speed != 1)
{
speed--;
}
if (key2 == 'e')
{
cout<<"\nType the up key: ";
cin>>key_up;
cout<<"\nType the down key: ";
cin>>key_down;
cout<<"\nType the left key: ";
cin>>key_left;
cout<<"\nType the right key: ";
cin>>key_right;
}
}
}while (key2 != 'x');
system("cls");
key2 = 'o';
}
}while (option != 4);
return 0;
}
void MAP()
{
for (i = 0; i < com; i++)
{
printf("\t ");
for (j = 0; j < lar; j++)
{
printf("%c", block [i][j]);
}
printf("\n");
}
}
void CONTROL()
{
if (kbhit())
{
key = getch();
if (key == key_up && d != true)
{
head_x = -1;
head_y = 0;
u = true;
d = false;
l = false;
r = false;
}
if (key == key_down && u != true)
{
head_x = 1;
head_y = 0;
u = false;
d = true;
l = false;
r = false;
}
if (key == key_left && r != true)
{
head_x = 0;
head_y = -1;
u = false;
d = false;
l = true;
r = false;
}
if (key == key_right && l != true)
{
head_x = 0;
head_y = 1;
u = false;
d = false;
l = false;
r = true;
}
}
}
void FOOD()
{
int x;
bool y = true;
srand(time(NULL));
food_x = rand() % (com - 1);
food_y = rand() % (lar - 1);
while (y == true)
{
for (x = 0; x < 255; x++)
{
if (block [food_x][food_y] == char(x))
{
if (x == 254 || x == 186 || x == 187 || x == 188 || x == 200 || x == 201 || x == 205)
{
food_x = rand() % (com - 1);
food_y = rand() % (lar - 1);
}
else
{
y = false;
}
}
}
}
if (start_food != true)
{
block [food_x][food_y] = '*';
start_food = true;
}
}
void PRIORITY()
{
if (u == true)
{
priority = 1;
}
if (d == true)
{
priority = 2;
}
if (l == true)
{
priority = 3;
}
if (r == true)
{
priority = 4;
}
}
Pergunta
LuKaum
toh com serios problemas num jogo da cobrinha q eu fiz akew....
a logica dele é simples...ele adiciona um ponto a frent da atual cabeça e depois o atribui para uma variavel cauda(tail) e segue todos os pontos proximos por if....
o foda é que quando ela axa mais de um caminho possivel dá bug...entaum eu usei algo parecido com um bool para poder tirar a
probabilidade de ir nos dois caminhos... o problema é q se a cobra ir para o ponto errado (ela sempre faz
isso....aff danada!!!)babaus... entaum eu usei uma função ow coisa parecida para determinar um nivel
de prioridade para q ela faça sempre a escolha certa.....
mas quando passa uma parte do corpo da cobra ao lado do resto do corpo dela e clika para esquerda ou direita (se ela tiver subindo ou descendo) ou para cima ou baixo (se ela tiver para direita ou esquerda) gera um conflito com a prioridade gerando um loop-in infinito dentro do laço for.....dai eu adicionei um contador para impedir o loop-in infinito e concertou em duas posiçoes só q nas outras duas acontecem erros muito feios.....quem puder dá uma olhada e compilar o codigo pra fragar direito o problema....
#include <iostream> #include <conio.h> #include <windows.h> using namespace std; void MAP(); void CONTROL(); void FOOD(); void PRIORITY(); int option, i, j, tail_x, tail_y, food_x, food_y, priority, contador; const int com = 20, lar = 50; int block [com][lar]; int snake_x = 10, snake_y = 25, head_x = -1, head_y = 0, size = 3, off = 0, points = 0; int speed = 2, pr_u = 1, pr_d = 2, pr_l = 3, pr_r = 4; char key2, key = 'w', key_up = 'w', key_down = 's', key_left = 'a', key_right = 'd'; bool end = false, upgrade = false, start_food = false, r = false, l = false, u = true, d = false, end_turn = false; int main() { do { system("color 1f"); cout<<"\n\n\t\t\t SNAKE --- NEW VERSION\n\n"; cout<<"\t\t This Game is a product by Lukaum\n\n\n\n"; if (key == 'x') { cout<<"0_ Continue\n"; } cout<<"1_ Play\n"; cout<<"2_ Instructions\n"; cout<<"3_ Option\n"; cout<<"4_ Exit\n"; cin>>option; if (option == 1 || (option == 0 && key == 'x')) { system("cls"); if (option == 0 && key == 'x') { key = key_up; } else { snake_x = 10, snake_y = 25, head_x = -1, head_y = 0, size = 3, off = 0, points = 0; key = key_up; start_food = false; for (i = 0; i < com; i++) { for (j = 0; j < lar; j++) { block [i][j] = ' '; } } for (i = 0; i < com; i++) { block [i][0] = char(186); block [i][lar - 1] = char(186); } for (j = 0; j < lar; j++) { block [0][j] = char(205); block [com - 1][j] = char(205); } block [0][0] = char(201); block [com - 1][0] = char(200); block [0][lar - 1] = char(187); block [com - 1][lar - 1] = char(188); block [snake_x][snake_y] = char(254); block [snake_x + 1][snake_y] = char(254); block [snake_x + 2][snake_y] = char(254); } do { MAP(); FOOD(); CONTROL(); snake_x += head_x; snake_y += head_y; if (block [snake_x][snake_y] == char(186) || block [snake_x][snake_y] == char(205) || block [snake_x][snake_y] == char(254)) { end = true; } else { if (block [snake_x][snake_y] == '*') { size++; upgrade = true; start_food = false; points += (5 * speed); } block [snake_x][snake_y] = char(254); PRIORITY(); tail_x = snake_x; tail_y = snake_y; contador = 4 * size; if (upgrade != true) { for (i = 0; i < size; i++) { if (block [tail_x + 1][tail_y] == char(254) && off != 2 && end_turn != true && pr_u == priority) { tail_x += 1; off = 1; end_turn = true; } if (block [tail_x - 1][tail_y] == char(254) && off != 1 && end_turn != true && pr_d == priority) { tail_x -= 1; off = 2; end_turn = true; } if (block [tail_x][tail_y - 1] == char(254) && off != 4 && end_turn != true && pr_r == priority) { tail_y -= 1; off = 3; end_turn = true; } if (block [tail_x][tail_y + 1] == char(254) && off != 3 && end_turn != true && pr_l == priority) { tail_y += 1; off = 4; end_turn = true; } if (end_turn != true) { if (priority > 3) { priority = 1; } else { priority++; } i--; if (contador == 0) { i = size; } } contador--; end_turn = false; } off = 0; block [tail_x][tail_y] = ' '; } cout<<"Points: "<<points; upgrade = false; Sleep(200 / speed); system("cls"); } }while (key != 'x' && end != true); if (end == true) { system("cls"); cout<<"\n\n\n\n\t\t\t\tYOU LOSE!!!!\n\n\n\n\n"; cout<<"\n\n\n\n\t\t\t\tyou did "<<points; cout<<" points \n\n\n"; cout<<"press ENTER to continue..."; system("pause > nul"); system("cls"); } if (key != 'x') { snake_x = 10, snake_y = 25, head_x = -1, head_y = 0, size = 3, off = 0, points = 0; end = false, upgrade = false, start_food = false, r = false, l = false, u = true, d = false; } } if (option == 2) { system("cls"); cout<<"\n\n\n\nUse the buttons: 'w', 's', 'd', 'a', for up, down, right and left, respective.\n\n"; cout<<"Click in 'x' for pause the game.\n\n"; cout<<"Change the keys and the snake's speed in the menu, options.\n\n\n\n"; cout<<"press ENTER to continue..."; system("pause > nul"); system("cls"); } if (option == 3) { do { system("cls"); cout<<"\n\n\n\nUse the keys '+' or '-' for change the snake's speed\n\n"; cout<<"Use 'e' for edit the control. (just use characters)\n\n"; cout<<"Press 'x' for exit of this options.\n\n"; cout<<"Speed of Snake: "<<speed; if (kbhit()) { key2 = getch(); if (key2 == '+' && speed != 5) { speed++; } if (key2 == '-' && speed != 1) { speed--; } if (key2 == 'e') { cout<<"\nType the up key: "; cin>>key_up; cout<<"\nType the down key: "; cin>>key_down; cout<<"\nType the left key: "; cin>>key_left; cout<<"\nType the right key: "; cin>>key_right; } } }while (key2 != 'x'); system("cls"); key2 = 'o'; } }while (option != 4); return 0; } void MAP() { for (i = 0; i < com; i++) { printf("\t "); for (j = 0; j < lar; j++) { printf("%c", block [i][j]); } printf("\n"); } } void CONTROL() { if (kbhit()) { key = getch(); if (key == key_up && d != true) { head_x = -1; head_y = 0; u = true; d = false; l = false; r = false; } if (key == key_down && u != true) { head_x = 1; head_y = 0; u = false; d = true; l = false; r = false; } if (key == key_left && r != true) { head_x = 0; head_y = -1; u = false; d = false; l = true; r = false; } if (key == key_right && l != true) { head_x = 0; head_y = 1; u = false; d = false; l = false; r = true; } } } void FOOD() { int x; bool y = true; srand(time(NULL)); food_x = rand() % (com - 1); food_y = rand() % (lar - 1); while (y == true) { for (x = 0; x < 255; x++) { if (block [food_x][food_y] == char(x)) { if (x == 254 || x == 186 || x == 187 || x == 188 || x == 200 || x == 201 || x == 205) { food_x = rand() % (com - 1); food_y = rand() % (lar - 1); } else { y = false; } } } } if (start_food != true) { block [food_x][food_y] = '*'; start_food = true; } } void PRIORITY() { if (u == true) { priority = 1; } if (d == true) { priority = 2; } if (l == true) { priority = 3; } if (r == true) { priority = 4; } }quem conseguir arrumar posta aeww!!
Editado por LuKaumLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.