• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

xploit

ranking de jogo

43 mensagens neste tópico

Boas pessoal estou a desenvolver um jogo mas tou com dificuldades nesta parte, que é mostrar ao utilizador logado, a sua posição no ranking.

Eu tenho este código que lista todos os utilizadores do ranking e o seu devido lugar:

$consulta_ranking=mysql_query("SELECT *FROM $tabela ORDER BY pontos DESC LIMIT 99999999");
$pos = 1;
while($row=mysql_fetch_array($consulta_ranking)):
{
$utilizador=$row['username'];
$pontos=$row['pontos'];

echo $lugar . "º lugar:  "  . $pontos .$utilizador;
echo "<br />";
$lugar++;

}
endwhile;

eu agora cria era listar a posição de apenas um utilizador ou seja neste caso é o utilizador tiago, que está na posição 2º.

como faço para listar só e apenas isso?

Obrigado pelas ajudas Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Muitos jogos do género usam uma tabela extra onde guardam a posição e o id do jogador, e que é actualizada periodicamente, para evitar excesso de trabalho no servidor. Não sei se isto te ajuda, mas pelo menos dá-te uma ideia ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Apenas precisas de saber SQL:

SELECT * FROM $tabela WHERE jogador='tiago' ORDER BY pontos DESC

O limite 999999 não te é útil, porque pelo número, pretendes apresentar todos os resultados, que é feito por predefinição. Onde está tiago, deves substituir pela variável com o nome do jogador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Apenas precisas de saber SQL:

SELECT * FROM $tabela WHERE jogador='tiago' ORDER BY pontos DESC

O limite 999999 não te é útil, porque pelo número, pretendes apresentar todos os resultados, que é feito por predefinição. Onde está tiago, deves substituir pela variável com o nome do jogador.

Isso não resolve softclean :D

Se eu bem percebi, ele calcula on-the-fly a posição do jogador, logo esse SQL que postas-te vai dizer sempre que o jogador se encontre em 1º ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, pensei que só queria ver os pontos para por exemplo na página do perfil... Sendo assim até tinha código desnecessário... o ideal será ter os dados numa tabela à parte, com ligação aos dados do jogador, como te sugeriu o yoda.pt.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

puderiam me dar uma ideia entao como fazia isso? como posso guardar o rank de um jogador individual numa tabela?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A minha sugestão é na tabela utilizadores teres um campo "Posicao" e actualizares esse campo automaticamente de x em x minutos.

Isto é, criares uma página que irá ser chamada com o cronjobs, e nela colocares tipo:

<?php

$utilizadores=mysql_query("SELECT Nome FROM utilizadores ORDER BY Pontos");

while($u=mysql_fetch_array($utilizadores)){
$i++;
mysql_query("UPDATE utilizadores SET Posicao=$i WHERE Nome='$u[Nome]'");
}

?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora eu estive a fazer uns testes:

tendo uma tabela "teste" com os campos "ID" e "campo1" fiz uma contagem virtual das linhas... Não sei a viabilidade desta consulta (query) mas ... deixo para verem:

SELECT t1.*,SUM(1) as posicao
FROM teste t1, teste t2
WHERE t1.ID>=t2.ID
GROUP BY t1.ID;

Isto dá algo como

ID     campo1       posicao

1, 'valorCampo1',   1

2, 'valorCampo2',   2

4, 'valorCampo4',   3

Depois se quiser obter a linha especifica de um registo, sem alterar as posições, basta fazer:

SELECT t1.*,SUM(1) as posicao
FROM teste t1, teste t2
WHERE t1.ID>=t2.ID
GROUP BY t1.ID HAVING t1.campo1='valorCampo4';

Isto vai dar a linha do valorCampo4 com a posicao 3 ;)

... Espero ter ajudado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê se esta solução ajuda

$consulta_ranking=mysql_query("SELECT *FROM $tabela ORDER BY pontos DESC");
$pos = 1;
while($row=mysql_fetch_array($consulta_ranking)):
{
$row['posicao'] = $pos;
if ($row['username']==$user);
       array_push($lista_posicoes,$row);
$pos++;

}
endwhile;

print_r($lista_posicoes);

Onde $user é o nome do utilizador em questão, e tens que substituir o print_r da lista por uma impressão mais agradavel.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vê se esta solução ajuda

$consulta_ranking=mysql_query("SELECT *FROM $tabela ORDER BY pontos DESC");
$pos = 1;
while($row=mysql_fetch_array($consulta_ranking)):
{
$row['posicao'] = $pos;
if ($row['username']==$user);
       array_push($lista_posicoes,$row);
$pos++;

}
endwhile;

print_r($lista_posicoes);

Onde $user é o nome do utilizador em questão, e tens que substituir o print_r da lista por uma impressão mais agradavel.

Também não resolve, só baralham o rapaz :D

xploit, o que tens de fazer é o seguinte :

crias uma rotinha ( cronjob de preferencia ) de 6 em 6h por exemplo, e que te faça uma query a todos os players da base de dados, ordenando a query por pontos, do maior para o mais pequeno. Com o resultado da query, passas para um array os ids e pontos dos mesmos :

$array[] = array('user_id' => $row['user_id'], 'points' => $row['points']);

A partir daqui tens um array ordenado com as posições correctas no rank de cada jogador ;)

Agora, para guardar este resultado, crias uma tabela com estes atributos :

id ( auto_increment )

user_id

points

Depois é só correres o array 1 a 1 e ires inserindo os valores nesta nova tabela, ficando a mesma com a ordem que queres e fácil de consultar :)

Agora, como isto é uma rotina, há 2 operações que tens de ter em conta antes de fazer isto :

1. Limpar a tabela antes de meter lá os dados;

TRUNCATE TABLE `nome_da_tabela`;

2. Fazer reset ao auto_increment.

ALTER TABLE  `nome_da_tabela` AUTO_INCREMENT =1

Espero que te resolva o problema :D

PS: Podes querer meter mais dados nessa tabela, como o nome do jogador, etc .. É ao teu critério, só coloquei o que era indispensável :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já experimentaste a minha sugestão?

Eu utilizo um código parecido no meu jogo e funciona 100%. Aliás, eu copiei do meu jogo e só adaptei melhor às tuas necessidades...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já experimentaste a minha sugestão?

Eu utilizo um código parecido no meu jogo e funciona 100%. Aliás, eu copiei do meu jogo e só adaptei melhor às tuas necessidades...

TheGlorious, não percebes que ele não tinha nenhuma tabela com os rankings, e que fazia o cálculo on-the-fly ..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa a minha ignorância, mas o que é "on-the-fly"?

E... Na primeira vez eu disse para ele adicionar um campo chamado "Posicao" na tabela que contém os dados do utilizador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa a minha ignorância, mas o que é "on-the-fly"?

O cálculo é feito na hora.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa a minha ignorância, mas o que é "on-the-fly"?

E... Na primeira vez eu disse para ele adicionar um campo chamado "Posicao" na tabela que contém os dados do utilizador.

on-the-fly é um termo usado em coisas que são feitas "no momento", ou seja, ele sabia as posições dos jogadores no momento em que fazia a query, pela ordem que o result trazia ..

Em relação à tua solução, ter nos users o campo posição tornava mais lento o sistema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm...

Sempre a aprender...

Então aconselhas à criação de uma tabela só para as posições exacto?

Vou seguir a sugestão e vou aplicar no meu :)

Já agora, xploit, desculpa pela minha má solução e aproveito para agradecer aos outros, visto que também vou aproveitar este tópico para melhor o meu :X

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu fiz para um site de um clube de futebol, através do lançamento dos resultados dos jogos deles, a classificação automática através do cálculo de resultados... claro está que foi usando uma tabela extra, com os campos necessários para inclusivé fazer ordenação....

Se no teu caso as pontuações estão dependentes do utilizador, podes fazer uma das seguintes soluções (pressupondo que usas a tal tabela 'classificação' ou 'ranking' ou o que quiseres):

- A cada alteração de pontuação, fazes um Delete e depois novamente Insert (Para refazer a classificação)... O que não recomendo, por razões óbvias (carga de processamento, base de dados.. memória...)

- De x em x tempo (Acho que alguem ja disse isto) fazes o actualizar da classificação, no entanto, isso implica que irás ter a classificação desactualizada durante um período de tempo...

- Ou entao actualizas de cada vez que alguem aceder à classificação... O que pode tanto ser de tempos em tempos, como com diferenças de 2 milisegundos :)

Tens de estudar a coisa

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas pessoal obrigado pelas ajudas eu tou a tentar perceber o que tenho a fazer, so que eu nao sei como ponho a ARRAY com os dados na tabela:

$consulta_ranking=mysql_query("SELECT *FROM $tabela ORDER BY pontos DESC LIMIT 99999999");
while($row=mysql_fetch_array($consulta_ranking)):
{
$array[] = array('ID:' => $row['ID'], 'pontos' => $row['pontos']);
}
endwhile;



$limpa=mysql_query("TRUNCATE TABLE '$ranking_tabela'");
$reset=mysql_query("ALTER TABLE '$ranking_tabela'  AUTO_INCREMENT =1 ");



$insere_valores = mysql_query("INSERT INTO `$ranking_tabela` (ID,pontos,)
VALUES ('$ID','$pontos')", $db);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

foreach ($array as $single)
{
  $insere_valores = mysql_query('INSERT INTO `$ranking_tabela` (ID,pontos,)  VALUES ('.$single->id.','.$single->pontos.')', $db);
}

EDIT : tinha um erro de syntax, e xploit, tambem tens um erro mais acima do codigo, quando estás a criar o array .. tens 'ID:' em vez de 'ID' :)'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ta a dar erro na linha 23 nao percebo o que tou a fazer mal :S

$ranking_tabela= "ranking";

$consulta_ranking=mysql_query("SELECT *FROM $tabela ORDER BY pontos_traficante DESC LIMIT 99999999");
while($row=mysql_fetch_array($consulta_ranking)):
{
$array[] = array('ID' => $row['ID'], 'pontos_traficante' => $row['pontos_traficante']);
}
endwhile;



$limpa=mysql_query("TRUNCATE TABLE '$ranking_tabela'");
$reset=mysql_query("ALTER TABLE '$ranking_tabela'  AUTO_INCREMENT =1 ");


foreach ($array as $single)
{
$insere_valores = mysql_query('INSERT INTO `$ranking_tabela` (user_id,pontos)  
VALUES ('.$single->ID.','.$single->pontos_traficante.')', $db);
}

o erro foi este , multiplicado pelo numero de registos que tinha na BD:

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/dantas/public_html/rank.php on line 23

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Tens erros de falta de atenção no código, não te podes apoiar só em nós!

Quantos campos tem essa tabela?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a tabela ranking, tem 3 campos, id(auto increment INT), user_id(varchar255), pontos(varchar255), yoda nao e a questao de me apoiar em voces e que eu nao sei mesmo o que é o erro desculpa la  :)

a tabela $tabela tem bue campos mesmo mesmo muitos e tem la esses, pontos_traficante(varchar255),ID(int auto increment).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

user_id e pontos é varchar? Não pode, tem de ser valores inteiros.

E, se tens 3 campos :

$insere_valores = mysql_query('INSERT INTO `$ranking_tabela` (id, user_id,pontos)  
VALUES (NULL, '.$single->ID.', '.$single->pontos_traficante.')', $db);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continua a dar o mesmo erro eu "organizei" o código um bocado para ver ta tudo ok:

<?
include "config.php";
include "confirmar_login.php";
include "variaveis_sessao.php";

$connect = mysql_connect ($host, $login_db, $senha_db);


$consulta_ranking=mysql_query("SELECT *FROM $tabela ORDER BY pontos_traficante DESC LIMIT 99999999");
while($row=mysql_fetch_array($consulta_ranking)):
{
$array[] = array('ID' => $row['ID'], 'pontos_traficante' => $row['pontos_traficante']);
}
endwhile;



$limpa=mysql_query("TRUNCATE TABLE 'ranking'");
$reset=mysql_query("ALTER TABLE 'ranking'  AUTO_INCREMENT =1 ");


foreach ($array as $single)
{
$insere_valores = mysql_query('INSERT INTO `ranking` (id, user_id,pontos)  
VALUES (NULL, '.$single->ID.', '.$single->pontos_traficante.')',$connect);
}
?>

Obrigado pela ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora