1. Code
  2. Mobile Development
  3. Android Development

Google Play Game Services: Tablas de clasificación

Scroll to top

Spanish (Español) translation by CYC (you can also view the original English article)

Los servicios de juegos de Google Play brindan la oportunidad de agregar funciones sociales a tus juegos a través de las cuentas de Google+ de los usuarios. En este tutorial, demostraremos cómo puedes agregar tablas de clasificación a una aplicación Android, presentar puntajes de usuarios y presentar las clasificaciones actuales de los usuarios dentro del juego.

El uso de tablas de clasificación implica preparar tu IDE, configurar la tabla de líderes en Google Play Developer Console y agregar funcionalidad a tu aplicación.

Si completaste el reciente tutorial sobre cómo agregar logros a las aplicaciones Android, podrás omitir algunos de los pasos en este. El código fuente adjunto incluye la misma aplicación que utilizamos para el tutorial de logros, con los logros y la funcionalidad de tablas de clasificación añadidas.

1. Prepara tu IDE

Paso 1

Para usar Google Play Services, necesitas ciertas utilidades instaladas en tu entorno de desarrollo. Además, dado que estamos usando Game Services, instalaremos la biblioteca BaseGameUtils, que reduce la cantidad de codificación que necesitamos para implementar funciones como el inicio de sesión de Google+.

Para comenzar, crea una nueva aplicación o usa una existente. Si seguiste el tutorial de logros, puedes usar la aplicación que creaste para ese tutorial. Si estás creando tu propio juego, decide para qué quieres usar tablas de clasificación y cuándo planeas enviar una puntuación de usuario. Cada puntaje de la tabla de clasificación será un número. Puedes configurar la tabla de clasificación para considerar los valores de números más bajos o más altos como mejores en términos de posición en la tabla de clasificación, pero, naturalmente, esto dependerá del propósito de tu juego.

El código en la carpeta de descargas incluye un juego simple en el que el usuario adivina un número. Usaremos el número de conjeturas requeridas para obtener la respuesta correcta como puntaje de la tabla de clasificación. En este caso, menos conjeturas son mejores, por lo que la clasificación presentará primero las puntuaciones más bajas. Para simplificar, limitaremos el número de conjeturas que un usuario puede realizar. Este es un ejemplo trivial para demostrar el concepto y la funcionalidad de la tabla de clasificación. Tus propios juegos probablemente implicarán más complejidad.

Paso 2

Preparemos Eclipse para desarrollar con Google Play Game Services. Abre Android SDK Manager y ve a la carpeta Extras. Expande la carpeta y selecciona Google Play Services más el Repositorio de Google. Instala Google APIs Platform desde una de las versiones recientes de Android si quieres probar en el emulador. Instala los paquetes elegidos.

Paso 3

Eclipse también deberá hacer referencia a algunos recursos adicionales en el área de trabajo. En tu computadora, navega a la ubicación de la Biblioteca de servicios de Google Play, que debe estar en la carpeta Android SDK, en extras/google/google_play_services/libproject/google-play-services_lib/. Copia y pega la biblioteca en otro lugar en tu computador.

Ahora necesitamos una referencia a esta copia en Eclipse. Selecciona Importar > Android > Importar código de Android existente en el espacio de trabajo en el menú Archivo. Selecciona la ubicación de la copia que hiciste. La biblioteca importada ahora debería aparecer como un nuevo proyecto en Eclipse. Haz clic con el botón derecho y selecciona Propiedades. En la sección Android, elige un objetivo de compilación de API de Google y marca la casilla de verificación Es Biblioteca.

Paso 4

La importación del recurso BaseGameUtils es ligeramente diferente. La biblioteca está alojada en GitHub. Puedes encontrarlo en la sección Descargas, en Juegos de ejemplo. Descarga la biblioteca y guárdala en tu computadora.

Como hiciste con la biblioteca de servicios de Google Play, selecciona Importar > Android > Importar código de Android existente en el espacio de trabajo en el menú Archivo para llevar la biblioteca BaseGameUtils a Eclipse. Haz clic con el botón derecho para navegar a las nuevas propiedades del proyecto y asegúrate de que el proyecto esté marcado como biblioteca al marcar Es Biblioteca.

Paso 5

Ahora podemos hacer que la aplicación haga referencia a estos dos recursos dentro del espacio de trabajo. Haz clic derecho en tu aplicación en el Explorador de paquetes y elige Propiedades. Navega a la sección Android y selecciona Agregar en la sección Biblioteca. Elige tanto la biblioteca de Servicios de Google Play como BaseGameUtils y agrégalos a tu aplicación.

2. Prepara tu juego en la consola de desarrollo

Paso 1

Antes de que puedas crear una tabla de clasificación, la aplicación debe aparecer en la Consola para programadores de Google Play. Inicia sesión y haz clic en el botón de la izquierda Game Services . Si ya hiciste esto para tu aplicación en el tutorial de logros, no necesitas hacerlo nuevamente. Puedes pasar a la sección 3 sobre cómo crear una tabla de clasificación.

Haz clic en Configurar servicios de juegos de Google Play.

Haz clic para agregar un nuevo juego, selecciona No uso API de Google en mi juego todavía, y elige un nombre y categoría para tu juego. Haz clic en Continuar para ir al siguiente paso.

Agrega el título de tu juego. Puedes agregar otros detalles más adelante.

Paso 2

Vamos a vincular la aplicación para que podamos consultar esta lista de la Consola de Desarrollador en la propia aplicación. Haz clic en la entrada Aplicaciones vinculadas en la lista de la izquierda y elige Android.

Ingresa la información de tu aplicación, incluido el nombre del paquete, asegurándote de que sea igual a la que estás utilizando en tu proyecto.

Guarda y haz clic en Autorizar tu aplicación ahora. Por el momento, puedes agregar el nombre de la aplicación, pero puedes ingresar más detalles más adelante. Elige Aplicación instalada en el área ID de cliente, con Android como tipo e ingresa el nombre de tu paquete. Ahora necesitas usar la utilidad keytool para generar un certificado de firma. Puedes usar el siguiente comando en una terminal o símbolo del sistema en combinación con el certificado de depuración:

1
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v

La terminal o símbolo del sistema escribirá la huella digital del certificado. Copia lo que ves después de SHA1 y pégalo en Developer Console en el área de texto de Huella digital de certificado de firma.

Selecciona Crear cliente y copia la ID de la aplicación, que se muestra junto al nombre de la aplicación en Developer Console. Agregarás el ID a tu aplicación junto con el ID de la tabla de clasificación que estamos por crear.

3. Crea una tabla de clasificación

Paso 1

Todavía en Developer Console, creemos ahora una nueva tabla de clasificación. Selecciona la sección Tablas de clasificación en tu lista de aplicaciones y haz clic en Agregar tabla de líderes.

Asegúrate de comprender el concepto de Tablas de clasificación en Android y, en general, en los Servicios de juegos de Google Play. Puedes leer una descripción general en el sitio web de Google Play Game Services. En realidad, puedes hacer muchas cosas diferentes con tablas de clasificación, así que considera que lo que hacemos en este tutorial es solo un punto de partida.

Ingresa los detalles de tu nueva tabla de clasificación. Para nuestro código de muestra, usamos el nombre Menos conjeturas y seleccionamos Más pequeño es mejor en la sección Ordenar.

Agrega un icono si lo deseas. Si no lo haces, se usará una imagen estándar. Guarda tu nueva tabla de clasificación y copia tu ID.

Paso 2

En la sección Pruebas de tu aplicación en Developer Console, puedes agregar cuentas a las que se les otorgará acceso para probar el juego. De forma predeterminada, verás tu propio correo electrónico de la cuenta de Google allí enumerado, por lo que deberías poder usarlo para probar tu aplicación.

4. Prepara tu juego para acceder a los servicios de juegos

Paso 1

Es hora de preparar la aplicación para acceder a la tabla de líderes en Eclipse. Si completaste el tutorial de logros, puedes omitir parte de esta sección. Primero agreguemos los ID para la aplicación y la tabla de clasificación. Abre o crea un archivo de recursos res/values/ids.xml. Usa la siguiente sintaxis para ingresar los ID que copiaste para la aplicación y la nueva tabla de clasificación cuando los creaste en Developer Console:

1
<string name="app_id">1234567890</string>
2
<string name="number_guesses_leaderboard">abcdefg1234567</string>

Guarda el archivo y abre el Manifiesto del proyecto. Agrega lo siguiente dentro del elemento application:

1
<meta-data
2
 android:name="com.google.android.gms.games.APP_ID"
3
 android:value="@string/app_id" />
4
<meta-data
5
 android:name="com.google.android.gms.version"
6
 android:value="@integer/google_play_services_version" />

La aplicación ahora está configurada para vincular a los listados que agregamos en Developer Console.

Paso 2

Cuando utilizas los servicios de Google en tus aplicaciones Android, necesitas que tus usuarios inicien sesión en sus cuentas de Google. Puedes tomar varios enfoques para implementar esto, pero vamos a automatizar partes de este proceso utilizando la clase BaseGameActivity junto con botones estándar para iniciar y cerrar sesión. Además, cuando se inicia la actividad, la aplicación intentará iniciar sesión en el usuario de inmediato.

Abre el archivo de diseño principal de tu aplicación y agrega botones para iniciar/cerrar sesión:

1
<!-- sign-in button -->
2
3
<com.google.android.gms.common.SignInButton
4
 android:id="@+id/sign_in_button"
5
 android:layout_width="wrap_content"
6
 android:layout_height="wrap_content" />
7
8
<!-- sign-out button -->
9
10
<Button
11
 android:id="@+id/sign_out_button"
12
 android:layout_width="wrap_content"
13
 android:layout_height="wrap_content"
14
 android:text="Sign Out"
15
 android:visibility="gone" />

Paso 3

Agrega estas importaciones a tu clase principal Activity:

1
import com.google.android.gms.games.Games;
2
import com.google.example.games.basegameutils.BaseGameActivity;

Haz que la clase Activity amplíe la clase BaseGameActivity y recepcione si hay clics:

1
public class MainActivity extends BaseGameActivity implements View.OnClickListener

Prepárate para responder a los clics en los botones para iniciar o cerrar sesión en onCreate:

1
findViewById(R.id.sign_in_button).setOnClickListener(this);
2
findViewById(R.id.sign_out_button).setOnClickListener(this); 

Ahora agrega los siguientes métodos estándar a un método onClick en la clase:

1
@Override
2
public void onClick(View view) {
3
    if (view.getId() == R.id.sign_in_button) {
4
  	beginUserInitiatedSignIn();
5
	}
6
	else if (view.getId() == R.id.sign_out_button) {
7
		signOut();
8
		findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
9
		findViewById(R.id.sign_out_button).setVisibility(View.GONE);
10
	}
11
}

Los métodos que llamamos aquí los proporciona la clase BaseGameActivity de la que hereda nuestra clase Activity, por lo que no es necesario que manejemos los detalles de forma manual. Finalmente, agregamos un par de devoluciones de llamada estándar:

1
public void onSignInSucceeded() {
2
    findViewById(R.id.sign_in_button).setVisibility(View.GONE);
3
	findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE);
4
}
5
6
@Override
7
public void onSignInFailed() {
8
	findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
9
	findViewById(R.id.sign_out_button).setVisibility(View.GONE);
10
}

Cuando recurrimos a la funcionalidad de la tabla de clasificación, primero verificaremos si la aplicación tiene conexión con los servicios de Google. Alternativamente, puedes agregar código a estos métodos para administrar la conciencia de tu aplicación sobre si se puede llamar o no a Play Services.

5. Implementa tu tabla de clasificación

Paso 1

Ahora podemos dejar que la aplicación use la tabla de clasificación. El código en la aplicación de muestra usa el siguiente diseño. No entraré en detalles para explicar el diseño ya que tus propias aplicaciones tendrán un diseño diferente.

1
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
2
    xmlns:tools="http://schemas.android.com/tools"
3
	android:layout_width="match_parent"
4
	android:layout_height="match_parent"
5
	android:paddingBottom="@dimen/activity_vertical_margin"
6
	android:paddingLeft="@dimen/activity_horizontal_margin"
7
	android:paddingRight="@dimen/activity_horizontal_margin"
8
	android:paddingTop="@dimen/activity_vertical_margin"
9
	tools:context="com.example.fungame.MainActivity" >
10
11
	<LinearLayout
12
		android:id="@+id/sign_in_buttons"
13
		android:layout_width="fill_parent"
14
		android:layout_height="wrap_content"
15
		android:layout_alignParentTop="true"
16
		android:orientation="horizontal" >
17
18
		<!-- sign-in button -->
19
20
		<com.google.android.gms.common.SignInButton
21
			android:id="@+id/sign_in_button"
22
			android:layout_width="wrap_content"
23
			android:layout_height="wrap_content" />
24
25
		<!-- sign-out button -->
26
27
		<Button
28
			android:id="@+id/sign_out_button"
29
			android:layout_width="wrap_content"
30
			android:layout_height="wrap_content"
31
			android:text="Sign Out"
32
			android:visibility="gone" />
33
	</LinearLayout>
34
35
	<RelativeLayout
36
		android:id="@+id/gameArea"
37
		android:layout_width="fill_parent"
38
		android:layout_height="wrap_content"
39
		android:layout_below="@id/sign_in_buttons" >
40
41
		<TextView
42
			android:id="@+id/guess_text"
43
			android:layout_width="fill_parent"
44
			android:layout_height="wrap_content"
45
			android:layout_centerHorizontal="true"
46
			android:text="Guess the number!"
47
			android:textSize="30sp"
48
			android:textStyle="bold" />
49
50
		<LinearLayout
51
			android:layout_width="fill_parent"
52
			android:layout_height="wrap_content"
53
			android:layout_below="@id/guess_text"
54
			android:orientation="vertical" >
55
56
			<LinearLayout
57
				android:layout_width="fill_parent"
58
				android:layout_height="wrap_content"
59
				android:orientation="horizontal" >
60
61
				<Button
62
					android:id="@+id/btn7"
63
					android:layout_width="0dp"
64
					android:layout_height="match_parent"
65
					android:layout_margin="1dp"
66
					android:layout_weight="1"
67
					android:background="#ff000033"
68
					android:gravity="center"
69
					android:onClick="btnPressed"
70
					android:padding="5dp"
71
					android:tag="7"
72
					android:text="7"
73
					android:textColor="#ffffffff"
74
					android:textSize="30sp"
75
					android:textStyle="bold" />
76
77
				<Button
78
					android:id="@+id/btn8"
79
					android:layout_width="0dp"
80
					android:layout_height="match_parent"
81
					android:layout_margin="1dp"
82
					android:layout_weight="1"
83
					android:background="#ff000033"
84
					android:gravity="center"
85
					android:onClick="btnPressed"
86
					android:padding="5dp"
87
					android:tag="8"
88
					android:text="8"
89
					android:textColor="#ffffffff"
90
					android:textSize="30sp"
91
					android:textStyle="bold" />
92
93
				<Button
94
					android:id="@+id/btn9"
95
					android:layout_width="0dp"
96
					android:layout_height="match_parent"
97
					android:layout_margin="1dp"
98
					android:layout_weight="1"
99
					android:background="#ff000033"
100
					android:gravity="center"
101
					android:onClick="btnPressed"
102
					android:padding="5dp"
103
					android:tag="9"
104
					android:text="9"
105
					android:textColor="#ffffffff"
106
					android:textSize="30sp"
107
					android:textStyle="bold" />
108
			</LinearLayout>
109
110
			<LinearLayout
111
				android:layout_width="fill_parent"
112
				android:layout_height="wrap_content"
113
				android:layout_weight="1"
114
				android:orientation="horizontal" >
115
116
				<Button
117
					android:id="@+id/btn4"
118
					android:layout_width="0dp"
119
					android:layout_height="match_parent"
120
					android:layout_margin="1dp"
121
					android:layout_weight="1"
122
					android:background="#ff000033"
123
					android:gravity="center"
124
					android:onClick="btnPressed"
125
					android:padding="5dp"
126
					android:tag="4"
127
					android:text="4"
128
					android:textColor="#ffffffff"
129
					android:textSize="30sp"
130
					android:textStyle="bold" />
131
132
				<Button
133
					android:id="@+id/btn5"
134
					android:layout_width="0dp"
135
					android:layout_height="match_parent"
136
					android:layout_margin="1dp"
137
					android:layout_weight="1"
138
					android:background="#ff000033"
139
					android:gravity="center"
140
					android:onClick="btnPressed"
141
					android:padding="5dp"
142
					android:tag="5"
143
					android:text="5"
144
					android:textColor="#ffffffff"
145
					android:textSize="30sp"
146
					android:textStyle="bold" />
147
148
				<Button
149
					android:id="@+id/btn6"
150
					android:layout_width="0dp"
151
					android:layout_height="match_parent"
152
					android:layout_margin="1dp"
153
					android:layout_weight="1"
154
					android:background="#ff000033"
155
					android:gravity="center"
156
					android:onClick="btnPressed"
157
					android:padding="5dp"
158
					android:tag="6"
159
					android:text="6"
160
					android:textColor="#ffffffff"
161
					android:textSize="30sp"
162
					android:textStyle="bold" />
163
			</LinearLayout>
164
165
			<LinearLayout
166
				android:layout_width="fill_parent"
167
				android:layout_height="wrap_content"
168
				android:layout_weight="1"
169
				android:orientation="horizontal" >
170
171
				<Button
172
					android:id="@+id/btn1"
173
					android:layout_width="0dp"
174
					android:layout_height="match_parent"
175
					android:layout_margin="1dp"
176
					android:layout_weight="1"
177
					android:background="#ff000033"
178
					android:gravity="center"
179
					android:onClick="btnPressed"
180
					android:padding="5dp"
181
					android:tag="1"
182
					android:text="1"
183
					android:textColor="#ffffffff"
184
					android:textSize="30sp"
185
					android:textStyle="bold" />
186
187
				<Button
188
					android:id="@+id/btn2"
189
					android:layout_width="0dp"
190
					android:layout_height="match_parent"
191
					android:layout_margin="1dp"
192
					android:layout_weight="1"
193
					android:background="#ff000033"
194
					android:gravity="center"
195
					android:onClick="btnPressed"
196
					android:padding="5dp"
197
					android:tag="2"
198
					android:text="2"
199
					android:textColor="#ffffffff"
200
					android:textSize="30sp"
201
					android:textStyle="bold" />
202
203
				<Button
204
					android:id="@+id/btn3"
205
					android:layout_width="0dp"
206
					android:layout_height="match_parent"
207
					android:layout_margin="1dp"
208
					android:layout_weight="1"
209
					android:background="#ff000033"
210
					android:gravity="center"
211
					android:onClick="btnPressed"
212
					android:padding="5dp"
213
					android:tag="3"
214
					android:text="3"
215
					android:textColor="#ffffffff"
216
					android:textSize="30sp"
217
					android:textStyle="bold" />
218
			</LinearLayout>
219
220
			<LinearLayout
221
				android:layout_width="fill_parent"
222
				android:layout_height="wrap_content"
223
				android:layout_weight="1"
224
				android:orientation="horizontal" >
225
226
				<Button
227
					android:id="@+id/btn0"
228
					android:layout_width="0dp"
229
					android:layout_height="match_parent"
230
					android:layout_margin="1dp"
231
					android:layout_weight="1"
232
					android:background="#ff000033"
233
					android:gravity="center"
234
					android:onClick="btnPressed"
235
					android:padding="5dp"
236
					android:tag="0"
237
					android:text="0"
238
					android:textColor="#ffffffff"
239
					android:textSize="30sp"
240
					android:textStyle="bold" />
241
242
				<Button
243
					android:id="@+id/btnAgain"
244
					android:layout_width="0dp"
245
					android:layout_height="match_parent"
246
					android:layout_margin="1dp"
247
					android:layout_weight="1"
248
					android:background="#ffffff00"
249
					android:enabled="false"
250
					android:gravity="center"
251
					android:onClick="btnPressed"
252
					android:padding="5dp"
253
					android:tag="-1"
254
					android:text="Again"
255
					android:textColor="#ffffff00"
256
					android:textSize="30sp"
257
					android:textStyle="bold" />
258
			</LinearLayout>
259
		</LinearLayout>
260
	</RelativeLayout>
261
262
	<LinearLayout
263
		android:id="@+id/play_buttons"
264
		android:layout_width="fill_parent"
265
		android:layout_height="wrap_content"
266
		android:layout_below="@id/gameArea"
267
		android:gravity="center"
268
		android:orientation="horizontal" >
269
270
		<!-- show achievements -->
271
272
		<Button
273
			android:id="@+id/show_achievements"
274
			android:layout_width="wrap_content"
275
			android:layout_height="wrap_content"
276
			android:text="Achievements" />
277
278
		<!-- show leaderboards -->
279
280
		<Button
281
			android:id="@+id/show_leaderboard"
282
			android:layout_width="wrap_content"
283
			android:layout_height="wrap_content"
284
			android:text="Leaderboard" />
285
	</LinearLayout>
286
287
</RelativeLayout>

Agregamos botones para acceder a los logros y tablas de clasificación de la aplicación. Si no has completado el tutorial de logros, puedes eliminar el botón de logros.

De regreso a la clase de Activity de tu aplicación, usaremos estas variables de instancia:

1
private Button button0, button1, button2, button3, button4, button5,
2
    button6, button7, button8, button9, buttonAgain;
3
private int number;
4
private Random rand;
5
private TextView info;
6
private int numGuesses=0;

Si completaste el tutorial de logros, puedes observar una variable adicional, numGuesses, para realizar un seguimiento del número de conjeturas del usuario cada vez que juegan el juego.

Necesitarás el siguiente código adicional en el método onCreate de la clase Activity. Si no estás utilizando el botón de logros, elimina la línea que lo referencia.

1
findViewById(R.id.show_achievements).setOnClickListener(this);
2
findViewById(R.id.show_leaderboard).setOnClickListener(this);
3
4
button0=(Button)findViewById(R.id.btn0);
5
button1=(Button)findViewById(R.id.btn1);
6
button2=(Button)findViewById(R.id.btn2);
7
button3=(Button)findViewById(R.id.btn3);
8
button4=(Button)findViewById(R.id.btn4);
9
button5=(Button)findViewById(R.id.btn5);
10
button6=(Button)findViewById(R.id.btn6);
11
button7=(Button)findViewById(R.id.btn7);
12
button8=(Button)findViewById(R.id.btn8);
13
button9=(Button)findViewById(R.id.btn9);
14
buttonAgain=(Button)findViewById(R.id.btnAgain);
15
16
info=(TextView)findViewById(R.id.guess_text);
17
18
rand=new Random();
19
number=rand.nextInt(10);

También usamos los siguientes métodos para deshabilitar y habilitar los botones durante el juego:

1
private void disableNumbers(){
2
    button0.setEnabled(false); button0.setTextColor(Color.parseColor("#ff000033"));
3
	button1.setEnabled(false); button1.setTextColor(Color.parseColor("#ff000033"));
4
	button2.setEnabled(false); button2.setTextColor(Color.parseColor("#ff000033"));
5
	button3.setEnabled(false); button3.setTextColor(Color.parseColor("#ff000033"));
6
	button4.setEnabled(false); button4.setTextColor(Color.parseColor("#ff000033"));
7
	button5.setEnabled(false); button5.setTextColor(Color.parseColor("#ff000033"));
8
	button6.setEnabled(false); button6.setTextColor(Color.parseColor("#ff000033"));
9
	button7.setEnabled(false); button7.setTextColor(Color.parseColor("#ff000033"));
10
	button8.setEnabled(false); button8.setTextColor(Color.parseColor("#ff000033"));
11
	button9.setEnabled(false); button9.setTextColor(Color.parseColor("#ff000033"));
12
	buttonAgain.setEnabled(true); buttonAgain.setTextColor(Color.parseColor("#ff000033"));
13
}
14
private void enableNumbers(){
15
	button0.setEnabled(true); button0.setTextColor(Color.WHITE);
16
	button1.setEnabled(true); button1.setTextColor(Color.WHITE);
17
	button2.setEnabled(true); button2.setTextColor(Color.WHITE);
18
	button3.setEnabled(true); button3.setTextColor(Color.WHITE);
19
	button4.setEnabled(true); button4.setTextColor(Color.WHITE);
20
	button5.setEnabled(true); button5.setTextColor(Color.WHITE);
21
	button6.setEnabled(true); button6.setTextColor(Color.WHITE);
22
	button7.setEnabled(true); button7.setTextColor(Color.WHITE);
23
	button8.setEnabled(true); button8.setTextColor(Color.WHITE);
24
	button9.setEnabled(true); button9.setTextColor(Color.WHITE);
25
	buttonAgain.setEnabled(false); buttonAgain.setTextColor(Color.parseColor("#ffffff00"));
26
}

También necesitamos el siguiente método que especificamos como atributo onClick para los botones numéricos en el diseño. El jugador toca uno de estos para hacer una suposición:

1
public void btnPressed(View v){
2
    int btn = Integer.parseInt(v.getTag().toString());
3
	if(btn<0){
4
		//again btn

5
		numGuesses=0;
6
		number=rand.nextInt(10);
7
		enableNumbers();
8
		info.setText("Set the number!");
9
	}
10
	else{
11
		//number button

12
		numGuesses++;
13
		if(btn==number){
14
			info.setText("Yes! It was "+number);
15
			if(getApiClient().isConnected()){
16
				Games.Achievements.unlock(getApiClient(), 
17
						getString(R.string.correct_guess_achievement));
18
				Games.Leaderboards.submitScore(getApiClient(), 
19
						getString(R.string.number_guesses_leaderboard), 
20
						numGuesses);
21
			}
22
			disableNumbers();
23
		}
24
		else if(numGuesses==5){
25
			info.setText("No! It was "+number);
26
			disableNumbers();
27
		}
28
		else
29
			info.setText("Try again!");
30
	}
31
}

Toma un momento para revisar el código. Incluso si completaste la aplicación en el tutorial de logros, hay algunos cambios en la lógica, además del código adicional de la tabla de clasificación. Si el jugador toca el botón Nuevamente, reiniciamos la variable numGuesses a 0. Si el usuario toca un botón numérico, aumentamos el valor num. Si no estás utilizando logros, puedes eliminar cualquier código que haga referencia a los logros.

Sometemos el puntaje a la tabla de clasificación cuando el usuario adivinó correctamente. El usuario puede hacer hasta cinco conjeturas.

La línea clave aquí es submitScore. Pasamos el número de conjeturas que el jugador tomó para obtener el número correcto. Si el número de conjeturas es menor que cualquier entrada existente para el usuario en la tabla de clasificación, su entrada será reemplazada por este nuevo valor. Ten en cuenta que usamos el valor del recurso de cadena que definimos para la tabla de clasificación.

Paso 2

Antes de terminar, permitamos que el usuario vea la tabla de líderes del juego al tocar el botón Leaderboard que agregamos. Usamos el siguiente código en onClick para los logros:

1
else if (view.getId() == R.id.show_achievements){
2
    startActivityForResult(Games.Achievements.getAchievementsIntent(
3
		getApiClient()), 1);
4
}

La presentación de la clasificación es similar:

1
else if(view.getId() == R.id.show_leaderboard){
2
    startActivityForResult(Games.Leaderboards.getLeaderboardIntent(
3
		getApiClient(), getString(R.string.number_guesses_leaderboard)), 
4
		2);
5
}

Esto permitirá al usuario ver la clasificación actual dentro de la tabla de clasificación. El parámetro entero es arbitrario.

Cuando ejecutas la aplicación, intentará iniciar sesión con el usuario, verificando los permisos y confirmando el inicio de sesión si es exitoso:

El usuario puede elegir cerrar la sesión y volver a ingresar cuando quiera, pero si abandona la aplicación, intentará volver a iniciar sesión automáticamente cuando la abra nuevamente. Cuando el usuario adivine correctamente, su puntaje se enviará a la tabla de clasificación. Al presionar el botón Leaderboard se mostrarán las clasificaciones actuales:

Desde aquí, el usuario puede acceder a las características sociales de los Servicios de Google a través de su cuenta de Google. Puedes configurar tus aplicaciones para usar tablas de clasificación públicas y sociales. Las tablas de clasificación sociales presentan listas de personas en los círculos del usuario, que se pueden administrar para el juego en sí. Para una clasificación pública, el usuario debe haber optado por compartir sus puntajes públicamente.

Conclusión

En este tutorial, hemos implementado la funcionalidad básica de una tabla de clasificación con Google Play Game Services. Ten en cuenta que puedes hacer mucho más con las tablas de clasificación en tus aplicaciones. Por ejemplo, puedes solicitar los datos de la tabla de clasificación para escalas de tiempo particulares, como diariamente, semanalmente y desde el orígen de todos los tiempos. Si una tabla de clasificación contiene muchos puntajes, es posible que tu aplicación solo obtenga los puntajes más altos o los puntajes más cercanos al jugador actual. Intenta experimentar con algunas de estas mejoras en tus propias aplicaciones.