Juego de lenguaje C (1) ---- juego de adivinanzas

contenido

prefacio

Juicio del número de locura

si otra declaración

Repita hasta que adivine correctamente (instrucción do, instrucción while)

Números objetivo establecidos al azar

La función srand muestra un gran poder

Limite el número de veces y guarde los registros de entrada

fin


prefacio

Se espera que la serie de minijuegos de lenguaje Shi Lu.C tenga un total de 10 , lo que es más adecuado para los programadores que ya han aprendido el contenido introductorio del lenguaje C y desean dominar la capacidad de programación real.

Los juegos de adivinanzas deberían estar disponibles en todos los libros de texto para principiantes. El factor de dificultad no es grande y pertenece al tipo de programa que se pasa una vez. ¡Pero incluso las moscas más pequeñas tienen carne! De hecho, el juego de adivinanzas también contiene muchas habilidades prácticas . Para resumir, escuchemos a Shi Lu. Explique el juego de lenguaje C para aquellos que están ansiosos por mejorar (1) - juego de adivinanzas .

Juicio del número de locura

Comencemos con una versión beta del "juego de adivinanzas". Compare el valor escrito con el "número de destino" a través de la instrucción if else , la función scanf y muestre el resultado de la comparación.

#include <stdio.h>

int main()
{
	int no;
	int ans = 5;

	printf("Please guess0--9:\n");

	printf("是多少呢?\n");
	scanf("%d", &no);

	if (no > ans)
		printf("Too big!\n");
	else if (no < ans)
		printf("Too small\n");
	else
		printf("Yes!You are right!\n");     \\    \n是一种转义字符,表示换行

	return 0;
}

El número establecido en este juego es el 5. Si el número de entrada es inferior a 5, la salida es demasiado pequeña. ; si el número de entrada es mayor que 5, salida ¡Demasiado grande! .

si otra declaración

La declaración if en este programa toma la siguiente forma.

if (expresión) sentencia else if (expresión) sentencia else sentencia

Puede haber muchos otros ifs , dependiendo de la cantidad de condiciones que el programador quiera diseñar.

A continuación, discutimos el método de ramificación múltiple, es decir, usamos la declaración anterior para comparar las otras dos declaraciones morfológicas if else para obtener las ventajas y desventajas. Sin más preámbulos, ¡vamos al código!

if(no > ans)
    printf("Too big!\n");
else if(no < ans)
    printf("Too small!\n");
else
    printf("Yes!You are right!\n");          //1



if(no > ans)
    printf("Too big!\n");
else if (no < ans)
    printf("Too small!\n");
else if (no == ans)
    printf("Yes!You are right!\n");          //2



if(no > ans)
    printf("Too big!\n");
if (no < ans)
    printf("Too small!\n");
if (no = ans)
    printf("Yes!You are right!\n");          //3

Analicemos los programas 2 y 3 en comparación con el 1 para ver qué conclusiones se pueden sacar. El programa 2 agrega juicio (no==ans) al programa 1, que en realidad es muy redundante ; los tres si del programa 3 se yuxtaponen, independientemente de la relación de tamaño entre no y ans, el programa juzgará estas tres condiciones.

A continuación, analizamos los juicios realizados por los programas 1, 2 y 3 a través del gráfico para ver qué conclusiones se pueden sacar. Los siguientes [1] jueces no>ans, [2] jueces no<ans y [3] jueces no==ans.

relación de tamaño no> respuesta cuando no cuando no==respuesta
1 【1】 【1】【2】 【1】【2】
2 【1】 【1】【2】 【1】【2】【3】
3 【1】【2】【3】 【1】【2】【3】 【1】【2】【3】

De lo anterior, se puede concluir que la eficiencia del programa 1 es la más alta .

Repita hasta que adivine correctamente (instrucción do, instrucción while)

El programa anterior que solo permitía al jugador ingresar un valor una vez era muy aburrido. Así que mejoramos el programa para que el jugador pudiera seguir repitiendo hasta que adivinara correctamente . Entonces, ¿cómo implementamos la entrada varias veces? Es hora de que los bucles que aprendimos sean útiles. Use el ciclo de instrucción do para lograr múltiples entradas , el código es el siguiente:

#include <stdio.h>

int main()
{
	int no;
	int ans = 7;

	printf("请猜一个0-9的数。\n\n");

	do {
		printf("是多少呢?\n");
		scanf("%d", &no);

		if (no > ans)
			printf("Too big!\n");
		else if (no < ans)
			printf("Too small!\n");
		else
			printf("Yes!You are right!\n");
	} while (no != ans);

	return 0;
}

La declaración do se repite primero y luego se juzga , lo cual es diferente de sus buenos hermanos, la declaración while y la declaración for (que se discutirán más adelante). En el proceso de aplicar la instrucción do, recuerde siempre que hay un punto y coma ";" al final. Como se muestra arriba, la expresión de control de la sentencia do es no!=ans, operator! = evalúa la condición de que los valores de los operandos izquierdo y derecho no sean iguales. Si esta condición es verdadera, el programa generará un int tipo 1 para indicar la continuación, y si no, generará un int tipo 0 para indicar el final del ciclo.

A continuación, echemos un vistazo al uso de la instrucción while para implementar el juego de adivinanzas:

#include <stdio.h>

int main()
{
	int no;
	int ans = 7;

	printf("请猜一个0-9的数。\n\n");

	while (1) {
		printf("是多少呢?\n");
		scanf("%d", &no);

		if (no > ans)
			printf("Too big!\n");
		else if (no < ans)
			printf("Too small!\n");
		else
			break;
	}
	printf("Yes!You are right!\n");
	
	return 0;
}

La instrucción while es para juzgar primero y luego hacer un bucle , que es diferente del método de bucle de la instrucción do anterior. Como arriba, la expresión de control de while es 1, por lo que el ciclo continuará para siempre. ¿No es tal bucle un "bucle infinito"? ¿Cómo romper este ciclo? La declaración de ruptura es muy poderosa, forzando directamente a salir de la declaración de bucle.

Números objetivo establecidos al azar

En el juego anterior, adivinar los números que establecías por ti mismo era demasiado aburrido. Si puedes generar números al azar para adivinar, agregará mucha diversión. Pensándolo bien, parece que podemos usar la función rand para generar números aleatorios. La función de rand es calcular 0-RAND_MAX ( muchos principiantes no conocen RAND_MAX, en realidad es una macro contenida en el archivo de encabezado <stdlib.h>, que estipula que su valor no puede ser menor que el número mínimo especificado por la compilación entorno, y el mínimo es 32767 ) de secuencias enteras pseudoaleatorias. que es "pseudo" Permítanme analizar uno por uno. Código primero:

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

int main()
{
	int retry;          //再运行一次?

	printf("在这个编译环境中能够生成0-%d的随机数。\n", RAND_MAX);

	do {
		printf("\n生成了随机数%d。\n", rand());

		printf("再运行一次?  (0)否(1)是:");
		scanf("%d", &retry);
	} while (retry == 1);

	return 0;
}

Los amigos inteligentes pueden verificar el compilador con ctrl + C. Después de ejecutar el programa varias veces, encontrará que la secuencia aleatoria generada es exactamente la misma. La función rand parece ser aleatoria, pero no es aleatoria y hay ciertas reglas a seguir. ¿por qué? Esto se debe a que la semilla predeterminada para la función rand (la función rand opera en un valor de referencia llamado "semilla" para generar números aleatorios) es 1. Si queremos generar una secuencia aleatoria diferente, tenemos que cambiar el valor de la semilla.

La función srand muestra un gran poder

La función srand puede resolver el dilema descrito anteriormente. Su función es establecer una semilla para llamadas posteriores a la función rand para generar una nueva secuencia de números pseudoaleatorios. Si se llama a esta función con el mismo valor inicial, se generará la misma secuencia de números pseudoaleatorios. Si se llama a la función rand antes de llamar a esta función, es equivalente a llamar a esta función al comienzo del programa, establecer la semilla en 1 y finalmente generar una secuencia con un valor semilla de 1. Además, otras funciones de biblioteca ignorarán la llamada de esta función en tiempo de ejecución.

¿Cómo expresarlo? Por ejemplo, srand(50) y srand(40), las secuencias aleatorias que generan son diferentes, y vea la siguiente tabla:

Cuando la semilla es 50, genera 235->666->777->231->3489.....
Cuando la semilla es 40 genera 222->2678->2235->1463->87.....

A continuación, si queremos cambiar la semilla de un valor constante a uno aleatorio, podemos referirnos a la hora () del archivo de encabezado <time.h>, utilizando la hora en que se ejecuta el programa como la semilla. Código anterior:

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

int main()
{
	int retry;

	srand(time(NULL));

	printf("在这个编译环境中能够生成0-%d的随机数。\n", RAND_MAX);

	do {
		printf("\n生成了随机数%d。\n", rand());

		printf("再运行一次?  (0)否(1)是:");
		scanf("%d", &retry);
	} while (retry == 1);

	return 0;
}

RAND_MAX mencionó anteriormente que el número que genera puede ser muy grande, posiblemente decenas de miles o cientos de miles. Entonces, ¿cómo controlamos los valores aleatorios generados por srand? Podemos usar la operación de resto para lograr esto. Popularizar el concepto de excedente . por favor mira a continuación:

rand()%6 es un número aleatorio de 0 a 5, porque el resultado de la operación de resto no será mayor que el resto

, vamos a modificar el código anterior:

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

int main()
{
	int retry;

	srand(time(NULL));

	printf("在这个编译环境中能够生成0-%d的随机数。\n", RAND_MAX);

	do {
		printf("\n生成了随机数%d。\n", rand());

		printf("再运行一次?  (0)否(1)是:");
		scanf("%d", &retry);
	} while (retry == 1);

	return 0;
}

¡De esta manera el juego ya no será aburrido! Pero parece haber una falta de entusiasmo , y deberíamos actualizar el programa nuevamente: limite el número de veces y guarde el registro de entrada .

Limite el número de veces y guarde los registros de entrada

Si el juego puede limitar la cantidad de entradas del jugador y guardar el valor ingresado por el jugador, ¡la experiencia de juego del jugador definitivamente mejorará enormemente! Cuando pensamos en guardar valores de entrada, definitivamente podemos pensar en guardarlos en matrices . A través del recorrido de matriz , los valores ingresados ​​por el jugador se almacenan uno por uno y se presentan al jugador una vez que finaliza el juego, para que el jugador sepa qué tan cerca está el número que adivinó del número objetivo. Código primero:

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

#define MAX_STAGE 10

int main()
{
	int i;
	int stage;           //玩家已经操作的次数
	int no;
	int ans;
	int num[MAX_STAGE];        //玩家能操作的最大次数

	srand(time(NULL));
	ans = rand() % 1000;

	printf("请猜一个0-999的整数。\n\n");

	stage = 0;
	do {
		printf("还剩%d次机会。是多少呢: ", MAX_STAGE - stage);
		scanf("%d", &no);
		num[stage++] = no;

		if (no > ans)
			printf("Too big!\n");
		else if (no < ans)
			printf("Too small!\n");
	} while (no != ans && stage < MAX_STAGE);

	if (no != ans)
		printf("很遗憾,正确答案是%d。\n", ans);
	else
	{
		printf("Yes!You are right!\n");
		printf("您用了%d次猜中了。\n", stage);
	}

	puts("\n--- 输入记录 ---");
	for (i = 0; i < stage; i++)
		printf(" %2d:%4d %+4d\n", i + 1, num[i], num[i] - ans);

	return 0;
}

Analicemos el código anterior.

(1) Comencemos con un ejemplo incorrecto. Los programadores junior a menudo cometen los siguientes errores :

int n=10;
int arr[n]={0};

A primera vista parece similar a lo anterior, pero en realidad es una forma incorrecta de escribir. Es la forma correcta de definir una macro primero y luego referirse a la macro en la matriz [] ;

(2) El código num[stage++]=no; es un sufijo ++ , que usa un bucle for para aumentar el número de etapas. A través del procesamiento de bucles repetidos, los valores ingresados ​​por el reproductor se pueden almacenar en la matriz en secuencia.

(3) En este código, usamos la instrucción for no mencionada anteriormente para mostrar los registros de salida . Saquemos este código y lo expliquemos por separado:

for (i = 0; i < stage; i++)
		printf(" %2d:%4d %+4d\n", i + 1, num[i], num[i] - ans);

Primero, establezca el valor de i en 0. Cuando el valor de i es menor que la etapa, continuará aumentando el valor de i en +1, para permitir que el cuerpo del ciclo ejecute los tiempos de la etapa (el valor de la etapa es igual al número de veces que el jugador ingresa el valor).

%2d %4d El número antes del símbolo y la letra representa el ancho de campo, y el +4 en %+4d alinea el número a la derecha.

Lo siguiente · representa un espacio, tome 125 como ejemplo
%4d      125 ·
%+4d    ·125

fin

Lo anterior es Shi Lu. La comprensión y el análisis del primer juego de esta serie, el juego de adivinanzas de palabras, ¡gracias por mirar aquí! Si cree que este blog es útil para usted que está aprendiendo programación, ¡brinde más apoyo y atención a Shi Lu! En los próximos 10 días más o menos, Shi Lu. jugará otros juegos implementados por programación contigo. Espero poder ofrecerte mejores juegos la próxima vez, ¡y espero que el próximo blog te incluya!


 

Supongo que te gusta

Origin blog.csdn.net/qq_64263760/article/details/122880908
Recomendado
Clasificación