Cómo hacer un juego simple e interesante usando C
1. Más sencillo:
Los extranjeros llaman a este juego Toros y Vacas (Toros es A, Vacas es B).
Usando C, se puede escribir así:
#include lt; iostreamgt
#include stringgt; #include lt;sstreamgt;
#include lt;setgt;
#include lt;cstdlibgt;
#include lt;ctimegt; p>usando el espacio de nombres std;
// Devuelve toros y vacas puntuados por conjetura en númerosecreto
string bullsAndCows( conjetura sin firmar, número secreto sin firmar ) {
stringstream. ssGuess,
p>
ssNúmeroSecreto lt; lt; adivinar
ssNúmero Secreto lt; > string strGuess( ssGuess.str( ) ),
strSecretNumber( ssSecretNumber.str( ) );
toros sin firmar = 0,
vacas = 0,
i;
for ( i = 0; i lt; strSecretNumber.length( ); i ) // contar toros
if ( strSecretNumber[ i ] == strGuess[ i ] ) {
toros;
strGuess.erase( i, 1 ); // borrar para facilitar
strSecretNumber.erase( i , 1 ); // conteo de vacas
--i;
}
for ( i = 0; i lt; strSecretNumber.length( ); i ) // contar vacas
if ( strGuess.find( strSecretNumber[ i ] ) != string::npos ) {
vacas;
strGuess. borrar( strGuess.find( strNúmeroSecreto[ i ] ), 1
strNúmeroSecreto.erase( i, 1
--i;
}
return string( 1, '0' toros ) string( 1, '0' vacas
}
// Devuelve verdadero si n es); positivo, 4 dígitos, no contiene 0 o dígitos repetidos
bool isValidInput( int n ) {
stringstream
ss lt; ;
cadena s = ss.str( );
devolver 1000 lt; = n amp; n lt = 9999 amp; s.find( '0' ) == cadena: :npos amp;
setlt;chargt; ( s.begin( ), s.end( ) ).size() == 4; p>
}
void main() {
// selecciona un número secreto aleatorio válido
srand( time( NULL ) ); p>
númerosecreto sin firmar = 0;
while ( ! isValidInput( númerosecreto ) )
númerosecreto = rand()
for ( conjetura sin signo = 0; 0, conjeturas = 1; conjetura != númerosecreto; conjeturas ) {
cout lt;lt; "Tu conjetura (#" lt;lt; conjeturas lt;lt; "): "; p>
entrada de cadena;
cin gt; entrada
if ( input.length() != 4 ||
! ( stringstream(entrada) gt; adivinar ) || isValidInput( adivinar ) ) {
cout lt "\n\tError: la entrada debe ser positiva -número de dígitos sin "
"0 o dígito repetido.\n\n";
--guessCount;
continuar;
}
string torosCows = torosAndCows( supongo,
número secreto );
cout lt; "\tA: " lt; torosVacas[ 0 ] lt; \n";
}
cout lt; lt; "\n\t¡Lo tienes!\n\n";
} p>
Para uno más complicado, gobang:
#include "stdafx.h"
#include stdio.hgt;
# incluir lt; math.hgt;
//?HINSTANCE hInst;
ajedrez HBITMAP[2]; >
HWND hWnd;
DWORD tPre, tNow;
int board[10][10]
bool ptab[10][10] [192];
bool ctab[10][10][192];
int win[2][192];
int num[2 ];
bool turn,over;
int ganador;
//ㄧΑ
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc); p>
void InitGame();
void ComTurn();
//****?祘Α**** ******** **************************
int APIENTRY WinMain(HINSTANCE hInstance,
p>HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass (hInstance);
// libra《?﹍てㄧΑ
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE
}
//De la mano
while( msg.message!=WM_QUIT )
{
if( PeekMessage( amp; msg, NULL, 0, 0, PM_REMOVE) )
{<
/p>
TranslateMessage(amp;msg);
DispatchMessage(amp;msg);
}
más
{
tNow = GetTickCount();
if(tNow-tPre gt; = 100)
MyPaint(hdc); }
}
return msg.wParam;
}
//****)竡の¿Padre? ㄧΑ************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW
wcex.lpfnWndProc = ( WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0
wcex.hInstancia = hInstancia
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = (HBRUSH); )(COLOR_WINDOW 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "lienzo";
wcex.hIconSm = NULL;
return RegisterClassEx(amp;wcex);
}
//****?﹍ㄧΑ*************** *** *******************************
// InitGame() ㄧΑ秨﹍ Pila Ы
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
mosaico HBITMAP, bmp
int rowNum, colNum; /p>
int i, x, y;
hInst = hInstancia;
hWnd = CreateWindow("lienzo", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
devuelve FALSO;
}
> MoveWindow(hWnd, 10, 10, 480, 520, verdadero);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
bufdc = CreateCompatibleDC(hdc
bmp = CreateCompatibleBitmap(hdc, 450, 450); );
SelectObject(mdc, bmp);
mosaico = (HBITMAP)LoadImage(NULL, "tile.bmp", IMAGE_BITMAP, 45, 45, LR_LOADFROMFILE
ajedrez[0] = (HBITMAP)LoadImage(NULL, "ajedrez0.bmp", IMAGE_BITMAP, 38, 38, LR_LOADFROMFILE);
ajedrez[1] = (HBITMAP)LoadImage(NULL, "ajedrez1.bmp", IMAGE_BITMAP, 38, 38, LR_LOADFROMFILE);
para (i=0; ilt; 100; i )
{
número de fila = i / 10;
numcol = i 10;
x = numcol * 45
y = numfil * 45; SelectObject(bufdc, mosaico);
BitBlt(mdc, x, y, 45, 45, bufdc, 0, 0, SRCCOPY
}
); InitGame();
MyPaint(hdc);
devuelve VERDADERO
}
//****¿Chimenea? ㄧΑ******************************************
/ / 1.瞞) ¿Cadena de pila?﹍?篈の丽scale?ず甧
// 2.∕)?よ
void InitGame()
{
int i, j, k;
int recuento=0;
over = false
num[0] = num[1] = 0;
//砞)?producir甔筭福?利cabina de escala?い?Stack?cálculo
for(i=0;ilt;192; i) p>
{
ganar[0][i] = 0
ganar[1][i] = 0
} p>
///?﹍て¿Cadena de chimenea?篈
for(i=0;ilt;10;i)
for(j=0; jlt;10; j )
board[i][j] = 2;
//瞞)?キよ里 ¿Cabina de escala?
for( i=0; ilt; 10; i )
para(j=0; jlt; 6; j )
{
para(k=
0; klt; 5; k )
{
ptab[i][j k][cuenta] = verdadero;
ctab[i][j k] [count] = true;
}
count ;
}
//¿Qué es la cabina de báscula?
para(i=0;ilt;10;i)
para(j=0;jlt;6;j)
{
para (k=0;klt;5;k)
{
ptab[j k][i][count] = verdadero;
ctab[j k ] [i][recuento] = verdadero;
}
recuento
}
//瞞)タ簸à絬よ¿Cabina de escala Li?
for(i=0;ilt;6;i)
for(j=0;jlt;6;j)
{
for(k=0;klt;5;k)
{
ptab[j k][i k][count] = true;
p>
ctab[j k][i k][count] = true;
}
count
}
//瞞)は簸à絬よ利 ¿Cabina de escala?
for(i=0;ilt;6;i)
for(j=9;jgt ;=4; j--)
{
for(k=0;klt;5;k)
{
ptab[j-k] [i k][count] = verdadero;
ctab[j-k][i k][count] = true;
}
recuento;
}
//Ver el plan∕)パê?よStack?
srand(GetTickCount());
if (rand()2 == 0)
giro = verdadero
else
giro = falso
}
/ /****筿福ㄧΑ************************************ ******
// 1.璸hengliscaleだmeasure
// 2. 匡気成ㄎ?缼缼《波?
void ComTurn( )
{
int calificaciones[2][10][10];
int m, n, i, max=0
;int u, v;
for(m=0;mlt;10;m)
for(n=0;nlt;10;n)
{
calificaciones[0][m][n] = 0;
calificaciones[1][m][n] =
if(tablero[m][ n] == 2)
{
for(
i=0; ilt; 192; i )
{
//璸heng?出款 ¿Pila?利escalaだmedida
if(ptab[m] ] [n][i] amp; ganar[0][i] != 7)
{
cambiar(ganar[0][i])
{
caso 0:
grados[0][m][n] =1
descanso
caso 1:
calificaciones[0][m][n] =200;
descanso
caso 2:
calificaciones [0][m][n] =400;
descanso
caso 3:
calificaciones[0][m][n] = 2000 ;
ruptura;
caso 4:
calificaciones[0][m][n] =10000;
ruptura;
}
}
//璸heng筭福管?利赐plan
if(ctab[m][n] [i] amplificador; ganar[1][i] != 7)
{
cambiar(ganar[1][i])
{
caso 0:
calificaciones[1][m][n] =1
descanso
caso 1:
calificaciones[1][m][n] =220;
ruptura
caso 2:
calificaciones[1] [m][n] =420;
descanso
caso 3:
grados[1][m][n] =2100; p>
p>
descanso;
caso 4:
grados[1][m][n] =20000
descanso;
}
}
}
si(max == 0)
{
u = m;
v = n;
}
if(grados[0][m][n] gt; max)
{
max = grados[0][m][n];
u = m
v = n;
}
else if(grados[0][m][n] == máx.
)
{
if(grados[1][m][n] gt; grados[1][u][v])
{
u = m;
v = n;
}
}
if(grados[1] [m][n] gt; max)
{
max = grados[1][m][n];
u = m;
v = n;
}
else if(grados[1][m][n] == máx)
{
if(grados[0][m][n] gt; grados[0][u][v])
{
u = m ;
v = n;
}
}
}
}
placa[u][v] = 1; //瞞)?筭福?Stack?
num[1];
if(num[0] == 50 amperios ;amp; num[1] == 50)
{
ganador = 2; //キも
over = true;
}
else
for(i=0;ilt;192;i)
{
if(ctab[u ][v][i])
{
ganar[1][i] ;
ptab[u][v][i] = falso ;
ganar[0][i] = 7;
if(ganar[1][i] == 5)
{
ganador = 1;
over = verdadero
}
}
}
turno = true; //¿Aprobado?Producción?
}
//****?璹璹素瓜ㄧΑ*************** * *******************
// ¿Qué me pasa?
void MyPaint(HDC hdc)
{
int m, n;
char *str
if(over)
{
>switch(winner)
{
caso 0:
str = "礤 ¿Tumba? ! F1 睝缼《紴兰. . ";
break;
caso 1:
str = "¿Tumba de Xiao Fu? ! F1 Zhong Xian "笴 LAN..";
break;
caso 2:
str = "ぃだsello de escala! F1 睝缼《笴兰..";
break; >
}
<p> TextOut(hdc, 10, 470, str, strlen(str));
}
else if(!turn) //筿福
{
str = "筿福?σい... ";
TextOut(hdc, 10, 470, str, strlen(str)); > ComTurn();
}
else
{
str = "赣礤... ";
TextOut(hdc, 10, 470, str, strlen(str)
}
for(m=0;mlt;10;m)
for(n=0; nlt; 10; n )
{
if(board[m][n] == 0) //¿Cuál es el problema?
{
SeleccionarObjeto(bufdc, ajedrez[0]);
BitBlt(mdc, m*45 3, n*45 3, 38, 38, bufdc , 0, 0, SRCCOPY);
}
else if(board[m][n] == 1) //禟?筭福庄?
{
SelectObject(bufdc, ajedrez[1]);
BitBlt(mdc, m*45 3, n*45 3, 38, 38, bufdc, 0, 0 , SRCCOPY);
}
else //禟?
{
SelectObject(bufdc,chess[1]);
BitBlt(mdc, m*45 3, n*45 3, 38, 38, bufdc, 0, 0, BLANCO
}
}
BitBlt(hdc, 10, 10, 450, 450, mdc, 0, 0, SRCCOPY);
tPre = GetTickCount()
}< / p>
//****窪?窪瞆ㄧΑ********************************* **** **
// 1. ¿Edad F1?
LRESULT CALLBACK WndProc(HWND hWnd, mensaje UINT, WPARAM wParam, LPARAM lParam)
{
int x, y, m, n, i;
switch (mensaje)
{
case WM_KEYDOWN: // La edad es flat?
switch (wParam)
{
case VK_ESCAPE: // Esc edad
PostQuitMessage( 0 );
descanso
caso VK_F1: // edad F1
InitGame();
break;
}
case WM_LBUTTONDOWN: //¿El público filipino es viejo?
if(!over)
if(turn)
{
x = LOWORD(lParam); //?眔飞公X畒clip
y = HIWORD(lParam); /?眔飞公Y畒clip
if(x gt; 10 amp; amp; x lt; 460 amp; amp; ygt; 10 amp; amp; y lt; 460)
{
m = (int)piso((x-10)/45);
n = (int)piso((y-10)/45);
if(board[m][n] == 2)
{
board[m][n] = 0 //Cuál es el resultado; ? ¿Chimenea?
num[0];
if(num[0] == 50 amp; num[1] == 50)
{
ganador = 2; //キも
over = true;
}
else
para ( i=0; ilt; 192; i )
{
si(ptab[m][n][i])
{
ganar[0][i];
ctab[m][n][i] = falso
ganar[1][i] = 7;
p>if(win[0][i] == 5)
{
ganador = 0
over = true
p>}
}
}
turn = false; // ¿Predicar bendiciones?
} p>
}
}
descanso
caso WM_DESTROY: //¿Desinflado?
EliminarDC( mdc); /p>
EliminarDC(bufdc);
EliminarObjeto(ajedrez[0]);
EliminarObjeto(ajedrez[1]); hWnd, hd
c);
PostQuitMessage(0);
break;
default: //ㄤウplano?
return DefWindowProc(hWnd). , mensaje, wParam, lParam);
}
devuelve 0;