Anda di halaman 1dari 328

PROGRAMACI

ON Y LENGUAJE

Lamaqui na( compu)leelosprogramasen


lenguajebinario(0101010 al oMat rix),
hexadecimal( H16)oal gotambi en l
lamado
lenguajeens amblador.I
maginates iescribir
"hola"en binarioes"01101000 01101111
01101100 01100001"comos erí
aes cri
bir
un videoj
uego. .
.escasii
mposibl
e,t ellevaría5
rencarnaciones.

Entoncesloqueseconvenci
onaesempl earun lenguaj
e"int
ermedi o"en elque
nosot
rosledigamosalgocomo" checomput adora,mataaFl anders"yal go
l
lamado" compil
ador"loconvi
ertaen bi
narioparaquel amaqui nalopueda
l
eersin probl
emas(comoun traductor)
..
.entreestosl
enguajesencontramosC,
Ruby,Java,etc.

I
NTRODUCCI
ON A ALGORI
TMOS

-Medes calzo
-Mes i
ent oen l
acama
-Merecues tosobrelacama
-Pongol acabezaen laal
mohada
-Cierrol osojos
-Mepegounas i
estadelasan.
..
I
NTRODUCCI
ON A ALGORI
TMOS

-Avanzarhaci aladerecha Vemosun cl aroejempl ode


-Detenersedebajodelprimercubo algori
tmodevi deojuego.
..nos
con s
igno" ?" piden un al
goritmoparaque
-Saltar elplomeritoMari oBross e
-GolpearelCubocon s i
gno"?" hagagrandeen elpri mer
-Esperar nivelnibien empiezaeljuego.
-Coli
sionarcon elHongo
Es
trategi
aAlgori
tmosTOP Down
(Programaci
on Modul
ar)
Es
trategi
aAlgori
tmosTOP Down
(Programaci
on Modul
ar)
Estasub-di
vis
ión mugros
adelprobl emaselellamadi s
eñodecendent eo
Top-Down..
.¿dequés i
rves aberelnombre?.
..denada.Perol oimportantecomo
l
eíen unosapuntesdelaFacul t
ad,lopri
ncipaldel aEstrat
egiaessaberdivi
direl
probl
emageneralen problemasmaspequeños ,trabaj
andoi ndi
vidual
menteen la
sol
uci
ón decadaproblema.

Elalgoritmot iene3 caract erísticas:


- Finit
o:Bri ndas oluci
ón en unacant idad determinadadepas os( i
ns t
rucciones)
.
- Definido:Clarament edefini do,s in posi
blesmal i
nterpretaci
ones ,ambi güedades,
quel l
evealres ultadoconcret o.
- General:Debebri ndarunas oluci
ón aun probl emageneralynopart i
cular.
Ejempl o:Podemoshacerun al goritmopara" Saltar"locualresolvería" Sal
tar"en
cualquierladoymoment o,ohacerl opart icul
arei ncorrectament es eríahacerun
algori
tmoparas altaren elmi nut o23,es tandoparadoen puent eLaNori a,lo
cualsolos ervi
ríaparaes as ituaci ón parti
cular,perdiendol aefici
enciacomo
algori
tmo.

CONDI
CIONALES Y DEMAS
Paraent endermejorlaf
ormaen quel amáquinatrabaj
aun al gorit
movamosa
aprenderés t
oqueesbien bás
icoysetratadecondici
onales
.Ell enguaj
eporlo
generalpermi t
eelusodecondici
onal
es.
..¿
quéescondici
onales
?¿ dequecaraj
o
hablaschabon?..
.

ENTONCES
SI
SI
NO
FI
NSI

SIDADO ES DI STINTO A 6
- LANZAR DADO
SIelresul
tadoES DISTINTO a6
ENTONCES vol verapaso1
SI
NO f i
nali
zar
FI
NSI
Es
trategi
aAlgori
tmosTOP Down
(Programaci
on Modul
ar)

I
NICI
OPROCESO

-Usuarioingres
aelnumero
-SIelnumeroesmayor>a6
ENTONCES
-Quel acomput adoradi
gaun
cartel(i
mprimaen pantall
a):
"Oyet i
oelnumeroesmayora
6"
-SINO
-Quel acomput adoradi
gaun
cartel(i
mprimaen pantall
a):
"Elnumeroesmenora6"
-FINSI

FI
NPROCESO
REPETI
CIONES

Pri
meramenteparaexpresarel
al
gori
tmovamosadet erminarel
pri
nci
pioyelfi
n delproces
o:

PROCESO

SIcondici
on ENTONCES
-I
nstrucci
ones(
Acci
ones
)
SI
NO
-I
nstrucci
ones(
Acci
ones
)
FI
NSI

FI
NPROCESO

Ahoraañadiremosaest
olasrepeti
cionesl
ocualesalgoquenosf
aci
li
tarámucho
l
avida,aunquealpri
ncipi
oparezcaquenoscomplique.
REPETI
CIONES

¿Paraqués
irven l
asrepet
ici
ones?.
..porej
emplosinospi
den un al
gori
tmopara
caminar10 ki
lometros
,supongamosl aacci
ón:

PROCESO

-Piederechoadel
ante
-Piei
zquieroadel
ante
-Piederechoadel
ante
-Piei
zquierdoadel
ante
.
..

FI
NPROCESO

PROCESO

REPETIR
-LanzarDado
HASTAQUE Dados
eai
guala
6.

FI
N PROCESO
Bueno,aprenderemoscomoprogramaren C++des decero.Paraentenderun
pocoéstodecomoent i
endel
amáqui naloscódigosquelesdamosesneces ari
o
saberqueson l
osALGORITMOS,cosaqueexpliquéen elcapí
tuloant
erior.

Ahorabi en recordandot odoeso,lamáquinaenti


endeloscódi
gosyas eaen
binari o(cerosyunos ,aloMat ri
x)oHexadeci
mal( 0-H16),l
ocualparacrearun
programat ardaríamosmi lañosen hacerl
omanualmenteen esecódi
gollamado
"Códi godeMaqui na".Poresolo
quehacemosesus arun
programadondevamosa
escribiren un LENGUAJE para
darlel asi nst
ruccionesque
queremosal amáqui nayéste
programal uegovaaCOMPI LAR
(Convert ir)todol oque
escribimosalcódi goque
comprendel aPC def orma
automát ica.A todoes toque
escribimosen es eLENGUAJE s e
lollamaCODI GO FUENTE,yl oobt eni
docons
ecuenci
adelcompiladoresel
CODI GO OBJETO.
cout
<<"
Elmej
ort
utori
aldet
uvi
da"
;

Todaslasinst
ruccionesen C++t ermi nan con punt
oy
coma( ;)
,siteolvidasestoen algunal inea,pormasque
seasol
ounal ineade9999 t uprogramanovaaf unci
onar
ys evaai rtodoalcarajo.Hayal gunasl i
neasqueno
ll
evan puntoycomaques on especí
ficasyqueyat elas
vamosamos trar,perolasinstruccioness i
emprellevan
puntoycomaalf i
nal.
Aún as
ítodavíanosabemosdondemet ernues
trainstrucci
ón as
íques igamos
vi
endoelcódigoquevienepordefect
o..
.másabajotenemosunai nstrucción
namespacequeporahoranol edaremosimportanci
a,ydebaj oahoras ihay
al
goprimordial,l
aFUNCI ON mai
n.
PROCESO
i
nstrucci
on1
i
nstrucci
on2
FI
NPROCESO

En ellenguajeC++elI NI CI
O del af unci
ón oPROCESO esluegodelnombrede
l
af unción oseai ntmai n(i
ntar gc,char*ar gv[]
)els
ímbol
odecorcheteabi
ert
o
{
Debajodees ecorchet epuedehaberi nfi
nidad de
l
ineas,todases tasli
neases tarán dentrodel a
funci
ón quel eprecedeodeés teprocesohas t
aque
sedeclareelf i
nal,y¿ cómodecl aramosel
FINPROCESO?,puescon elcorchet ecerrado}.
At odocont enidoquees táent re{}s el
ellama
BLOQUE.

cout
<<"
Elmej
ort
utori
aldet
uvi
da"
;
Sinosllegaraasurgi
ralgun erroreldepuradori
nferi
ornosavis
aráquel i
neay
porque( en i
ngl
és)
,siledamosdobl ecli
ckalerrornosll
evaráalalineacitada.
I
magi nemosquenoponemosun punt oycoma,alcompi lareldepuradornosl o
i
ndicaría:
Comovei amosant essi
n elerroren nuestraimpres
ión detext
os ei
mprimeel
textoen pantal
layf i
nali
zaelprograma.Peroneces it
amosverlo,oseano
quieroquefinal
iceelprogramahas taquepres i
oneunat ecl
a,¿comohago?.
..
buenoinclui
mosen l apartesuperi
ores t
al i
breri
aprimero:

#i
ncl
ude<cs
tdl
ib>

s
yst
em(
"PAUSE"
);
cout
<<"Elmejor";
cout
<<"tutori
al"
;
cout
<<"det uvida";

Sil
oej
ecut
amosobt
endremoses
to:
cout
<<"Elmejor";
cout
<<endl
;
cout
<<"tutori
al"
;
cout
<<endl
;
cout
<<"det uvida";
cout
<<endl
;

Perosiendomáspráct i
mospodemosus
artantos<<comoqueramosen unas ol
a
l
inea,entoncespodrí
amoshaceres
toparatenermej
ororgani
zadoelcódigo
todoen uno:

cout
<<"
Elmej
or"
<<endl
<<"
tut
ori
al"
<<endl
<<"
det
u
¿
Comovemoslainstrucci
ón comodi ji
mosllevapunt
oycomaalf i
naldel
a
l
ineai
ndi
candoelf
in delafunción cout.Elres
ult
adoserí
aes
te:
int(integer,s
ignif
icaentero,porl oques i
rveparaaloj
ardatosdenúmerosenteros
)
float(numerosf l
otantes,¿vuelan?,no,losnumeroscon comadeci
malytodaesabol a)
char( permitealojarcarácteres,esdeci
r,letrasos
uscódi gos
)

TI
POVARI
ABLE NOMBREVARI
ABLE;

Vemosquealf
inall
levapuntoycomatambi
én.Comoal
ojaremosun
númeroent
eroll
endoalejempl
ovamosahacerl
oasí
:

i
ntpri
merVari
abl
e;
Ahora,supongamosqueyoqui eroqueguardededat oelnumero5 esavariabl
e.
¿Comoleas ignamosun dat
oaunavari abl
e?,puescon els
imbol
o=s ucedi
dode
l
aas i
gnación.Estaserí
alaest
ructura:

NOMBREVARI
ABLE =VALOR;

En nuest
roej emplocomodij
imosqueseleagregarí
adedatoelnúmero5
quedarí
ai ncl
uyendolali
neadeladecl
araci
ón delavari
abl
e:

i
ntprimerVari
abl
e;
pri
merVari
able=5;

cout
<<pri
merVari
abl
e<<endl
;
Y alej
ecut
arl
overí
amoses
to:

Podemoscomplement arl
odet ext
oparaques eamásboni
toydepasada
segui
mospract
icando,algoquedigacomo" Elpunt
ajees:
"ysegui
doporel
datodelavari
able.
..en nues
troejempl
oseri
a:

cout
<<"
Elpunt
ajedel
atort
ugani
njaes
:"<<pri
merVari
abl
e<<endl
;
Y quedarí
aal
goas
i:

cout<<"Elpuntajedelatortuganinjaes:"<<primerVariable;//Estoesun comentario,hoyaprendimoslindoeh
pri
merVari
abl
e=pri
merVari
abl
e+5;
Labarradevi daest
áen 100,ent oncesdigamosquel abarradevidaesuna
variabl
eenteracon eldato100 asignado.Cadagolpedelenemi gores
ta20 a
labarradevi da,entoncesdi
gamosqueelgol peesunavari abl
eenteracuyo
valores20.Ahorarepres ent
emosdent rodel afunci
ón main elcal
cul
odecomo
quedaríaaf
ectadoelval ordelabarradevi dasinosgolpeaunavezelenemi go:

intbarraVida=100;
intgolpeEnemigo=20;
cout<<"Lavidadelpers
onajeesde" <<barraVi
da<<endl;
barraVida=barraVida- golpeEnemigo;
cout<<"Lavidadelpers
onajeluegodelgolpeesde" <<barraVi
da<<endl
;

#i
ncl
ude<cmat
h>
Comodiji
mosl avari
abl
eyat ienequeestarcreadaparaquepodamosi ndicarl
e
dondevamosaguardares edat oqueelusuari
oingresa,entoncess
uponi endoes o
vamosas i
mularestodelbanco,primerodentrodelbloquemai n({})creamos
unavari
ablel
lamadacuentaPas s
word,del asi
guient
ef orma:

i
ntcuent
aPas
sword;

ci
n>>cuent
aPas
sword;
Paradeclararunacons tant
eharíamosalgocomocons t
,s egui
dodeltipoyel
nombre,t alcualhaciamoscon l
asvari
ables
,quedandoalgocomoes t
o( tengan
en cuentaqueyal edebemosas i
gnarun valori
nici
alypermanentecomo
mues traelej
empl o)
:

cons
tTI
POCONSTANTE NOMBRECONSTANTE =VALOR;

Un ejempl
oteni
endoen cuent
aquecrearemosun juegoparares
oluci
ón de
pantall
a800x600 yal
ojaremosdi
chodat oen 2 vari
abl
es:

cons
tintANCHO_PANTALLA =800;
cons
tintALTO_
PANTALLA =600;

Otraal
ternati
vaaus
arcons
tant
esesus
ar#def
ine,ques
eempl
earí
adel
a
si
gui
ent
ef orma:

#def
ineNOMBRE VALOR

#def
inePI3.
14
Entoncesloprimeroquevamosahaceresi ncl
uirlalibrerí
aalpri
nci
piode
nuestrocódigoquenospermit
autil
izarelrel
ojinternodel acompu,yest
a
l
ibrerías
el l
amact i
me.Laincl
uimosdelas i
guient
ef orma:

#i
ncl
ude<ct
ime>

s
rand(
time(
NULL)
);

Ahoraloúltimoquenecesi
tamossabereslafunci
ón rand queeslaquenospermite
deci
rle"des
dequenumerohas taquenumero"queremosques eaposi
bleelnumero
alazar,porejempl
osiqueremossimularun dadoaloMonopol ydeberíamosdeci
rle
"des
de1 has t
a6"entrelosnumerosposibl
es.
Lafunci
ón en s
uest
ruct
uraaut
omáticament
eempi eza"des
decero"has
tael
numeroquelepasemoscomoparametroyfunci
onaríadelasi
guient
eforma:

rand(
)%NUMEROFI
NAL;//Des
de0 has
taNumeroFi
nal

Si
gui
endoelej
empl
odeldado:

rand(
)%6;//Des
de0 has
ta6

rand(
)%NUMEROFI
NAL+NUMEROI
NICI
AL;

Quedarí
aal
goas
ínues
trodado:

rand(
)%6+1;

i
ntdado1;//Creamoslavari abl
equeal
ojanumerodeldado
srand(
time(
NULL))
;//Ini
ciali
zamosrandomizercon rel
oj
dado1 =rand(
)%6+1;//Asignamosadado1 un numeroalazardel1 al6
SI(
If)
..
.
Entoncesparauti
li
zarelcondici
onal"
SI"empl
eamosl
apal
abrai
fen i
ngl
és.La
es
tructuradeifeslasi
guient
e:

i
f(CONDI
CION)
{ABRIMOS BLOQUE I
F
CONSECUENCIAS
}CERRAMOS BLOQUE IF

Comovemosali gualquel afunci


ón mai nsucont enidoest
áexpres
adoen un bl
oque
l
uegodes udecl
aración.Entoncesparat omarun ej emplodeéstomásrealvamosa
declararunavariabl
eent eraques ell
amevi dasPers
onajeyqueseaiguala3..
.y
suponiendoquecolocamoselcodi goen algunapart edecodigodeun juegodela
muert edelpers
onajes erí
aalgoas íelcondicionaldegameover:

if
(vi
dasPersonaje==0)
{
cout<<"
Perdist
ef l
aco,gameover,chaupi
chu.
"<<endl
;
}
Porejemploen elcl
ási
cojuego1942,imagi
nemosquet
enemosunavari
abl
e
querepres
entavidasPers
onajeysuval
ores2,osea:

intvidas
Personaj
e;
vidas
Personaje=2;

Ahorasupongamosqueeljugadorll
egaaun punt
ajerecord muyal
toys
egana
unavida,bi
en podemoshacerlosi
guient
e:

vi
das
Pers
onaj
e=vi
das
Pers
onaj
e+1;

O podemosuti
li
zarlosoperadoresdeas
ignaci
ón paraas
ignarl
eunas
umay
s
implif
icarl
odeést
af orma:

vi
das
Pers
onaj
e+=1;
Elres
t odelosoperadoresdeasignación f
unci
onadel
amis
maf orma,aunque
también t
enemosot rosdes
tacadosdemenci onarymuyút
ilesqueson l
osde
i
ncrement oydecrement o(noses isediceasi
):

Bási
camenteincrementan odi
sminuyen elval
ordeunavari
abl
een 1 (haci
aarri
ba
oabajo)
.Comoen elejemploanteri
orpodríamoshaberaumentadoen 1 l
avari
able
haci
endoest
o:

++vi
das
Pers
onaj
e;
Solovimosuno,peropongamosot roej
emplo,util
icemoselde" mayora">.
Recordemosun cl
ási
cojuegoll
amadoThi efGol
d,paral osquenol oconocen
debíamosen al
gunosni
veles"
robar"almenosciertacantidad deorocomo
obj
et i
vo.

Supongamosquenosproponen robaralmenos1500 deoroyl uegodeesonos


sal
dráun mensajequedirá"Objeti
voCumplido"paraquepodamoshui rdela
mansión.Paraesouti
li
zari
amosun condi
cionalquedigaalgocomoSI (
canti
dadOro
esmayoracant i
dadObjeti
vo)ENTONCES impri mirmensajequediga"Fl
aco,move
eltuj
equeyat enemoseloro",FINSI:

intcant i
dadOro;
intcant i
dadObjet
ivo;
cantidadObjet
ivo=1500;
if(
cantidadOro>cant i
dadObjeti
vo)
{
cout<<"A moverlaspierni
tasquetenemoseloro.
"<<endl
;
}
SI
NO (
els
e).
..
Ahoraqueaprendi mosun pocodelifyyapodemosj ugarcon élvamosadecorarlo
un pocomás ,imaginemosquees t
amosj ugandoDuckHuntcon es eperrochori
zo
ques erí
e..
.recordemosun poco,eljuegocons i
stíaen cazarpatos
,algobastant
e
cruelporcierto,ys iobt
ení
amosl acantidad objeti
voen eltiempodeterminado
ganabamos ,si
noperdí amos.

Ent oncespasandoloaal gori


tmocon l ovi s
toant eriormenteserí
aal gocomo
SI(cantidadObtenida>cant i
dadObj etivo)ENTONCES mens aj
e"ganaste
wachi n"FINSI,perocomoant esqueremosques inocons i
guióesacantidad
digaGAME OVER,ent oncesl uegodecerrarelFI NSI}ut i
li
zaremosun SINO
querepres entari
aa" SINO secumpl elacondi ci
on"ENTONCES yabri mosot ro
bl
oque{}quecont endrál oques ucedeen t alcaso.Vist
omásen vi vosería:
i
ntcant
idadObt
enida;
i
ntcant
idadObj
eti
vo=8;

i
f(canti
dadObt eni
da>c antidadObjeti
vo)
{
cout<<"
Ganas t
e,vamosac ome rpapasfrit
asyf es
tejar"
<<endl
;
}
els
e
{
cout<<"
Elpe rroconch****seestariendo,esos
ignifi
caquepe rdi
ste
man" <<endl
;
}
i
f(CONDI
CION)
{ABRIMOS BLOQUE I
F
I
NSTRUCCIONES SISE CUMPLE CONDICI
ON
}CERRAMOS BLOQUE IF
SI
NO
{ABRIMOS BLOQUE SI
NO
I
NSTRUCCIONES SINO SE CUMPLE CONDICI
ON
}CERRAMOS BLOQUE SINO
SI
NO SI(
els
eif
)
Vamosacondi mentarcon un últimocompl ement oanues trosif
,sequehas t
a
ahoraesbas tantecompletoloquevi mos,peroreal ment etodoestotevaa
servirparahacermagi a,yaes t
ásvi endolaspos i
bil
idadesen losmismos
ejemplosquet efuidando,yreal ment eesas í.Ok,yas abemosi f
,sabemos
else,peroimaginemoses t
eejempl o,elvideojuegoCont ra,vamosadi sparar,
segun elval
ordenues traarma( de1 a5)s eef ectuaraun di s
parodiferente.
..
recordamosquenues traarmacambi abaagarrandoes aespeciedebalon de
futbolamericanovolador.Entoncesi maginemosen al gorit
moeldi sparocon
lonuevoqueveremos :
i
ntarma;

if
(arma==1)
{
cout<<"Di
sparonormal"<<endl;
}
els
ei f
(arma==2)
{
cout<<"Di
sparoburbuj
a"<<endl;
}
els
ei f
(arma==3)
{
cout<<"Di
sparoburbuj
asexpans ion"
<<endl
;
}
els
ei f
(arma==4)
{
cout<<"Di
sparogi
ragiragi ragiratodobajoels
ol"
<<endl
;
}
els
ei f
(arma==5)
{
cout<<"Di
sparol
aser,pii
iiuuum"<<endl;
}

Yasabestodoloques et
ieneques
aberdelcondicionalI
f,tepodescons
iderar
bas
tantespasosadel
anteyaquepodescreargeniali
dadescon es
toman.
Buenoaprovechandoelcasoanteri
orquevimosquehabía20 paramet rosde
condici
onesmasomenosys ehaciaelcódi
gomuyl argo,voyaaprovechara
traerteotraherrami
entaalt
ernatival
lamadaSwitch,yno,noescomoelde
laluz,est
enot econsumenis equema,nitenesquepagarporél
.

Bás i
cament evamosaconocerpri merolaestruct
uradeun Swi tch.
..elSwi tch
mani pulaun argument ooparamet ro,nounacondi ción,os eaporej empl o
imagi nemosestoques ibien esidénti
coalejemploant eriorpart edeot ro
juego:estamosprogramandoelarmaact ualdeljugadoren elCount erSt rike.
Lovamosahacermedi antet exto,l
evamosapedi ralj ugadorquemedi ant e
eltecladoingreseun numerodel1 al8,yl uegoen textos egun loelegi
do
mos traremosquearmas eleccionó.

Okparaes tocomodecí amosus aremoselSwi tch...alusarcin parapedirleel


datoalj ugador,s easignaráeldat oen unavari ablequepodemosl l
amar
Arma. ..est
avariables eráelúni coparámet roquel edaremosalSwi tch(que
tomarácomoref erencia),entoncesacont inuacion depas arl
ees eparamet ro
entreparent esi
ss edistinguen l
osdi f
erentesvaloresquepuedehabert omado
esa" vari
able"paramet royporendes usconsecuencias,veamos l
omasen un
algoritmoparaent enderlo:

SWITCH( ARGUMENTOOVARI
ABLE)
{
casevalorpos
ibl
e:
INSTRUCCI ONES
terminarcase

casevalorpos
ibl
e2:
INSTRUCCI ONES
terminarcase

casevalorpos
ibl
e3:
INSTRUCCI ONES
terminarcase

def
ect
o:
I
NSTRUCCI
ONES

}
Sequeseveheavy,peronoloes
.Ejempli
fi
cadoelal
gori
tmoen nues
tro
ej
emplodelasarmasquedarí
aalgoasí
:

SWI
TCH(
ARMANUMERO)
{

CASO 1://CASO 1 SI
GNI
FICA "
EN CASO DE QUE ARMANUMERO VALGA 1
ENTONCES
I
MPRIMIR MENSAJE "ELARMA ES UN CUCHILLI
TO QUE NO CORTA"
TERMINAR CASO

CASO 2://SIVALOR ARMANUMERO ES 2


I
MPRIMIR MENSAJE "ELARMA ES UNA PI
STOLA"
TERMINAR CASO

DEFECTO:
I
MPRIMIR MENSAJE "
ELARMA ES UNA GRANADA"
i
ntarmaVal
or;

cout<<"I
ngres
edel1 al6 elarmaquedeseausar"
<<endl;
cin>>armaValor;//Elus
uari
oingres
araeldat
oyl oasignaraal
avari
abl
e
creada

switch(
armaValor)
{
case1://SiarmaVal oresi
dent
icoa1
cout<<"
Cuchil
lo"
<<endl;
break;//Fi
n delcase

case2:
cout<<"
Pis
tol
a"<<endl
;
break;

case3:
cout<<"
Escopet
a"<<endl
;
break;

case4:
cout<<"
Granada"
<<endl
;
break;

case5:
cout<<"
Amet
ral
let
a"<<endl
;
break;

case6:
cout<<"
Nomeacuerdo"
<<endl
;
break;

default
:
cout<<"Noi
ngres
oun numerodel1 al6"
<<endl
;
}
i
ntes
tadoPokemon;
i
ntvi
daPokemon;

switch(
estadoPokemon)
{
case1:
cout<<"
TuPokemon es t
aenvenenado"
<<endl
;
--vidaPokemon;//Lerest
amosvi da-1
break;

case2:
cout<<"
TuPokemon es
taparal
izado,nopuedeat
acar"
<<endl
;
break;

default
:
cout<<"TuPokemon es
tas
ano.
"<<endl
;
}
s
wit
ch(
miEvento.t
ype) {
//Sipulsaunaf lecha,modi ficamossuvelocidad
caseSDL_ KEYDOWN:
switch(mi Event o.
key.
keys ym.s
ym) {
cas eSDLK_ UP:velocidadY -=increment oY;
break;
cas eSDLK_ DOWN:vel oci
dadY +=increment oY;
break;
cas eSDLK_ RIGHT:vel oci
dadX +=increment oX;
break;
cas eSDLK_ LEFT:velocidadX -=increment oX;
break;
cas eSDLK_ q:fi
n =t rue;
break;
def aul
t:break;
}
break;

Hacer.
..
Mient
ras(
Do.
..
Whi
le)
Genialgenialgenial,vamosapas araaprenderahoraaunodel osmodosde
repeti
ción condici
onada.¿ Quésigni
ficaesto?,quepodemoshacerquesereali
ce
unadet ermi nadaacción repet
idament emi entrass
ecumpl aunacondi
ción,al
rompers edichacondi ci
ón larepeti
ción s
edaporf i
nali
zada.

Tenemos2 f
ormasdehacerlo,peropri
meroenseñaréest
aqueesDo( Hacer)
While(
Mientras
).Laes
truct
uradeDo. .
.Whi
leesl
as i
gui
entevi
staen al
gori
tmo:

HACER
{
I
NSTRUCCIONES;
}
MIENTRAS(
CONDICI
ONES)
;
Lesexhibiréun códigorealdeun videojuego,es
t evideojuegoademásdeC++
cComovemospri meros edacomi enzocon elbl
oqueDo{ }yalf i
nali
zarla
ejecuci
ón dedichobl oquecompruebas ilacondición pasadacomoparamet ro
alwhi l
e()secumpl e.
..sirealment
es ecumpl edichacondi ción entoncesel
programavuel veaej ecutarelDoynuevament ereal izalomi smounayot ra
vezhas taquelacondi ción yanosecumpl a.

Vamosaverloes todel
asigui
enteforma,en elj uegoDiabl
o2 tení
amosel
manádelpers onaj
equeseauto-regeneraba,imaginemosqueelmanas ell
ena
en 100 yqueremosquenuest
romanás eregenereen +3 mient
rasquenoest
é
ll
eno.
Ent
oncesharí
amosal
gocomol
osi
gui
ent
e:

i
ntmanaLl eno,manaAct
ual
;
manaLl
eno=100;
manaActual=15;//Supongamosquegas
tamosmanays
olonosquedo15

do
{
manaActual+=3;
cout
<<manaActual<<endl
;
}
whil
e(manaActual<manaLleno)

Lacondición s
erepet i
rás umando3 amanaAct ualhastaquemanaAct ualsea
mayorquemanaLl eno(100)ynosi rái
mprimiendocomot extoen pantall
ael
valordemanaAct ualen cadaaument oquehagaestarepeti
ción (
bucl
e)unay
otravez.Siquieren pueden probarl
o.

Ahoravamosapasardirect
amenteal
as egundaformadeest
arepetici
ón que
noutil
izaDo,s
impl
ement esel
lamaWhil
eyl averemosaconti
nuaci
ón de
formamascomprensi
ble.
Whi
le(
Mient
ras
)

Whi
le(
CONDICI
ON)
{
I
NSTRUCCI
ONES
}

booljugadorMuert
o; booljugadorMuert
o;
jugadorMuerto=0; jugadorMuerto=Fals
e;

En amboscasosjugadorMuert
ot omaráelval orde0,yaquecomodi ji
mos
,Fals
e
es0,yTruees1,ques on l
os2 valoresúnicosquepuedetomarcomodat oun
bool
eano.Ahoravamosals uperejempl o,util
izandolaf
unci
ón quevi
mosen l
a
cl
aseanteri
or,elrand,vamosacrearunaMat ri
x.
#i
ncl
ude<i
ost
ream>
#i
ncl
ude<s
tdli
b.h>
#i
ncl
ude<t
ime.h>

us
ingnames
paces
td;

i
ntmai n()
{
boolmat rix=true;
intnum;
s
rand(time(NULL));
syst
em ( "
color0A");
while(
mat rix=true)
{
num=0+rand( )
%(1+1 - 0)
;

cout
<<num<<""
;
}

ret
urn 0;
}
Bucl
esFor

FOR(DECLARACI
ON I
NICI
AL;CONDI
CION;CONSECUENCI
A BASE)
{
INSTRUCCI
ONES
}
Loqueharáent oncesesprimerohacemosunaDECLARACI ON INICIALde
unavari abl
equeesl aqueut i
lizaremosparal acondi
ción l
uego,porej emplosi
queremosqueunarepet i
ción ejecut
e100 vecess ubl
oqueyl uegotermine,
primeroquenadavamosaut ili
zarun "cont
ador"paracont ares as100
veces.
..paraes
ocreamosunavari ablequell
amaremosiporconveni encia,y
lacreamosen DECLARACI ON I NICIAL:

f
or(
inti=0;CONDI
CION,CONSECUENCI
A BASE)
{
I
NSTRUCCI
ONES
}

f
or(
inti=0;i<100;CONSECUENCI
A BASE)
{
I
NSTRUCCI
ONES
}

Peroahoraobservemos,elcontadornoestáaumentando,s
iemprees
taráen 0.
..
paraesouti
li
zamosl aconsecuenci
abase,l
oquenecesi
tamosesquecadavezque
sehagaunarepet i
ción s
eleaument eaielval
orde1:

f
or(
inti=0;i<100;++i
)
{
I
NSTRUCCI
ONES
}

Lis
to,es
aesl aes truct
uradeun bucl ef
or.Vamosaempl earl
aen al gun ej
emplo
bási
co,i
maginemosun programaquel epidaalusuari
oquei ngres
eun numero,
yqueaut omát i
cament emos t
remosl atabl
adel1 al10 dedi chonumero. .
.
paraesoutil
izaremosun repet i
dorquemul ti
pli
quealnumeroparanot ener
quehacer10 i nst
ruccionesdif
erent
es.Veamoscomoeselt ruco:
CREANDO NUESTRO
PRIMERJUEGO
(PI
NGPONG)
Buenoami gos ,hoylesenseñaréahacerun j uegos i
mpleparal aconsol
ade
C++.En realidad másquenadaesens eñarleslasmecánicas,queluegoles
servi
rán en gran parteparahacers usjuegosavanzadoscuandos epan ut
ili
zar
otrasli
breri
asyt écni
cas.Estan senci
ll
amiexpl icaci
on quehastaun bebé
puedeaprenderl o,en pri
merl ugarenciendan elPc..
.ok,esbroma...

Loqueharemoshoys erasimularelj
uegocl
ási
coPI
NG PONG s
olous
andol
a
cons
ola(
nolibreri
asgraf
icas)
:

Parahoyvamosaut i
li
zartodoloaprendi
doen l
os2 t
utori
alesant
eri
ores
,y
agregaremos2 l
ibreri
as:coni
o2 ycti
me.
Dejemosdehablar,vamosmanosal aobra.Pri
mero,paraagregarl
alibrerí
a
ti
meyavi eneinclui
daen elZi nj
aIas
iquesol
oen nues
trocódi
goalprincipio
debemosincl
uirl
aes cri
biendo:

#i
ncl
ude<ct
ime>
Paraus arl
acadavezquecreamosun proyectotenemosquehacer2 cos
as,
primerodeci rl
eanues t
roprogramaquevamosaus arl
a,es
olohaci
amoscon
incl
ude,ent oncesalpri
nci
piodenuestrocódi
gol
aagregamosparaqueel
compiladors epaquelavamosaus ar:

#i
ncl
ude<coni
o2.
h>

Perobien,comoesunal i
breri
aquenovení acon elZinjaI
,debemos" l
inkearl
a",
esdecir,en cadaproyectoquecreamost ambien debemosdecirl
ealprograma
quehayunal ibrerí
anuevays unombreyaquenoes táen lasquevienen por
defect
o,paraes ovamosaEj ecuci
ón->Opci
ones(oAl t+F9)yalfinaldela
pri
mercaj adet extoañadimosesto:

-l
coni
o

Deberí
aquedaras
í:

-Wal
l-pedant
ic-errors-O0 -l
coni
o

Yapodemosempezaral aburar.Loprimeroquevamosahaceresqueelprograma
semant engaen ej
ecución s
iempreamenosquel ocerremosmanualmente.Estonos
vaas ervi
rparamet erahiadentrotodoelcodigodenues troj
uegoyques erepi
ta
unayot ravezsint erminarelprogramapor quecomos abemosloquehacesinoel
programapordef ectoesejecutartodasl
asli
neasyt erminarautomáti
cament eal
ll
egaralfinal
.
Paraesovamosacrearun while(MIENTRAS)paraques erepit
aycomo
parametrolepas
amosunacondi ci
on queseasi
empreverdaderaporl
oque
nuncaseromperálacondi
ción.Entoncesdent
rodelmain voyacrearun
bool(VERDADERO/FALSO)llamadogameoveryl evoyadarcomoval or
fal
so.

boolgameover=f
als
e;//Fl
agparadet
ermi
narf
in delj
uego

Masabaj
ovoyaabri
rl acondici
ón whil
equedirá("Mi
entrasgameovernos
ea
(
noseaequi
val
eanos erverdadero)"
)delasi
guient
eforma:

whi
le(
!gameover)
{

Adentrodelbloque{}dewhi l
epondremosluegoelcodigodenuestroj
uegoparaque
serepit
a(movi mient
os,col
is
iones
,di
bujadoen pantal
la,et
c).Ent
oncesporahora
nuest
rocódigocompl et
oesés t
e:

#i
ncl
ude<ios
tream>
#i
ncl
ude<cti
me>
#i
ncl
ude<conio2.
h>

us
ingnames
paces
td;

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

boolgameover=f
als
e;

whi
le(
!gameover)
{

ret
urn 0;
}
#i
ncl
ude<ios
tream>
#i
ncl
ude<cti
me>
#i
ncl
ude<conio2.
h>

us
ingnames
paces
td;

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

boolgameover=f
als
e;//Fl
agparadet
ermi
narf
in delj
uego

whi
le(
!gameover)//Mi
ent
rasgameovers
eaf
als
oent
onceselj
uegos
igueej
ecut
andos
e
{

if
(kbhit
())//Sieventotecl
adoesverdadero(sepres
ionaalgo)
{
cout<<"
Testdepres i
onarunatecl
aok,pres i
onasteunatecla.
"<<endl
;
}

ret
urn 0;
}
Molaeh.Buenoahorat enemoslas egundaf
unción deltecl
ado,quesellama
getch()ynosdevuelvecomoval orun numeroquerepres entaquetecl
as e
presionó(
cadateclatieneun códigonumericodif
erente).Loscódi
gosde
tecl
asqueusaremoss on loss
iguientes
:

27 =ESC
75 =Fl
echaI
zquierda
77 =Fl
echaDerecha

s
wit
ch(
get
ch(
))
{

s
wit
ch(
get
ch(
))
{

case27:
gameover=t
rue;
break;

}
Siqueremospodemosborrarelt ext
odepruebaquehabí amospues topara
testearlateclapres
ionadaant es
.Elcódigocompl et
olopueden tes
tearahora,
verán quesipresi
onan latecl
aESC en cualquiermomentodelprogramael
mismof i
nali
za.Acaelcodigocompl etoquellevamosporahora:

#i
ncl
ude<ios
tream>
#i
ncl
ude<cti
me>
#i
ncl
ude<conio2.
h>

us
ingnames
paces
td;

i
ntmai
n(i
ntargc,char*argv[
]){

boolgameover=f
als
e;//Fl
agparadet
ermi
narf
in delj
uego

whi
le(
!gameover)//Mi
ent
rasgameovers
eaf
als
oent
onceselj
uegos
igueej
ecut
andos
e
{

i
f(kbhi
t()
)//Sievent
otecl
adoesverdadero(
sepres
ionaal
go)
{

s
wit
ch(
get
ch(
))//Obt
enercodi
got
ecl
apres
ionada
{

case27://Es
cape
gameover=true;//Gameovers
eraverdadero,s
erompel
acondi
cion delwhi
leys
edej
aderepet
ir
break;

}
Buenoahoraquepus i
mosESC comoopci on alswitch,vamosaagregarl
elos
codigosdel astecl
asizqui
erdayderecha,sibien todaví
anovamosaponer
lasconsecuenci
asyaquel estengoqueexpli
carot rascosasprevi
amente,pero
losdejamospreparadosparas uposteri
orprogramaci ón,demoment ono
harán nada,nues troswit
chquedarí
aas í
:

s
wit
ch(
get
ch(
))//Obt
enercodi
got
ecl
apres
ionada
{

case27://Es
cape
gameover=true;//Gameovers
eraverdadero,s
erompel
acondi
cion delwhi
leys
edej
aderepet
ir
break;

case75://Fl
echaI
zqui
erda
break;

case77://Fl
echaDerecha
break;

}
ret
urn 0;
}

got
oxy(
16,
15)
;
Estos i
gnifi
caríaqueeltextoquei
mprimamosacont inuaci
ón s
epondráen
esapos i
ción,x16,y15.Podemosprobarl osiqui
eren,veamoscomoquedarí
a
nuestrocódi gocomplet
oi mprimi
endoen pant
all
anuestropersonaj
een l
a
posi
ción 16 x,15 y:

#i
ncl
ude<ios
tream>
#i
ncl
ude<cti
me>
#i
ncl
ude<conio2.
h>

us
ingnames
paces
td;

i
ntmai
n(i
ntargc,char*argv[
]){

boolgameover=f
als
e;//Fl
agparadet
ermi
narf
in delj
uego

whi
le(
!gameover)//Mi
ent
rasgameovers
eaf
als
oent
onceselj
uegos
igueej
ecut
andos
e
{

i
f(kbhi
t()
)//Sievent
otecl
adoesverdadero(
sepres
ionaal
go)
{

s
wit
ch(
get
ch(
))//Obt
enercodi
got
ecl
apres
ionada
{

case27://Es
cape
gameover=true;//Gameovers
eraverdadero,s
erompel
acondi
cion delwhi
leys
edej
aderepet
ir
break;

case75://Fl
echaI
zqui
erda
break;

case77://Fl
echaDerecha
break;

} //Swi
tchf
in

}//I
fTecl
aPres
ionadaFi
n

gotoxy(
16,
15) ;//I
ndicamosqueelt
ext
oacont
inuaci
on s
eimpri
miraen 16 x,15 y
cout<<"
000";//Personaj
etext
o

ret
urn 0;
}
gotoxy(
16,15);//I
ndicamosqueelt
ext
oacont
inuaci
on s
eimpri
miraen 16 x,15 y
cout<<"
000";//Personaj
etext
o
gotoxy(
15,10);//I
ndicamosqueelt
ext
oacont
inuaci
on s
eimpri
miraen 15 x,10 y
cout<<"
0";//Pel
oti
ta

Y ahora,¿paraquerayoss i
rveés tos iesest
át ico?,nos emueve...ok,loque
vamosahaceracont i
nuaci
ón eshacerquealpres i
onarl atecl
aderechanues tro
personaj
es emuevaal aderecha..
.est ol
ohacemosdi ciendoquealpres ionarl
a
tecl
aderechal aposici
ón xdel ainstrucci
on got oxyvaacambi ar.¿Perocomo
hacemoses tosiest
abamosus andonumeros ?...ok,es oeslomal o,estabamos
usandonumeros ,peropodríamosus arunavari ablellamadax1 yot ray1,por
ejemploalprincipi
odelmai n declaramoses to:

i
ntx1 =16;//Pos
ici
on xdelj
ugador
i
nty1 =15;//Pos
ici
on ydelj
ugador

Entoncespodríamosalafunción got
oprevi
aaldi
buj
adodelpers
onaj
epas
arl
e
esosparametrosen l
ugardegotoxy(16,
15)yseri
alomis
mo,quedandodela
si
guientef
orma( hagamosl
o):

got
oxy(
x1,
y1)

case77://Fl
echaDerecha
x1 +=4;//Posi
cion xdelj
ugadoraument
aen 4 --->
break;
Ahoraant esdecorregi
runacosavamosaagregarelmovi mient
ohaciala
i
zquierda,paraesoletenemosquedeci
rquecuandopresionamoslatecl
a
f
lechaizquierdadi
smunyaxen 4,muys enci
ll
o¿verdad?:

case75://Fl
echaIzqui
erda
x1 -=4;//Posi
cion xdelj
ugadordi
smi
nuyeen 4 <----
break;

Vamosates
tearnuest
rocodi
gopres
ionandolast
ecl
asderechaei
zqui
erda,yno
teas
ust
es,s
eguramentes
ucedaal
gocomoes t
o:

cl
rscr(
);

Podemost
est
earl
oyverán quef
unci
onacon un nat
uralparpadeo.
Buení si
mo,ant esdes eguirvamosahacerunacorrecci ón anues trocódi go..
.no,no
esnadamal o,esal gonat uralquees t
abaes perandoes tepunt oparaexpl i
carte,yes
ques iprobasdemovert een l osejesX vasaverquenohayun l imite,os eapodes
movert einfi
nitament esaliendonues tropersonajedel apant alla,yes onoesl oque
queremos .Parael l
ovamosacrearnues t
rosl i
mi tesdemovi mi ento.Elmaxi mode
anchopordef ectodel acons olaen elval ordeX es80,yelmi ni
movi s
iblealmenos
en miPC deX es4 ( teniendoen cuent aquenosmovemosde4 en 4) .Ent oncesl o
quequeremosanal izandoelal gori
tmoesqueelpers onaj esepuedamoverpor
ejempl oal aderechas iX esmenorque76 ( comonosvemosde4 en 4 ynues tro
personaj eocupa3 es paciosen 80 nosdes apareceriaun pedazo,as ique80-4 =
76) ,yhaci alai zquierdas iX esmayorque4.Paraes ovamosahaceral gos encil
lo
aunqueparezcacompl i
cadoyesus arelcondi cionali fen last eclasderechae
izquierdaparadeci rlequeej ecuteelmovi mientoderechas ix1 esmenora76 ( o
seanos obrepas aelanchodepant allahaci aladerecha)yen eldelmovi mi ento
izquierdaot roifquepermi taej ecut arleelmovi mi entoi zquierdas i
empreycuando
x1 seamayora4 ( esdeci r,quenoes tedebajodelmi nimodexparas alirsehaciala
izquierdadel apant alla):
case75://Fl
echaI zqui
erda
if
(x1 >4)//Li
mit eizqui
erdapantal
la
{
x1 -=4;//Posi
cion xdeljugadordi
sminuyeen 4 <----
}
break;

case77://Fl
echaDerecha
if
(x1 <76)//Limitederechapantall
a
{
x1 +=4;//Posi
cion xdeljugadoraument
aen 4 --->
}
break;

Perfecto,ahorat enemosnues tropers


onajef unci
onal
,volviendoalprinci
pio,en
l
ugardecout <<"000"pers onalmentepreferiquemipers onajeseaunaes peci
ede
"paleta"quegolpearal apelota,poresolohicecon guionesbajoscout
<<"___
"pero
ustedespueden pers onal
izarl
ocomoqui eran:

cout
<<"
___
";//Pers
onaj
etext
o
i
ntx2 =15;//Pos
ici
on xdel
abol
a
i
nty2 =10;//Pos
ici
on ydel
abol
a

Ahoradebaj
odondedi
buj
abamosl
apel
oti
tat
ení
amoses
torecordemos
:

gotoxy(
15,10);//I
ndicamosqueelt
ext
oacont
inuaci
on s
eimpri
miraen 15 x,10 y
cout<<"
0";//Pel
oti
ta

gotoxy(x2,y2)
;//Indicamosqueelt
ext
oacont
inuaci
on s
eimpri
miraen x2 y2 (
que
//en suorigen val
e15 x,10)
cout<<"
0" ;//Pelot
ita
Sil
oprobamosveremosqueaparecen en pant
all
aambosact
oresuobj
etos(
jugador
ypelot
ita)
:
Perot ambién tenemosquedeci rl
eanues t
roprogramaquequeremosquevaya
haciaarribaal aderechas olomi entrasnos esalgadel apantall
a,ylosl i
mitesdei r
haciaarribaal aderechas erian haciaarribaquey2 val ga1 (
queeselmi ni
mode
pant al
laverti
cal)yhaci aladerechaquex2 val ga80 queeselmaxi modepant al
la
horizontal
.Entoncesl uegodecerrarels witchquet eniamosparaelmovi mientodel
personajevamosaabri run condici
onalparaelmovi mi entodelabolacon If,que
diraalgocomo( SIy2 esmayora1 yx2 esmenora80 ent oncesl
abol aqueno
estaen losli
mit esdemovi mi entodiagonalhaci aarri bas emoveradiagonalhacia
arriba),empezaremoscon eli fsi
n ningunai ns
t ruccion paranomarearl os:

i
f((
y2 >1)& (
x2 <80)
)//SIpos
ici
on bol
ayesmayora1 ypos
ici
on xmenora80
{

}
Ahoraadent rodeesebloquei
fdebemosdeci
rle"ENTONCES di sminuyelaposici
on y
delabol aparaquesevayahaciaarri
bayaument a
laposi
cion xdelabolaparaquevayahacial
ai zqui
erda..
.paraest
ol edeci
mosques i
esacondici
on secumplemodif
icamosy2 yx2 queson losval
oresdelasposici
onesde
labol
a,yquedarí aal
goas í
:

if
((y2 >1)& (
x2 <80) )//SIposi
cion bol
ayesmayora1 ypos
ici
on xmenora80
{
y2--;//Mover1 arri
ba
x2 +=2;//Mover2 al aderecha
}
Ok,manosalaobra,nohacef
alt
aentenderl
oyaquecomodi j
eesal
goque
us
aremosot
rastecni
casmasadel
ant
e.Primerodecl
aramosl
avari
abl
edelrel
oj:

cl
ock_
trel
oj1;

Ahoracreamosunavari ablequerepresenteeltiempoconstantequedeseamospara
cadarepetici
on ymovimiento;1 s
egundos eríamucho,medi osegundotambien,yo
lohet es
teadoyl omejoreshacerques erepitamasomenoscada0. 04,poresola
vari
abledebes erfl
oat(paraadmitirdecimales)
.Entoncesdecl
aramoslavari
able
FPS quevaldraexactamenteesoyquel ausaremosluego:

f
loatFPS =0.
04;
Ok,entoncesvamosporpas oparahacerlacomparacion delti
empoact ualyel
ti
empoquedes eamosdedi f
erenci
aquepas e.
..paraes
ovamosas egui
rcreando
nues
troreloj
,pri meroletenemosquedeci rquenuest
roreloj1 vaat omarelvalor
del"
tiempot ranscurri
dodesdelaejecuci
on",paraesohacemosas í:

cl
ock_
trel
oj1 =cl
ock(
);

i
f(rel
oj1 <cl
ock(
))//Sielt
iempot
rans
curri
doesmayoraelt
iempodenues
trorel
oj

cl
ock_
trel
oj1 =cl
ock(
)+FPS;

Y ahoranosf altamulti
pli
carlosFPS por1 segundoparaquecobren elvaloren
segundos;haymuchosques i
mpl ementelomul t
ipl
ican por1000,peronos ot ros
vamosadej arquelacomput adoraleas i
gneelval
oren s egundosautomati
cament e
paraesol l
amandoaunacons tant
ellamadaCLOCKS_ PER_ SEC quepordefectoy
general
ment evale1000 yrepresent
al osti
cspors egundo.Quedaríaalgoasiesta
parte:
cl
ock_
trel
oj1 =cl
ock(
)+FPS *CLOCKS_
PER_
SEC;

while(
clock()<rel
oj1)//Mient
raselt
iempotranscurri
doseamenoraelti
empo
//transcurrido+FPS
{
//Repetimosl anadami s
mahas t
aquelacondici
on serompa,i
mpidi
endoque
//elcodi goconti
nue
}
voi
d regular_framerate(f
loatFPS)//Decl aracion del af uncion,nol
eden bol
a
{
cl
ock_treloj1 =clock()+FPS *CLOCKS_ PER_ SEC;//Creamosnues trorel
ojque
//tomaraelval ordet i
empot ranscurri
do+FPS en t i
cs
while(
clock()<reloj1)//Mi ent
raselt iempot rans curridos eamenoraeltiempo
//transcurrido+FPS ( ti
empodes eadoat rans currir)
{
//Repetimosl anadami sma
}
}

Dent
rodelmai
nsol
odej
ari
amosl
adecl
araci
on del
osFPS alpri
nci
pio:

f
loatFPS =0.
04;
regul
ar_f
ramerat
e(FPS);//Us
al afuncion creadaparaobl
igaraes
perarelt
iempo
//FPS antesdel
as i
gui
enteejecuci
on delwhi l
e
Ant esdeprobarnues troprogramaneces i
tamoshaceralgo,modificarlapos
icion
dondepus imosnues troclrscr()elcuall
impiaoborratodol oquehayen pant all
a
paravol veradi bujarlo.Loqueharemosesubi carl
oobien alpri
ncipiodelwhilede
nues t
roj uego,oluegodecerrarels wit
chdel atecl
apresi
onada,dai gual
,asini
bien repiteelbucleborrat odo,l odibuj
a,tenemoselti
empodees peradonde
vemoseldi bujoques on milisegundosyluegoloborraparadibuj
arot ro,unayot ra
vez.

Estoeselcodi godelprogramaquel levamoshastaahora,ynot eman sil


ovieron
difi
ciles
tepas o,comodi goestodelFPS notienetantaimportanci
aaun porqueno
hemosvi stofunciones
,peroyal ohemosconf i
guradoynol otenemosqueutilizar
masqueen es elugar,sol
oqueriaacercarl
esun pocoelmecanis
moqueus an los
juegosys ol
opores oloexpl
iquesi
n decirl
es"
peguen es
toacaychau" .
¿Quien ibaadecirquel ogramoshacert odoestono?..
.somosunosamosdelmundo
manes .
..sol
ocon lacons ol
anosi ngeni
amosparal ograrlo.Ok,yat enemoselpri mer
movimi entodelabola,ahoradebemoscrearl osotros3 movi mientosparal abola,
pero¿comos abel
abol acualdel os4 es taej
ecutando?..
.ok,paraes ovamosacrear
unavari abl
eenteraquerepres entelos4 movi mientossegun elvalorquet enga,te
voyadarelej emplo,unavariabl eenteraquet omeval or0,1,2 o3. .
.segun el
val
ort omadoesl adi recci
on,dees taformas eriaen nues t
rament e:

intdirecci
onObj
eto;
//Sivale0 Entoncesl
adi
recci
on esArri
baal
aderecha
//Sivale1 Entoncesl
adi
recci
on esAbaj
oalaizquierda
//Sivale2 Entoncesl
adi
recci
on esArri
baal
ai zquierda
//Sivale3 Entoncesl
adi
recci
on esAbaj
oaladerecha

i
ntdi
recci
onObj
eto=0;

switch(
direcci
onObjeto)//Usamoscomopar amet
roelval
ordedirecci
onObjet
o
{
cas
e0://Sival e0 entonces
//Acai ri
an l
asinst
ruc ci
onesparahacerquesemuevaarri
baalade recha
break;//Fin
cas
e1://Sival e1 entonces
break;
cas
e2://Sival e2 entonces
break;
cas
e3://Sival e3 entonces
break;
}
case0://Arri
baderecha
if
((y2 >1)& (x2 <80))//SIposi
cion bol
ayesmayora1 ypos
ici
on xmenora80
{
y2--;//Mover1 arri
ba
x2 +=2;//Mover2 al aderecha
}

Ahorat rabaj
aremosen elcas e1.Elcas
e1 recordemosqueriamosqueseaabajoa
l
ai zquierda,entoncesestos i
gni
fi
cari
aquenuestrapeloti
tatendri
aquedisminui
rsu
posici
on X parai ral ai
zquierda,yaument
ars uposici
on Y parai
rhaci
aabajo,
quedandodel as i
guient
ef orma:

y2++;//Mover1 abaj
o
x2 -=2;//Mover2 al ai
zqui
erda

Recordemosquees t
ol omet iamosdent rodeun ifquet eniacomocondi ci
on quel a
direccion res
petelosl i
mi tesposibl
esdepant all
a.En elcasodel aboladiri
giendose
haciaabaj oal aizquierdaell imites eri
aelmi nimodeX ( hori
zontaldelapant all
a)
quedi remosquees1,porl ocuallabol asolopodramovers eabajoalaizquierda
si
empreycuandol apos icion X delabol aseamayora1. .
.en cuantoaellimi t
e
verticallomaxi mopos i
bleen nues trapant al
laen elejeY seri
aaproximadament e
de25,as iquedi remosquet ambien mi ent
rasY seamenora25 ent oncesnohabra
problemaen quel abol as emuevahaci aabaj oalaizquierda,quedandoas i
:

case1://Abajoizqui
erda
if
((y2 <25)& (x2 >1))//Sipos i
cion Y esmenosa25 ypos
ici
on X esmayora1
//entoncesmovelabolaman
{
y2++;//Movemos1 haciaabaj o
x2 -=2; //2 haci alaizqui
erda
}
Recordemosquealf i
naldecadacasetienequet
ermi
nars
econ un break;as
ique
nuestros2 cas
escomplet
osquedari
an asidemoment
o:

case0://Arri
baderecha
if
((y2 >1)& (x2 <80))//SIposi
cion bol
ayesmayora1 ypos
ici
on xmenora80
{
y2--;//Mover1 arri
ba
x2 +=2;//Mover2 al aderecha
}
break;

case1://Abajoizqui
erda
if
((y2 <25)& (x2 >1))//Siposici
on Y esmenosa25 ypos
ici
on X esmayora1
{
y2++;//Movemos1 haciaabajo
x2 -=2; //2 hacialaizquierda
}
break;

Ok,ahoranosf al
tari
adet
erminarl
osotros2 cas
es(posi
ciones)queutil
izan l
a
mismalogicaasiquenotelavamosaexpli
car,peroacat eneselcodi
gopors ino
queresl
aburarl
oademasdequevienecon miscomentari
osquet eacl
aran todo:

case2://Arri
bai zqui
erda
if
((x2 >1)& (y2 >1) )//Siposi
cion X esmayora1 ypos
ici
on Y esmayora1
{
x2 -=2;//2 Haci alaizqui
erda
y2--;//1 Haciaarriba
}
break;

case3://Abajoderecha
if
((x2 <80)& (y2 <25))//SiX esmenorque80 eY esmenorque25
{
y2++;//1 Haci
aabajo
x2 +=2;//2 Hacialaderecha
}
break;
Ahoraquel ogramoscrearl as4 direccionesdenues trabol a( amarawoooopayeah) ,
loquevamosahaceresquel asdirecci
onescambi en aut omat icamentealcol s
ionar
con l
osbordes .Es
t oesmass enci
llodel oquepareceyaquet enemoscas itodolisto
parahacerl o.Entoncesen elSwi t
chquees tabamosquedef inialadirecci
on,vemos
quecadaI fnosdi cequelabol asemoverami entrasnot oquees osl
imites,entonces
eshoradeus arel"els
e"(SI
NO)en cadacondi cion,dees taf ormas ialcondicion no
secumpl eyl abol atocaunadees tascoordenadasl i
mi teledi remosquecambi ela
posi
cion derebot e.Porejempl opodriamosdeci rl
ealcas e0 queesdi recci
on arri
baa
laderechaal gocomoSIl abol anoes taen loslimi tes{ queavancehaci aarribaal a
derecha( estoyal otenemos )
}SINO { cambial adi reccion del abolahaci aabajoal a
derecha}

case0://Arribaderecha
if
((y2 >1)& ( x2 <80))//SIposici
on bol
ayesmayora1 ypos
ici
on xmenora80
{
y2--;//Mover1 arriba
x2 +=2;//Mover2 al aderecha
}
else//SINO
{
direcci
onObjet
o=3;//Di recci
on delabolacambi
arAbaj
oal
aDerecha
}
break;
case0://Arribaderecha
if
((y2 >1)& ( x2 <80))//SIpos i
cion bol
ayesmayora1 ypos ici
on xmenora80
{
y2--;//Mover1 arriba
x2 +=2;//Mover2 al aderecha
}
else//SINO
{
if
(x2 <80)//Sis olol
apos ici
on xesmenorall imi
tehorizontal(
80)
{
direcci
onObjet
o=3;//Di recci
on delabol acambiarAbajoal aDerecha
}
else//Sino
{
direcci
onObjet
o=2;//Di recci
on cambi aArribaalaIzquierda
}

}
break;

Bueno,lami s
mal ogi
causamosparalasotrasdi
recciones,debemosacondici
onarl
as
as us2 pos
ibi
li
dadesderebot
eydecirleen quedirecci
on iran s
egun elt
ipode
rebote,ess
encil
loperol
levati
empopensarcon tant oli
o..
.
Ahoras iqueresejecutatuprogramaei mpresionatecon l amagi ami s
ma,ohs i
.
Ahoras ol
onosf al
tahacerquel abol arebotecont ralapal eta,esoesmuyf aci
l,l
e
tenemosquedeci r"Silaposi
cion X eY del abolacoi nciden con l
aposicion X eY
deljugadorent oncescambiarl adirecci
on delabol a"..
.peroacaunapequeña
trampa,nues trojugador"___
"ocupa3 es paci
osyaques on 3 "_"ylapos ici
on quele
damosX ess ol
odelpri mero,entoncesl acoli
sion deberias ersilaposi
cion X dela
bolaesigualaX delj ugadoroX+1 delj ugadoroX+2 delj ugador,abarcandoas ilos
3 espaci
osqueocupal abarra..
.loagregaremosant esdet erminarelwhi l
edel
juego:

i
f((
y2 ==y1)& (
x2 ==x1 |
|x2 ==x1+1 |
|x2 ==x1+2)
)
{

Bueno,yat enemosl acondi cion,ahorabi en silapelotacolis


ionacon lapalet
apuede
hacerl
oviniendol apelotadedi f
erentesdi recci
ones,porl oquenoqueremosquerebot e
si
empreen l ami smadi reccion,pores ovamosadeci rle"Sirebotaylapelotavenia
con unadirecci
on abajoal aderecha,ent oncesl adirecci
on quet omaraahoraes
arri
baal aizquierda"
..
.apl i
candol alogica,obvi ament e,yparaes ousaremosun switch
paracadacas e.
..quedaríaal goasicompl et oyloent enderaspor queessupers i
mplea
comparacion deloqueveni amoshaci endo:
s
wi tch(direcci
onObjet
o)//Pos i
cion bol
a
{
cas e0://Sil aposi
cion erahaciaarribaal aderecha
direcci
onObjet
o=3;//Lacol i
sion devol
veraposi
cion abaj
oal
aderecha
break;

case1:
direcci
onObj
eto=2;
break;

case2:
direcci
onObj
eto=1;
break;

case3:
direcci
onObj
eto=0;
break;
}
Ahoravamosadarl emaspoderanues troj
uegocreandounas egundapaletaques
e
moveracon l
ast
eclasA yD parahacerl
omul ti
jugador.Ent
oncesprimeroquenadaal
pri
nci
piodelmain creamos2 vari
abl
esparadeterminarsuposici
on X eY:

i
ntx3 =38;//Posi
cion xdeljugador2
i
nty3 =2;//Posi
cion ydeljugador2

i
ntx1 =38;//Posi
cion xdeljugador
i
nty1 =23;//Posici
on ydeljugador
i
ntx2 =38;//Posi
cion xdelabol a
i
nty2 =11;//Posici
on ydel abola
i
ntx3 =38;//Posi
cion xdeljugador2
i
nty3 =2;//Posi
cion ydeljugador2
Bueno,tenemosl
aposi
cion perot
odavianoloinsert
amosen pantall
aaljugador2.
Buscamosdondeimpri
mi mosen pant
allaelj
ugador1 queeran es
tasli
neas:

gotoxy(
x1,y1);//Indicamosqueelt
ext
oacont
inuaci
on s
eimpri
miraen x1,y1
cout<<"
___
_";//Personajetext
o
Y debajodedondedibujamoslapeloti
tavamosapas arl
eagot oxylascoordenadasde
nuestrojugador2 ydi
bujarl
o,talcualhi
cimoscon l
osanteri
ores,quedandoasi:

gotoxy(
x3,y3);//Indi
camosquet
ext
osei
mpri
miraen x3,y3
cout<<"
___
_";//Jugador2

Siprobamoselcodi
goveremosques
eimpri
men l
os2 j
ugadoresen pant
all
a,peroel
segundoaun nosemueve:
//Jugador2
case'A':
case'a'
:
//Ins
trucci
ones
break;

Recordandol asi
nstrucci
onespodemost omardeejemploloscodi
gosdelj
ugador1 que
eran en cuantoairal aizqui
erdacon l
at ecl
aDi
recci
on I
zqui
erda:

case75://Fl
echaI zqui
erda
if
(x1 >4)//Li
mit eizqui
erdapantal
la
{
x1 -=4;//Posi
cion xdeljugadordi
sminuyeen 4 <----
}
break;

Loqueharemoss eraponerqueen nuestrocas


eA exactamentelomi smosoloqueen
lugardepas ardeparamet roX1 quecorres
pondeaj ugador1,lepasamosX3 que
correspondeal acoordenadaX delj
ugador2 talcualdecl
aramosant es
,ent
onces
estari
amosdi ci
endoquenues t
rasrespues
tasafect
ari
an aesavariabl
e:

//Jugador2
case'A'
:
case'a'
:
if
(x3 >2)
{
x3 -=2;
}
break;
i
f((
y2 ==y1)& (
x2 ==x1 |
|x2 ==x1+1 |
|x2 ==x1+2)
)

i
f((
y2 ==y1)& (x2 ==x1 |
|x2 ==x1+1 |
|x2 ==x1+2)|
|(y2 ==y3)& (
x2 ==x3
|
|x2 ==x3 +1 |
|x2 ==x3 +2)
)
i
ntpunt aj
e1,punt
aje2;
punt
aje1 =0;
punt
aje2 =0;

Ahoradebemosdeci rleanues troprogramaal gocomo" Silapelotatocaun bordedel


ejeY entoncess
umal eun puntoaj ugador1,s itocaelotrobordedelej eY entonces
sumaleun puntoalj ugador2".
..paradecir"sitocaelborde"simplement ebastacon
compararl aposi
cion Y delapelotaen un I
fquedi gaporej emplo"Silapos i
cion Y de
lapelotaes1,entoncesdal eun puntoaljugador2 ySI NO SIlapos i
cion Y dela
pelot
aes25 ( maximoY)ent oncespuntoparaj ugador2" :
i
f(y2 ==1)
{
++puntaj
e2;
}
els
eif(
y2 ==25)
{
++puntaj
e1;
}

gotoxy(
70,1)
;//Modifi
camoscoordenadasobj
eto
cout<<"
PUNTAJE:"<<puntaj
e1;//Dibuj
amosobjeto
gotoxy(
3,25)
;//Modifi
camoscoordenadasobj
eto
cout<<"
PUNTAJE:"<<puntaj
e2;//Dibuj
amosobjeto
i
f(y2 ==1)
{
y2 =11;
x2 =40;
++puntaj
e2;
}
els
eif(
y2 ==25)
{
y2 =11;
x2 =40;
++puntaj
e1;
}

regul
ar_
framerat
e(FPS*6)
;
#i
ncl
ude<cs
tdl
ib>

Ahoravamosacrearl a"semi
ll
a"delrel
ojqueus
aremosparal
osnumerosal
eat
ori
os.
..
alpri
nci
piodelmain ent
oncesponemosesto:

s
rand(
time(
NULL)
);

Yatenemostodoli
stoparausarnuest
rainstruccion rand()
,ent
oncesbus
camoselif
delospuntos
,yletenemosquedecirquedireccionObj et
ovaas eri
gualaun numero
al
eatori
oentre0 y3,ylohacemosdees t
af orma:

di
recci
onObj
eto=rand(
)%3;
1)Eldell
anzami
ent
odeldadoparacomprobars
ielat
aqueesef
ect
ivo.

2)Eldell
anzami
ent
odeldadoparacomprobarl
adef
ens
a.

3)Cal
cul
oent
redañoydef
ens
a.

4)Apl
icardañoal
avi
dadeloponent
e.

5)Comprobars
ilequedavi
daaloponent
eos
ies
tamuert
o.
En elanteri
orapart
adoporej
empl
ohi
cimosun j
uegodePi
ngPongyt
eni
amosvari
os
al
goritmoscomo:

- Moverl
apel
ota

- Moverl
apal
eta

- Det
ect
arcol
is
iones

- Añadi
rpunt
os

- DemorarFPS
#i
nclude<i
ost
ream>
us
ingnamespacest
d;

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

i
nta,b;//Decl
aramosent
erosayb

cout<<"I
ngres
eelvalordea:" ;//I
mpri mimostextoen pantall
a
cin>>a;//Elusuari
oingresaelval
ordel avari
ablea
cout<<endl
<<"I
ngreseelvalordeb:";//Imprimostextoen pant al
la
cin>>b;//Elusuari
oingresaelval
ordel avari
ableb
cout<<endl
<<"A +B esiguala:"
<<a+b<<endl
;//Imprimimost extoen pant
all
a

ret
urn 0;
}
#i
ncl
ude<ios
t ream>
#i
ncl
ude<cti
me>
#i
ncl
ude<cstdlib>

us
ingnames
paces
td;

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

s
rand(
time(
NULL)
);//I
nici
amosnumerosal
eat
ori
osen bas
eal
ahora

i
ntmonedas
Soni
c,monedas
Caj
a;//Decl
aramos2 vari
abl
es

monedas
Soni
c=0;

monedas
Caj
a=0;

monedas
Caj
a=rand(
)%10+1;//Numeroal
eat
ori
oent
re1 y10

monedasSoni
c+=monedasCaja;//monedas
Soni
cserai
gualamonedas
Soni
c
//i
ncrementadomonedas
Caja

cout
<<endl
<<"
MonedasSoni c:"<<monedas
Soni
c<<endl
;//I
mpri
mimoselt
otalde
//MonedasActualen pant
alla

ret
urn 0;
}
i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

s
rand(
time(
NULL)
);//I
nici
amosnumerosal
eat
ori
osen bas
eal
ahora

i
ntmonedas
Soni
c,monedas
Caj
a;//Decl
aramos2 vari
abl
es

monedas
Soni
c=0;

monedas
Caj
a=0;

monedas
Caj
a=rand(
)%10+1;

monedas
Soni
c+=monedas
Caj
a;

cout
<<endl
<<"
MonedasSoni
c:"
<<monedas
Soni
c<<endl
;//Cant
idad monedasact
ual

monedas
Soni
c+=3;//Agregamos3 monedasaSoni
c

cout
<<endl
<<"
MonedasSoni
c:"
<<monedas
Soni
c<<endl
;//Cant
idad monedasact
ual

ret
urn 0;
}
monedas
Soni
c+=15;//Agregamos15 monedasaSoni
c

cout
<<endl
<<"
MonedasSoni
c:"
<<monedas
Soni
c<<endl
;//Cant
idad monedasact
ual

Comos abemosen cadani velSonictieneun aproximadode100 monedas .


..¿vamosa
met ercadavezqueagarraunamonedaunal ineaen elmai n?.
..imaginemosque
nadamases tamoshabl andodelcodi godelasmonedas ,niqui s
ierapens arelres t
o
delcodi gol oques eria.
..entoncesparaesousamosl asfunci
ones .
..podemoscrearuna
funcion quel ainvocamoscuandoqueremosyreal izaralami smaacci on con losdatos
quel eot orguemos .Esdeci r,l
oqueharemosahoraesunaf uncion al aquel edemos
todaslasvecesquequeramoscomodat osl
acant idad demonedasquet i
enes onicy
lacantidad demonedasas umar,yqueaut omat icament elassumeynosi mpri ma
en pant allaelresultado,yas ilepodemosirpas andoal ami smaf unci
on diferentes
datos( diferentescant i
dadesdemonedas )ys eencar garadedevol vernoselres ult
ado
eimpri mi rloen pant all
a.
{
monedas Soni
c+=monedas Caj
a;//Añadimosalavariabl
epri
meraelvalordela
//segunda
cout<<endl
<<"MonedasSoni
c:"<<monedas
Soni
c<<endl
;//Cant
idad monedasact
ual
}
TIPOFUNCI ON NOMBREFUNCION()
{//INICIO BLOQUE FUNCI
ON
//INSTRUCCI ONES
return DATO;//DEVUELVE DATO SIES QUE NO ES TI
PO VOI
D
}//FIN BLOQUE FUNCION

Supongamosqueprimerocreamoselt
ipodevari
ablemass
enci
ll
o,queeselvoi
d que
nodevuel
vedato.Porahorateni
amosestoent
onces
:

{
monedas Soni
c+=monedas Caj
a;//Añadimosalavariabl
epri
meraelvalordela
//segunda
cout<<endl
<<"MonedasSoni
c:"<<monedas
Soni
c<<endl
;//Cant
idad monedasact
ual
}
TI
PODEFUNCI
ON NOMBREFUNCI
ON (
ARGUMENTOS)
{

En nuest
roejempl
oelTIPODEFUNCION esvoi
d,elNOMBREFUNCION quequi
ero
darleessumaMonedas
..
.argument
osporahoralodej
amosvaci
o,quedandodeesta
forma:

voi
ds umaMonedas ()
{
monedas Soni
c+=monedas Caj
a;//Añadimosalavariabl
epri
meraelvalorde
//l
as egunda
cout<<endl
<<"MonedasSoni
c:"<<monedas
Soni
c<<endl
;//Cant
idad monedas
//actual
}

#i
ncl
ude<ios
t ream>
#i
ncl
ude<cti
me>
#i
ncl
ude<cstdlib>

us
ingnames
paces
td;

voi
ds umaMonedas ()
{
monedas Soni
c+=monedas Caj
a;//Añadimosalavariabl
epri
meraelvalordela
//segunda
cout<<endl
<<"MonedasSoni
c:"<<monedas
Soni
c<<endl
;//Cant
idad monedasact
ual
}

i
ntmai n(i
ntargc,char*argv[]
){
s
rand( t
ime(NULL))
;//Ini
ciamosnumerosaleat
ori
osen baseal
ahora
i
ntmonedas Soni
c,monedas Caj
a;//Decl
aramos2 vari
ables
ret
urn 0;
}
Ahora¿comoll
amamosal afuncion?..
.supongamosquequeremosprobarl
a..
.bueno,
si
mplementeen nues
tromain en ellugarquel aqueremosus
artenemosqueponerel
nombredelafuncion yl
is
to,algoasi:

s
umaMonedas
();

I
magi
nandoqueprobamoselprogramanosdaraels
igui
ent
eerror:

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){//BLOQUE MAI
N

i
ntvari
abl
eEj
empl
o1;

if
(0)
{
vari
abl
eEj
empl
o1;//Esheredadaen elbl
oqueI
f(SUBBLOQUE CON RESPECTO A
//MAIN)
}

ret
urn 0;
}
Ahorai maginemosqueesalrevés
,t enemosun bl
oque,ydentrootrosub-bloque,en
elsub-bloquedecl
aramosunavariableylaqueremosusaren elbl
oque.
..error.Sol
o
podriaus ars
edeestaforma:

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

i
ntmonedas
Soni
c,monedas
Caj
a;//Decl
aramos2 vari
abl
es

s
umaMonedas=10;

for(
inti=0;i<sumaMonedas
;i++)
{
cout<<"
Hol
a,s
oyelbl
oque1,elvalordeies:
"<<i
<<endl
;
}

cout
<<endl
;

for(
inti=0;i<sumaMonedas
;i++)
{
cout<<"
Hol
a,s
oyelbl
oque2,elvalordeies:"
<<i
<<endl
;
}

ret
urn 0;
}
Vol
viendoanues
trocodi
godel
afunci
on,veamos
loas
ipodemosent
enderent
onces
quesali
omal:

#i
ncl
ude<ios
t ream>
#i
ncl
ude<cti
me>
#i
ncl
ude<cstdlib>

us
ingnames
paces
td;

voidsumaMonedas ()
{
monedas Soni
c+=monedas Caj
a;//Añadimosalavariabl
epri
meraelvalordela
segunda
cout<<endl
<<"MonedasSoni
c:"<<monedas
Soni
c<<endl
;//Cant
idad monedasact
ual
}

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

s
rand(
time(
NULL)
);//I
nici
amosnumerosal
eat
ori
osen bas
eal
ahora

i
ntmonedas
Soni
c,monedas
Caj
a;//Decl
aramos2 vari
abl
es

s
umaMonedas
();

ret
urn 0;
}
voi
ds umaMonedas ()
{
intmonedas Soni
c,monedasCaja;//Alpedo
monedas Sonic+=monedasCaja;//Añadimosalavariabl
epri
meraelvalordela
//segunda
cout<<endl
<<"MonedasSoni
c:"<<monedasSoni
c<<endl
;//Cant
idad monedasact
ual
}

voi
dsumaMonedas
(intNOMBRECOPI
AVARI
ABLE,i
ntNOMBRECOPI
AVARI
ABLE2)
{

}
voi
dsumaMonedas
(intmonedaAct
ual
,intmonedaAument
ar)
{

Ent
oncesnues
traf
unci
on quedari
aas
icompl
eta:

voi
ds umaMonedas (i
ntmonedaAct ual
,intmonedaAument ar)
{
monedas Soni
c+=monedas Caj
a;//Añadimosal avariabl
eprimeraelval
ordela
//segunda
cout<<endl
<<"MonedasSoni
c:"<<monedasSoni
c<<endl
;//Canti
dad monedasact
ual
}

voi
ds umaMonedas (i
ntmonedaActual,i
ntmonedaAument ar)
{
monedaAct ual+=monedaAument ar;//Añadimosalavariabl
eprimeraelval
or
//delas egunda
cout<<endl<<"MonedasSoni
c:"
<<monedaAct ual
<<endl
;//Canti
dad monedasactual
}

Elcodi
goes
tacas
iperf
ect
o,peros
iloej
ecut
amosdaels
igui
ent
eynat
uralerror:

Elproblemaesmuuuuysenci
ll
o,est
oespor
quecuandol
lamamosal
afunci
on en el
main recordaquel
ohi
cimosasi:

s
umaMonedas
();
s
umaMonedas
(10,
3);

Sosun geni o,elputoamo.Ahorapas emosl


ecomoref erenci
alasvari
ables
,os ealos
numerosf ueron deej
emplo,nosot
rosloquevamosai rmodi fi
candoalol argodel
juegos on l
asvariabl
esypores oneces
itamospas
arsel
as ,ysepuede,si
mpl emente
colocandolasen elparent
esi
syaques udatoesenteroporl oqueespermi ti
do:

s
umaMonedas
(monedas
Soni
c,monedas
Caj
a);
Elresul
tadosera0 porqueaun nolehemosdesi
gnadoni
ngun valoraningunadel
as
2 vari
ablesen elmai
n,perosupongamosqueleponemoslos
iguiente:

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

s
rand(
time(
NULL)
);//I
nici
amosnumerosal
eat
ori
osen bas
eal
ahora

i
ntmonedas
Soni
c,monedas
Caj
a;//Decl
aramos2 vari
abl
es

monedas
Soni
c=0;

monedas
Caj
a=10;

s
umaMonedas
(monedas
Soni
c,monedas
Caj
a);

ret
urn 0;
}
i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

s
rand(
time(
NULL)
);//I
nici
amosnumerosal
eat
ori
osen bas
eal
ahora

i
ntmonedas
Soni
c,monedas
Caj
a;//Decl
aramos2 vari
abl
es

monedasSoni
c=0;
sumaMonedas(monedas
Soni
c,3)
;
sumaMonedas(monedas
Soni
c,5)
;
sumaMonedas(monedas
Soni
c,2)
;
ret
urn 0;
}

Elprobl
emaeses
te:

voi
dsumaMonedas
(int&monedaAct
ual
,intmonedaAument
ar)
A ver,ahoravol
veaej
ecut
arelcodi
go,averaver.
..

Lis
to,sosun capodelmundo,campeon Wi nni
ngEl even 2011,yas abesKungFu.
Perocomoparanodej artehabiendoll
egadotan lejosyexplicadolomascompl icado
asimedioen bolas,vamosaverl osot
rostiposdef unciones
,ques on basi
camentelo
mismo,secons truyen i
gual,s
oloquedevuelven un valor,yvost epreguntaras¿
como
quedevuel
ven?¿ vomit
an?..
.
#i
nclude<i
ost
ream>
us
ingnamespacest
d;

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

i
ntubi
caci
onPers
onaj
e,met
a,ki
lomet
ros
Fal
tant
es;

met
a=1000;

ret
urn 0;
}
voi
d avanzar_
mot
o(i
ntubi
caci
onAct
ual
,intaument
arKm)
{

Perocomol oquevamosahaceresi raument andol


aubi caci
onPers
onajesegun l
os
kil
omet rosquel evamosagregandoalrecorri do,ent
oncest endri
amosquehacerque
paraquees avariabl
ealpas arsecomodat os eamodifi
cadaen lafunci
on vamosa
tenerquepas arl
acomoref erencia,yrecordemosquel ohaciamoscon el&..
.quedarí
a
nuestraf unci
on entoncesasiini
cial
ment e:

voi
d avanzar_
mot
o(i
nt&ubi
caci
onAct
ual
,intaument
arKm)
{

voi
d avanzar_
mot
o(i
nt&ubi
caci
onAct
ual
,intaument
arKm)
{

ubi
caci
onAct
ual+=aument
arKm;

cout
<<"
Laubi
caci
on delpers
onaj
ees
:"<<ubi
caci
onAct
ual
<<endl
<<endl
;

}
Ahoral
al l
amamosen nues
tromai
n al
afunci
on,s
upongamosquel
eaument
amos15
km,quedariaal
goas
i:

avanzar_
mot
o(ubi
caci
onPers
onaj
e,15)
;

i
ntavanzar_
mot
o(i
nt&ubi
caci
onAct
ual
,intaument
arKm)
Cabedestacarques itefijaslafuncion maint erminacon return 0;estoespor quela
funci
on mai n esunaf uncion delti
poent ero,ydebedevol verun dat oSIoSIporl o
tantoalfinalparat ermi nar..
.pores odevuelve0 paraindicarelf i
n delafuncion,es
un datoirrelevanteperoút ilparat erminar.Bueno,volvamosal af unci
on,loque
tenemosqueagregarahoraent oncesalfinaldelaf unci
on primeroesl acuenta,selo
tenemosqueas ignaraunavari ablequecont engaprovisi
onalmenteelresultado,la
cuentarecordemoss eri
a1000 - ubi caci
onActual,quedariaasi
:

i
ntavanzar_
mot o(
int&ubi
caci
onAct
ual
,intaument
arKm)
{
i
nt variabl
eProvi
sori
a;

ubi
caci
onAct
ual+=aument
arKm;

cout
<<"
Laubi
caci
on delpers
onaj
ees
:"<<ubi
caci
onAct
ual
<<endl
<<endl
;

vari
abl
eProvi
sori
a=1000 - ubi
caci
onAct
ual
;

i
ntavanzar_
mot o(
int&ubi
caci
onAct
ual
,intaument
arKm)
{
i
nt variabl
eProvi
sori
a;

ubi
caci
onAct
ual+=aument
arKm;

cout
<<"
Laubi
caci
on delpers
onaj
ees
:"<<ubi
caci
onAct
ual
<<endl
<<endl
;

vari
abl
eProvi
sori
a=1000 - ubi
caci
onAct
ual
;

ret
urn vari
abl
eProvi
sori
a;
}
cout
<<"
Dis
tanci
aarecorrer:"
<<ki
lomet
ros
Fal
tant
es<<endl
;

ki
lometrosFal
tant
es=avanzar_
mot o(
ubi
caci
onPersonaj
e,15)
;//Ll
amaal
afunci
on
/yelvalordevuel
tol
uegoseasignaakil
omet ros
Falt
antes

Podemoshacerl
omascopado,haciendoun foroun whil
equerepi
taelcodi
gohas
ta
queseal
cancelamet a,oseahast
aqueki l
ometros
Fal
tantess
eamenora0.Veamosel
codi
gocompletocon di
chocondi
ment o:

#i
nclude<i
ost
ream>
us
ingnamespacest
d;

intavanzar_ mot o(i


nt&ubi cacionActual,intaumentarKm)
{
int vari ableProvi s
ori a;
ubicaci
onAct ual+=aument arKm;
cout<<"Laubi cacion delpers onajees
:" <<ubi
caci
onActual
<<endl
<<endl
;
variabl
eProvi soria=1000 - ubi caci
onAct ual
;
cout<<variableProvi soria;
return variabl eProvisoria;
}

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

intubi caci
onPers onaje,meta,kil
ometrosFaltantes;
met a=1000;
ubicacionPers onaj e=0;
whi l
e(kilomet rosFaltantes>0)
{
kil
omet rosFaltant es=avanzar_moto(
ubicacionPersonaje,15)
;//Ll
amaal
afunci
on y
//elvalordevuel tol uegoseasi
gnaaki l
omet rosFaltantes
cout<<" Dis
t anciaarecorrer:"<<kil
ometrosFaltantes<<endl
;
}
return 0;
}
Arrays,Vect
oreso
Vari
ablesDimensi
onal
es
Bueno,hoyvamosacrearelf amos
oTa-Te-Tio3 en Rayaaprendi endoparaell
o
conteni
donuevo.
..porelt
ítul
oparecemucho,peroen real
idad noest ant
osinoque
haymuchosnombresparaunami smacos
ayhaceques eveacompl ejocuandonoloes
tant
o.
Tengamosen cuent
aquecadapersonaj
eti
eneHP (
Vida)
,MP (
Punt
osMagi
a),At
aque,
Defens
ayun pardepi ngadasmas
...

i
ntVi
daPersonaj e1 =60;
i
ntMagiaPersonaje1 =150;
i
ntAtaquePersonaje1 =50;
i
ntDefens
aPers onaje1 =80;
Comovemosen es teej emplopodemoscar garen nues traespalda8 herrami ent asyen
laCajadeHerrami entaspodemosdepos i
tarot ras8.Elcas i
ll
erosuperiorrest antees
laherramientaquet enemosequipada.Loquequerí amoses" programar"es toss lot
so
casi
ll
eros,entonces¿queharemos ?¿ 10 vari
ables?..
.es aserí
al arespues
t alógica,10
vari
ablesques egun s
uval ornosdigan sielcasill
eroes taocupadoono,comocuando
nibien empiezaeljuegonohayobj etossuvalori nicialseri
a0 ( oseavacios),algoas í
:

i
nts
lot
1 =0;
i
nts
lot
2 =0;
i
nts
lot
3 =0;
i
nts
lot
4 =0;
i
nts
lot
5 =0;
i
nts
lot
6 =0;
i
nts
lot
7 =0;
i
nts
lot
8 =0;
i
nts
lot
9 =0;
Comovemosen es teej emplopodemoscar garen nues traespalda8 herrami ent asyen
laCajadeHerrami entaspodemosdepos i
tarot ras8.Elcas i
ll
erosuperiorrest antees
laherramientaquet enemosequipada.Loquequerí amoses" programar"es toss lot
so
casi
ll
eros,entonces¿queharemos ?¿ 10 vari
ables?..
.es aserí
al arespues
t alógica,10
vari
ablesques egun s
uval ornosdigan sielcasill
eroes taocupadoono,comocuando
nibien empiezaeljuegonohayobj etossuvalori nicialseri
a0 ( oseavacios),algoas í
:

i
nts
lot
1 =0;
i
nts
lot
2 =0;
i
nts
lot
3 =0;
i
nts
lot
4 =0;
i
nts
lot
5 =0;
i
nts
lot
6 =0;
i
nts
lot
7 =0;
i
nts
lot
8 =0;
i
nts
lot
9 =0;
i
nti
nvent
ari
o[10]
;//Vari
abl
equeal
oja10 val
ores
,al
ojaal
ohaal
ohaaaaaHawai
ii
¿Cómoesqueguarda10 valoreslavari
abl
e?.
..paraes
oint ernamentecreaunaes
peci
e
de" Tabl
a"de10 cel
das
,en nuest
rocasoserí
acomos ien Excellovi
eramosdeest
a
forma:

intinvent
ario[
10]={ 0,
0,0,0,
0,0,0,0,
0,0} ;//Decl
aramosvari
abl
equepos
eera10
//datosyl easi
gnamosesos10 datosini
ciales

En elFi
nalFantasytambién entoncespodi
amoshacerquecadajugadoren l
ugarde
tener4 vari
abl
escadauno,creamos1 vari abl
eparacadaunocon 4 val
orespos
ibl
es
(unoseraAtaque,otroDefensa,etc):
¿Cómoesqueguarda10 valoreslavari
abl
e?.
..paraes
oint ernamentecreaunaes
peci
e
de" Tabl
a"de10 cel
das
,en nuest
rocasoserí
acomos ien Excellovi
eramosdeest
a
forma:

intinvent
ario[
10]={ 0,
0,0,0,
0,0,0,0,
0,0} ;//Decl
aramosvari
abl
equepos
eera10
//datosyl easi
gnamosesos10 datosini
ciales

En elFi
nalFantasytambién entoncespodi
amoshacerquecadajugadoren l
ugarde
tener4 vari
abl
escadauno,creamos1 vari abl
eparacadaunocon 4 val
orespos
ibl
es
(unoseraAtaque,otroDefensa,etc):
Ahoras upongamosquegolpean anuest
ropersonaj
egenerando20 dedaño...nuest
ro
personajecomovemostiene60 devi dayahoraqueremosquet enga40 productodel
resul
tadodeldañogenerado( 60-20 =40).
..¿cómohacemos?.
..

i
ntpers
onaj
e1[
4];//Decl
aramosunavari
abl
equeal
ojara4 dat
os

Cadaes
paci
oindi
vidualdedi
chavari
abl
eserí
arepres
ent
adodees
taf
orma:

pers
onaj
e1[
0]
pers
onaj
e1[
1]
pers
onaj
e1[
2]
pers
onaj
e1[
3]
Ent oncesloprimeroqueteni
amosesl
avidaquelaal
ojamosen elpri
meres
paci
o,el
cuals erí
aelespaci
o0..
.poresol
epodemosasi
gnarun nuevoval
ormenci
onandoa
dichoes paci
osimplement
e:

personaj
e1[0]-=20;//Leres
tamos20 adi
choes
paci
oqueen es
tecas
orepres
ent
a
//elHP (20-60 =40)

i
nvent
ari
o[0]
;
i
nvent
ari
o[1]
;
i
nvent
ari
o[2]
;
i
nvent
ari
o[3]
;
i
nvent
ari
o[4]
;
i
nvent
ari
o[5]
;
i
nvent
ari
o[6]
;
i
nvent
ari
o[7]
;
i
nvent
ari
o[8]
;
i
nvent
ari
o[9]
;

i
nvent
ari
o[7]=1;//Ahoraval
e1 es
ees
paci
oocel
da
CADENA DE CARACTERES

s
tri
ngs
aludo1 ="
hola"
;
s
tri
ngs
aludo2 ="
hi"
;

Yl
uegol
aspodrí
amosi
mpri
mirporej
empl
odees
taf
ormas
impl
eal
as2 j
unt
as:

cout
<<s
aludo1<<""
<<s
aludo2<<"
."<<endl
;

charpalabra1[
4];
palabra1[
0]=' R'
;
palabra1[
1]=' O'
;
palabra1[
2]=' C'
;
palabra1[
3]=' k'
;
Estoes t
aríarel
ati
vament
es afabl
e,perolefalt
aelultimodatoquediji
mos,ese"\0"
quelamaqui nanecesi
taparaf i
nali
zarl
o,entoncesen l
ugardeserunavari
ablede4
espaci
os,lahacemosde5 reservandoeseulti
moes pacioparacumpl
ircon l
areglaque
piden esteti
podedatochar:

charpalabra1[
5] ;
palabra1[
0]=' R';
palabra1[
1]=' O';
palabra1[
2]=' C';
palabra1[
3]=' k'
;
palabra1[
4]=' \0';

Bien,lohicis
te.Siempres ivasat rabaj
arcon vectoresoarrayasdelt
ipocharrecorda
reservareseulti
moes paci
oen memori aparaquel amaquinapuedaas i
gnarelfi
nal
delmi smo.Suponi endopodríascrearunavariablequepidaelnombredehas t
a7
let
rasalus uari
o,yl oas i
gnasadi chavari
abl
e:
Bien,lohicis
te.Siempres ivasat rabaj
arcon vectoresoarrayasdelt
ipocharrecorda
reservareseulti
moes paci
oen memori aparaquel amaquinapuedaas i
gnarelfi
nal
delmi smo.Suponi endopodríascrearunavariablequepidaelnombredehas t
a7
let
rasalus uari
o,yl oas i
gnasadi chavari
abl
e:
Ok,t emostrévariasformas,cubri
mostodasl asformasdeverestamugre..
.ahora
vamosaal gofinalantesdeaccederaalgunosej emplos
..
.vol
vamosalasvari
ablesint,
en nuest
roHarvestMoon al oj
ando10 datos.
..supongamosquequeremosdetectarsiel
jugadoren al
gun Slottieneelit
em numero15.Hari amosalgocomoestoen casode
unavariabl
es i
ngular:

if
(es
pacioej
emplo1 ==15)
{
cout<<endl
<<"
Teneseli
tem 15"
<<endl
;
}

Comot enemos10 es paci


osnopodemosi rcomparandomanual ment eunoporuno,
pores oacáestalas uperconveni enci
ayl ovasat enerqueaprenderpor queeslomás
uti
li
zado,esempl earl asrepeti
ciones(elFor)pararecorrert odoslosdatosdeuna
vari
ableaut omati
cament e.Si,puedes onarlocoei nentendi
ble,vamosahacerl o
si
mpl e,supongamosquecreamosl avariabl
eot ravezinventarioquetiene10 sl
otsy
queremosqueen l os10 s l
otssecomi encecon elit
em 3 queen mii maginaci
ón esun
cubodeagua( l
ocualnoi mport a).Pri
merol adeclaramos:

i
nti
nvent
ari
o[10]
;//Decl
aramosl
avari
abl
ede10 es
paci
os

Ahorapodrí
amosbi
en hacer:

i
nventari
o[0]=3;
i
nventari
o[1]=3;
i
nventari
o[2]=3;
.
..
etc

i
nvent
ari
o[0]=3;
Alterminarl
aprimerrepet
ici
on comoiesmenora10,s
eaument
aaien 1 yahora
ien l
ugarde0 val
e1,ycomot eni
amos

i
nvent
ari
o[i
]=3

Ahoraes
tari
amosdi
ciendoque:

i
nvent
ari
o[1]=3;

Luegot ermi
nalarepet ici
on,comoiesmenorque10 yl
acondi ci
on aun s
ecumplese
vuel
vearepet i
relbl oque,deantemanos
eaumentaien 1,ahoraen lugarde1 ival
e
2,yt eniamosrecordemos :
i
nvent
ari
o[i
]=3

Ques
eri
aen es
tarepet
ici
on elequi
val
ent
eadeci
rque:
i
nvent
ari
o[2]=3;

Y asiconsecuti
vamentehastaques erompelacondici
on.Estocomores ult
adofi
nal
recorreri
ade0 a9 l os10 espaci
osdenuestravari
ableylesotorgari
aelvalor3,todo
en 3 simplesli
neas
.Aunquenol ocreasacabasdeaprenderalgoultra-val
ios
o,talvez
lomasval iosodeloquepueden brindares
tetipodevariabl
es,ahorapongamosloun
pocoen práct i
catodoparaquevayaquedando.

PROGRAMACI
ON Y LENGUAJE

charcadenaTes
t[]="I
KIES ELMEJOR" ;//Creaunacadenadecaract
eresas
ignando
//aut
omat i
camentecadacaract
eren un es
paci
odememoriachar
for(
inti=0;i>-1;i ++)
//ivale0 yaumentaras
uval
oren 1 en cadarepet
ici
on.La
//condi
cion s
erepet
irami ent
rasiseamayora-1,oseas
iempre

if
(cadena[i]=='
\0'
)break;//Sielcaract
erdel
acadenaact
uales\0 ent
oncesromper
//repeti
cion
Entoncesen l
aprimervuel
tadelbucl
een nues
troej
empl
ois
eri
a0,ent
oncesl
oque
harí
aes ali
neaes
:
i
f(cadena[
0]=='
\0'
)break;

i
f(cadena[
1]=='
\0'
)break;
Comocadena[1]en realidad vale'
K'yno' \0'otravezpasalomi s
mo,s eaumentael
contadorylacondicion noserompe...sesi
gueaument andoelcontadorei,sesi
gue
repi
tiendohas
tallegaral16,l apalabraIKIES ELMEJOR ocupacon l oses
paci
os15,
yel16 eselvalor\0,porl ot antoen l
arepeti
cion 16:

i
f(cadena[
16]=='
\0'
)break;

i
ntobt
ener_
longi
tud(
cons
tcharcadena[
])
{

i
ntcont
ador=0;

f
or(
inti=0;i>-1;i
++)
{

cont
ador++;

i
f(cadena[
i]=='
\0'
)break;

ret
urn cont
ador;
}

i
ntl
ongi
tud_
cadena;
l
ongitud_
cadena=obt ener_
longit
ud(cadenaTes
t);//Cuandopas
amosl
acadenacomo
//ar
gument olohacemoss i
nl os[]
Ahoras
olores
tari
aimpri
miren pant
all
aelres
ult
ado,nues
troprogramaquedaas
i:

PROGRAMACI
ON Y LENGUAJE
l
ongitud_
cadena=obt ener_
longit
ud(cadenaTes
t);//Cuandopas
amosl
acadenacomo
//ar
gument olohacemoss i
nl os[]

CONCATENAR O UNI
R 2 CADENAS
DE CARACTERES

charcadenaTes
t1[
]="
IKI
";//Mens
aje1

charcadenaTes
t2[
]="
CAPI
TAN"
;//Mens
aje2

charcadenaTes
t3[
15]
;//15 CARACTERES POR LAS DUDAS PARA ELEJEMPLO
voi
d concat
enar_
cadenas
(cons
tcharcadena1[],cons
tcharcadena2[
],charcadena3[
])
//Comovemosl a3°cadenas eral
ares
ultant
e

i
nti=0;
whi l
e(cadena1[
i]!='\0'
)//Mientraselval
ordelcaracteract
ualnosea\0 ent
onces
//ques igalafi
esta
{
cadena3[ i
]=cadena1[ i
];//As
ignaralvalordelcaract
eractualdel
acadena3 elval
or
//del acadena1 actual
i++;//Incrementari
}

while(
cadena2[
i]!
='\0'
)
{
cadena3[i
]=cadena2[i
];
i++;
}

Esident
icoalant
eriorperofi
jat
eunacos
a,en l
apri
merej
ecuci
on del
arepet
ici
on
dondeivaldri
a0 seejecut
ari
aesto:

cadena3[
0]=cadena2[
0];

intcont
ador=0;//Lous
aremosparaori
ent
arnosen quepos
ici
on s
ees
cri
biopor
//ul
timavez
whi l
e(cadena1[
i]!='\0'
)//Mientraselval
ordelcaracteract
ualnosea\0 ent
onces
//ques igalafi
esta
{
cadena3[ i
]=cadena1[ i
];//As
ignaralvalordelcaract
eractualdel
acadena3 elval
or
//del acadena1 actual
i++;//Incrementari
}

Comonues trapalabraes" I
KI"en elej
empl o,contadorll
egaráavaler4,yaqueen l a
4°repetici
on cadena1[
4]val e\0 ynos eejecut
ará.Porlot ant
oahorapodemos
gui
arnosporelcont adorparas eguirescri
biendoen cadena3,peroantesrecordemos
quequeremosuni r2 palabras
,yneces i
t amosun espaci
oent reambas,entoncesvamos
acrearl
omanual menteen elespacioen elquenosencont ramos:

cadena3[
cont
ador]=''
;//Lapos
ici
on 4 decadena3 val
draun es
paci
o

Comoyaocupamosl apos
ici
on 4,entoncesdeberi
amosdeci
rlealcont
adorquepas
ea
l
aposi
cion 5 paraahorasiprocedercon elres
to:
cont
ador++;
Buenoahoraent oncesvamosacopi ardesde0 l acadena2,porl oqueusaremosi
nuevament e,yl ocopiaremosalaposici
on en dondes eencuentraactual
ment el
a
cadena3,bas andonosen elcont
adoren esecas o.
..dealgunaformaen nues t
rament
e
entoncesasociaremoscadena2[i]ycadena3[cont ador]
.Antesquenadacomoya
usamosit enemosquevol veraponerl
aen 0:

i=0;

Ahorasi,vamosalonues
tro,tendriamosquehacerentoncesal
gosimil
araloant
eri
or
peroes
tablecerl
aul
timaposi
cion obteni
dadecadena3 dici
endoporlotant
oque:

cadena3[
cont
ador]=cadena2[
i];
Quedarí
aes
apart
eas
íent
oncest
eni
endoen cuent
aqueelres
toquedai
gual
:

while(
cadena2[i]!='
\0')
{
cadena3[contador]=cadena2[
i];
i++;
contador++;
}

Yacas it
ermi namos,nosf al
taun ul t
imopas o.
..s
ecopiaron l
as2 cadenasacadena3,
peronosf altaal
go.
..cerrarcadena3 con elvalor\0.Entoncesaprovechamosqueel
contadort i
enelaulti
mapos i
cion obteni
dadeambast ransacci
onesyhacemos:
cadena3[
cont
ador]='
\0'
;//Det
ermi
namosf
in del
acadena

Ahoras ol
orestariall
amaren elmain adi
chafunci
ón envi
andol
os3 parametros(l
as
3 cadenasdeseadas,las2 pri
merass
on l
ascadenasaunir,ylaterceral
acadena
dondes eref
lejaraelresul
tado):

concat
enar_
cadenas
(cadenaTes
t1,cadenaTes
t2,cadenaTes
t3)
;

CREANDO JUEGO DE GENERALA


Y
METODO BURBUJA
(Ordenami
entoArray)
Bien,muybi en 10.Ahoracon loquesabemosvamosadej arnosdejoderun pococon
l
odel ascadenasdecarácteres
,qui
eroques epasqueC ti
eneun pardef uncionesy
l
ibreriasdetodasformasparacompararcadenas ,tamañosyhas taconcatenar,locual
nosahorracrearmuchasdees tasmugres.Ademast eneen cuent
aquecomodi j
e,C++
disponedes tri
ngs,l
ocualnos esiesmasef ect
ivoperosimenost edi
osoquet rabaj
ar
i
ndi vi
dualmentecon chars
.
Vamosas
imul
arun j
uegodeGeneral
a,cl
aroque"
amimanera"
..
.

¿QuéeslaGenerala?.
..bueno,esalgoquenuncaj uguéasíquetuvequeest
udiarun
pocoelRegl
ament o.Laondaesquet enes5 dados,6 caras
,losarroj
asypodeshacer
puntoses
peci
alescon losres
ultadosdelass
iguientesf
ormas :

ESCALERA:12345,23456,13456
FULL:Un pardedadosigualesyun t ri
odedadosi
gual
es.Ej
:5 5 5 1 1
POKER:4 dadosi
guales
.Ej :2 2 2 2 6
GENERALA:5 dadosiguales.Ej
:3 3 3 3 3

Bueno,ini
ciamosentoncesun nuevocodi
go,
empezamosagregandocomoyas abemoslas
li
breri
asdet i
empoyl aot raquenospermi t
e
numerosaleatori
os:

#i
ncl
ude<ct
ime>
#i
ncl
ude<cs
tdl
ib>

s
rand(
time(
NULL)
);

i
ntdados
[5]
;

Ahoravamosacrearelfl
agobool
eanoquenosvaapermi
tirrepet
irelj
uegohas
ta
queelj
ugadorpres
iones
alir:
boolgameOver=f
als
e;

Nues trojuegovaacont arcon un menude2 opci ones


,1 seraparalanzarlosdadosy
las egundas eraparasali
r(hacerquegameOverval gatrueoverdadero).
..l
aopcion
elegidaporelj ugadorlaingres
aranumericamente( numero1 o2) ,yelvalordesu
eleccion s
eraalojadoychequeadoen unavariabl
es i
mpl equecrearemosll
amadamenu
ent onces:
i
ntmenu;
whi
le(
!gameOver)
{

Dentrodelbl
oqueesevamosapedi
rlealj
ugadorquei
ngres
equeopci
on delmenu
qui
ereyquelaingrese:

cout <<endl<<endl
<<"
Sel
ecci
oneOpci
on delMenu:
"<<endl
<<"
1)LanzarDados
."<<endl
<<"
2)
Salir."<<endl
;
cin>>menu;

switch(
menu)
{
case1:
break;

case2:
gameOver=t
rue;
break;
}

Ahoraempi ezal aaccion,pri merot enemosquecrearunaf uncion quearrojelosdados


yguardel osvalores.
..yat enemosnues trodadocreadoen un vect orenterode5
datos,entoncessolot endriamosquecrearunaf unci
on void,yaqueacordat equelos
vectoress
epas an automat i
cament ecomoref erenciays on afectadosen tiemporeal,
entoncesen lafuncion estariamosaf ect
andol osdatosdenues trodado,queesl oque
queremosprecisament e.
..asicomienzaf ueradelmai n nuestraf unci
on:

Ahora,recordemosqueparacrearun al
eat
ori
odel1 al6 eraal
gocomo:

rand(
)%6+1;
Ent
oncespodrí
amoshacer:

dados
[0]=rand(
)%6+1;
dados
[1]=rand(
)%6+1;
dados
[2]=rand(
)%6+1;
dados
[3]=rand(
)%6+1;
dados
[4]=rand(
)%6+1;

¿Quealpedono?.
..aprovechaloquet eenseñédelasrepet
icionesyvasaevitartener
quehacerloquehiceyorecien,entoncesnohagamoscomohi ceahiatrasdeponerlos
5 dadosunoporuno,directamenteus amosun Foryrepetimosl ati
radaparacada
val
orrecorri
doporiychaupi chu:

for(
inti=0;i<5;i ++)//Mi
ent
rasis
eamenora5 repi
teelproces
o(l
orepi
teporl
o
//tanto5 veces
)
{
dados[i
]=rand( )%6+1;
}
cons
ti ntj
ugada_
escal
era1[
]={
1,2,
3,4,
5,0}//Luegoexpl
icaremej
orelpor
quepus
e
//un 0;
cons
ti ntj
ugada_
escal
era2[
]={
0,2,
3,4,
5,6}
;
cons
ti ntj
ugada_
escal
era3[
]={
1,0,
3,4,
5,6}
;

dado[
]={
2,3,
1,4,
5}

Y alcompararlocon porejemplojugada_escal
era1[],noserí
an equival
ent
espormas
queelvectorpos ealosnumeros
,comovemoses tan des
ordenadosyporl otantoen
dif
erentespos
icionesdememori a.
..¿porquenos eri
aequival
ente?..
.paracompararl
os
usamosun bucleForquerecorral aposici
on unaporuna,ent oncesimagi
nemossolola
primercomparaci on,dondeivaldri
a0,s eria:

i
f(dado[
0]==j
ugada_
escal
era1[
0])

Locualestaríacomparandol apri merposici


on opri
merdat odedado1,con elpri mer
datodelvect ores calera1,en elprimercasoelprimerdat ocomovi mosen elejemplo
es2,yen es calera1 elpri merdat oes1,porl otantonosdet ect
aráques on di
ferent
es
yrepi
to,estoespor quecomparal osdatosen cadaposi
cion,yvistoen t
ablassería
comocomparares tas2:
f
or(
inti=0;i<4;i
++)
{

Ahoralevamosamet eren elbloqueloquedi ji


mos,elcondi
cionalquedi
ga"sila
proxi
mapos ici
on esmenoral aact ualentonces
",parapoderluegometerdentrode
esacondi
cion elcambi
oot ruequedeval ores:

i
f(dados
[i]>dados
[i+1]
)
{

Supongamosparaent
enderes
apart
elapri
merej
ecuci
ón dondeival
dra0.
..quedarí
a:

i
f(dados
[0]>dados
[1]
)
{

}
Si
endoquedados [0]valia2,ydados
[1]vale3 entonceslacondicion nosecumple,
porlotantoest
an ordenadosynohacef al
tacambi arelval
or..
.ent oncesiaumentaen
1 yvuel
vearepet irs
eycomprobarseotravezesto.Ahoraen las egundaivale1 por
l
oquees tamosejecutando:

i
f(dados
[1]>dados
[2]
)
{

Bueno,dados [
1]comovi mosvale3,ydados [2]vale1,ahorasielprimeroesmayor
quelasiguient
eposi
cion as
iqueesnecesari
oi nt
ercambiarlosvaloresparaquequeden
ordenados.¿Comohacemoses t
o?..
.bueno,siquis
ieramoshacerl
os impleydijeramos
:

dados
[1]=dados
[2]
;
dados
[2]=dados
[1]
;

i
ntordenTemporal
;

ordenTemporal=dados
[i]
;

Hacemoscomoveníamospl aneandoahoraquetenemosnues t
rorespal
dopodemos
reempl
azardado[
i]con elvalordelasi
guient
eposici
on paraquequedeen orden:

dados
[i]=dados
[i+1]
Ahoradados[i
+1]queeslanuevaposi
cion debecobrarelval
oranti
guodedados
[i]
,
quecaut
elos
amenteguardamosen l
avariableordenTemporal,as
iqueesul
trasi
mpl e:

dados
[i+1]=ordenTemporal
;

Nues
troForcompl
etoquedarí
aas
i:
for(i
nti=0;i<4;i ++)
{
if(
dados [
i]>dados[i
+1])
{
ordenTemporal=dados [i
];
dados [
i]=dados[i
+1];
dados [
i+1]=ordenTemporal;
}
}

Ahorabi
en,esci
erto,elrepeti
dorchequeal
asposici
onesbus
candosilaproxi
maes
menorys il
oeshaceelintercambi
o,perosupongamosquet enemoses
teresul
tadode
dados
:
44213

En laprimerrepet i
cion ambosval
en 4,porl
otantonosehaceintercambio.En l
a
segundarepetici
on 2 esmenorque4,porl otant
os ei
ntercambi
aran,entoncesel
orden quedarí
aas i
:
42413
Luegoelprogramas
egui
ríacon l
asi
gui
ent
epos
ici
on,4 >1,ent
oncesi
ntercambi
a
quedando
42143

Porul
timos
ecomparal
asul
timaspos
ici
ones4 >3,i
ntercambi
andoyquedando:
42134
Comovemosnien dopees taordenado..
.est
oespor ques
erequierequeelrepeti
dorse
ejecuteo"repi
ta"cuantasvecesseaneces
ariodesde0 afi
n dequesehagan todoslos
intercambi
osposibl
es.Poresoloques ehaceehiceyoalmenos,esmet erelrepeti
dor
dent rodeotrorepeti
dordees taforma:

for(i
ntj=0;j<4;j ++)//Metodoburbuj
a
{
for(i
nti=0;i<4;i ++)
{
if(
dados [
i]>dados[i
+1] )
{
ordenTemporal=dados [i
];
dados [
i]=dados[i
+1] ;
dados [
i+1]=ordenTemporal ;
}
}
Todoes tores
umi doesunodel ostrucosmasf amososdeordenami entol
lamado
mét odoburbujayl oacabamosdeut il
izar.Loquehici
mosen elúltimopunt oen este
casoesdecirl
equeelrepet i
dorForquel epusi
mosrepita4 veces
,vaarepet irs
e4
veces.
..osea4 vecesvaarepetirse4 veces,omejordicho,vaaordenarl asposici
ones
desde0 unas4 veces,loqueess uf
ici
enteparaques eordenecompl et
ament eel
"array".

Esteorden nosserviraademasparal asotrasjugadas


,espores oquecomenzamospor
aca.Ahorades delaf unci
on quees tabamosvamosal lamaraot rafuncion quevamos
acrear,ques ell
amarachequear_ jugada,al acuallepasaremosestosnuevosdados
ordenadoscomoparamet roys eencar garadehacerl ascomparacionesnecesariasy
demasparavers itenemosESCALERA,FULL,POKER oGENERALA,porl ot anto
reci
beeseparamet ro,nues troarraydadoordenadoyt rabajacon élen l
ami sma
funci
on porloquenoesneces ari
odevol verval
or,quedandoas inuestradeclaracion:

//Funci
on chequearj
ugada

voi
d chequear_
jugada(
intdados
[])
{

Loprimeroquehacenues trafuncion esdeci


rlosnumerosques al
ieron ordenados
,
comoyal ost
enemos ,asiquesimplement evamosaus arForpararecorrereldado
mient
rascon coutdecimoslosvaloresdecadapos i
cion,quedandoas i
:

cout
<<endl
<<endl
<<"
Tirada:"
;

for(
inti=0;i<5;i ++)
{
cout<<dados
[i]
<<""
;//Expres
aelval
ordedado[
]segun s
upos
ici
on act
ual
}

Ahoraveamos,l
oprimeroquequierohaceresversilosdadoscoi
nci
den con es
caleras
.
Paraes
os emeocurriocrearunanuevavariabl
eintermedi
acuyos6 val
oresinici
ales
quequi
erotengason 0,yahoraexpl
icareporque:

i
ntes
cal
era[
]={
0,0,
0,0,
0,0}
;
1,
2,3,
4,5,
6

1,
2,3,
4,5,
0

Locual0 si
gni
fi
caquees enumeronos ali
o.Estomevaas ervi
rparacompararcon el
format
odeporej emplojugada_
escal
era1[]quelodi
agramedeesaforma,acordat
e
comoestabadecl
arado:

j
ugada_
escal
era1[
]={
1,2,
3,4,
5,0}
;

Dees
taf
ormas
iporej
empl
osal
e11355 nues
travari
abl
eint
ermedi
aquedari
a:
1,
0,3,
0,5,
0

//Acomodamosparachequeares
cal
eras

for(i
nti=0;i<6;i ++)//Recorremos5 val
oresdedados
{
escal
era[
dados[i
]-1]=dados [i
];//Seas
ignaelvalordedadospos
ici
on act
uala
//escal
eraposi
cion val
ordedados-1
}
=dados
[i]

Ahoraloquepuedeparecerl
ocodeent
endereses
tapart
eal
aqueas
ignamosel
dato:
es
cal
era[
dados
[i]
-1]

Estoessi
mpleen reali
dad,paralaposi
cion dees
cal
eranousamosi ,si
noqueusamos
elval
ordeldadoact ual
,supongamosqueeldadoen esapos
ici
on vale2,ent
onces
est
ariamosdi
ciendoque:
es
cal
era[
2]=2;

Comonos
otrosqueri
amosquees
cal
erat
engal
osnumerosal
goas
i:

1,
2,3,
4,5,
6
Nues
trocodi
goempezaríaen es
taparteadopt
andoes
tenumeroen t
eorí
aindi
cando
quesal
io(
ahoraverascomotel oarrui
no)
:

0,
2,0,
0,0,
0

0,
0,2,
0,0,
0

Poresoesquepus e:escal
era[dados
[i]
-1]l
ocuals ignif
icaelvalordedadosen posici
on
act
ual(en est
ecas o2)yl uegolerest
amos1...en esaposi
cion seguardaráelval
orde
dadosposi
cion act
ual,comodi ji
moscomplet
os eri
a:

es
cal
era[
dados
[i]
-1]=dados
[i]
;

Y ahoras
iquedarí
abi
en.Nues
traf
unci
on es
taquedandoas
iporahora:
voi
d chequear_
jugada(i
ntdados[
])
{
i
ntes cal
era[
]={ 0,0,0,
0,0,
0};

cout
<<endl
<<endl
<<"
Tirada:"
;

f
or(inti=0;i<5;i ++)
{
cout<<dados
[i]
<<"";
}

//Acomodamosparachequeares
cal
eras

f
or(
inti=0;i<6;i
++)
{
es
cal
era[
dados
[i]
-1]=dados
[i]
;
}

l
anzar_
dados
(dados
);

chequear_
jugada(
dados
);
boolcheck_
escal
eras
(cons
tintarray1[
])
{

booles
cal
eras=t
rue;//f
lag

Ahoracompararemosl as6 pos i


cionesdenues troarray1[](vari
ableintermedia)con
jugada_escal
era1.
..s
iunodel osvaloresesdiferent
e,entoncesescalerasseraf
alsoy
rompemoses acomprobaci
on yaqueent oncesesobvioquenues troarray1 yanoes
esaescaleraypodemospros egui
rcomparandol acon elres
to:

for(i
nti=0;i<6;i ++) //Recorremosambasvariabl
escomplet
amente
{
if
(array1[i]!=jugada_
escalera1[i]
)//Siunodel
osvaloresdel
aposi
cion act
uales
//diferent ealotrodel aposi
cion actual
{
escaleras=fals
e;//Escal
erasesf also
break;//Rompemosl arepet i
cion
}
}

if
(!es
cal
eras
)//Sies
calerasesf
alsoentonces
{
//Aquipondremoslacomparacion con j
ugada_
escal
era2
}
Entoncesahoral
acomprobaci
on con j
ugada_
escal
era2 esexact
amenteigual
,s ol
oque
antesdeempezarelbucl
equecompruebees totenemosquehacerquees cal
erassea
verdaderopordef
ect
onuevament e,asis
iesfal
so,lediremosnosot
rosqueesf al
so:

i
f(!
escaleras)
{
escaleras=t rue;
for(i
nti=0;i<6;i ++)
{
i
f(array1[i
]!=j ugada_es
cal
era2[
i])
{
escal
eras=f als
e;
break;

}
}
}

Bueno,siaún despuesdehabercomprobadol as2 es


caleras
,escal
erassi
guesi
endo
fal
so(alnos eridenticoslosvectores)
,entoncesprocedemosacompararcon laulti
ma
posi
bleescal
era,jugada_escal
era3,t alcualhici
mosant essol
oqueen lugardealfi
nals
i
hayun numerodi f
erent edecirquees cal
erasesfal
so,directamenteret
ornamosfal
soy
terminamosl afuncion:

i
f(!
escaleras
)
{
for(
inti=0;i<6;i
++)
{

i
f(array1[i
]!=j ugada_
escal
era3[
i])
{
escal
eras=f als
e;
return f
als
e;
}

}
}

Llegamosalfi
naldelafunci
on,sielprogramallegohastaacaynoretorno" f
als
o"
entoncesesporqueunadelascondi
cioneseraverdadera,porl
otant
oret ornamos
verdadero:

ret
urn t
rue;
i
f(check_escal
eras
(es
cal
era)
)
{
cout<<"ESCALERAS"<<endl
;
}

intcheck_
repetici
on(
consti
ntarray1[ ])
{
//Return 0 Nada,1 Ful
l,2 Poker,3 General
a
}
1,
2,3,
4,5,
6
Loquesebuscaesquerepres
entecadal
ugaresosnumeros
,perol
acant
idad deveces
queserepi
te,porej
emplosisal
e11233 seri
a:
2,
1,2,
0,0,
0

i
ntrepet
ici
ones
[]={
0,0,
0,0,
0,0}
;

//Orden porrepet
ici
ones

for(
inti=0;i<6;i ++) //Recorremostodasl
asposi
ciones
{
repeti
ciones[
array1[
i]-1]++;//Valordeldado- 1 aument arrepet
ici
on en di
cha
//posi
cion +1
}

Ali gualquehabi
aexplicadoantes,hacemos-1 yaquenues trapos i
cion empiezaen 0,
asieliminamosesedesf
as aj
epequeño.Ahoras implement etenemosnues t ravari
abl
e
i
nt ermediaquenosdicecuant osnumeroshaydecadaval or,entoncespri merovamos
acrearun nuevobuclef orcon elquerecorreremoses t
anuevavari ableporcompl etoy
ahoraexpl i
careporque,peropores oprimerodecl aramoself or:

f
or(
inti=0;i<6;i
++)
{

Ahoral oprimeroquequeremosveress ihayGENERALA,paraques eproduzcaesta


jugadat i
enequehaber5 val oresi
gual
es.
..comonues travariableint
ermedi asol
oera
un contadoren elcasodequeal gunades usposi
cionesvalga5 s i
gni
ficari
aqueun
numeros erepite5 vecessi
ni mportarcual,l
oquei ndicaríaques ehizodichajugada.
..
entonceslouni coquet enemosquehaceresbus caren todasl asposi
cionesavers i
algunaesequi val
entea5:
//BuscamosGenerala
i
f(repet
ici
ones
[i]==5)
{

}
Dent rodedichobloque,recordemosques
ihabi aGENERALA i
bamosaret ornarel
valor3 (es
toesalgoqueel egíyocomoreferenci
a,nadamas)
,entoncess
impl ement
e
agregamos:
ret
urn 3;
Sal
iendodedi chocondici
onalperocontinuandoen elbucl
e,vamosacomprobar
ademass ihayPOKER,paraPOKER t i
enequehaber4 dadosi gual
es,porl
ot anto
nuestrocontadorti
enequepos eeral
gun valor4.
..buscamosporelvalor4 entonces
i
gualquehi ci
mosrecien:

//BuscamosPoker
i
f(repet
ici
ones
[i]==4)
{

}
//Fi
n Poker

En elcas
odequeexistal
aj ugadarecordemosqueelnumeroquequeríamosretornar
paraPOKER era2 (l
areferenciaqueelegíyoporconveni
enci
a),ent
oncesponemos
dentrodees
ebloquecondicional
:
ret
urn 2;

Ahoranosquedacomprobarlaul
timaj
ugadall
amadaFULLlacualcons
tadeun par
yun tri
odecartasi
gual
es.Pri
merocomparamoss
ihayun t
rio(
ys ihaynosuni
mos
j
aja)
:

//BuscamosFul l
if
(repeti
ciones
[i]==3)
{

//Bus camosFul l
if(
repet i
ciones
[i]==3)
{
for(i
ntj=0;j<6;j ++)
{

}
}
//Fi
n Ful
l
Porult
imodentrodelbucl
ef ornuevovamosabuscars
ihaypar( oseaal
gun valor2)
ysilohayret
ornamoselvalor1 quehabiamosdi
choen nues
troej
emplosigni
fi
cara
queobtuvi
mosFULL,quedarí
aas iest
aparte:

//Bus camosFul l
if(
repet i
ciones
[i]==3)
{
for(i
ntj=0;j<6;j ++)
{
if(
repet i
ciones
[j]==2)ret
urn 1;
}
}
//Fin Full

s
wi tch(
check_
repeti
cion(
dados)
)
{
case1:
cout<<endl
<<endl
<<"FULL"
<<endl
<<endl
;
break;

case2:
cout<<endl
<<endl
<<"
POKER"
<<endl
<<endl
;
break;

case3:
cout<<endl
<<endl
<<"
GENERALA"
<<endl
<<endl
;
}
ARRAYS,VECTORES O VARI
ABLES
MULTI
-DIMENSIONALES

i
ntvari
abl
e[10]
[5]
;
Estosignif
icaqueacadadimens
ion l
ecorrespondetodosl
osespaci
osdel
adi mens
ion
si
guiente,algoas
iloquequi
erodeci
rt eni
endoen cuental
avariabl
equedecl
are
arri
ba:

vari
abl
e[0]
[0]=0;
vari
abl
e[0]
[1]=0;
vari
abl
e[0]
[2]=0;
vari
abl
e[0]
[3]=0;
vari
abl
e[0]
[4]=0;
vari
abl
e[1]
[0]=0;
vari
abl
e[1]
[1]=0;
vari
abl
e[1]
[2]=0;
vari
abl
e[1]
[3]=0;
vari
abl
e[1]
[4]=0;
.
..
etc

Estonospermi tetrabaj arcon unacant i


dad enormededat os.Sinol evesut il
idad
puedodeci rteporej empl o,supongamosquees tascreandotuvi deoj
uego2D
MMORPG yqueresl l
enart odasl aspos i
cionesX, Y deun mapacon pas t
o,i tems,segun
elobjetoinsertadoelval orquet omaes apos i
cion XY..
.¿vasaponert eal lenaruna
porunacon 2 vari ablesquedet ermi nen laubicacion yunat erceravariablequedi ga
queobj etohayahí ?..
.claroqueno,podesrepres entarlosej
esX, Y detumapacon una
variablededosdi mens i
onesquet alvezs ellamecoordenadas [X][Y]yqueelnumero
queal ojeesacoordenadas ealai magen quel ecorrespondeaes acoordenada,oel
objetoquehayen es acoordenada. .
.
Ent relascos
asquedibujaen elmapat ambien di
bujalosobj
etosquehayamos
colocadoen elmapaen lasposici
onesXY quecorres
pondan,paraes oen una
carpetacadai magen decadaobjetoseidenti
fi
cacon un numero.
..

Loquehaceel" motor"esdet ectar,s


ipor
ejemplocoordenada
[y]vale0 entoncesnodi bujaningun objeto,
peros ival
eporej emplo1,ent oncesdibujaría
elobjeto1 en di
chapos i
cion,elcualen el
ejemplodenues tromot oreses acantidad
atractivadeoro..
.
intmapa[ 50]
[25] ;
//Vaci
amospos i
ciones
for(
intj=0;j<50;j ++)//Recorretodal
adi
mensi
on 1
{
for(
inti=0;i<25;i ++)//Recorret
odaladi
mens
ion 2
{
mapa[ j
][i
]=0;
}
}
STRUCT O ESTRUCTURAS

Expli
careahoraun pocodees truct
urasos truct,aunqueluegoveremosal gol l
amado
obj
etosen C++queesmuchomasconveni ente,peroen C aun noexisti
an lasClasesni
Objetos
,porl oqueut i
li
zabamosStruct
.¿ Querayoseses o?.
..bueno,unaes tructura
nospermi t
ecrearprecisamenteeso,unas uertede" moldes"quecontienen varios
val
oresquepredefinimos,yasipodemoscrearcos ascopiandodi chaestructuraa
nuestraconveni
enciaymodi fi
candoen cadacas oparticul
arlosvalores.
Sequeparecedif
ici
ldeent ender,perorealmenteesmuysencill
o,escas
iun chist
e.
Imaginemosqueest
amosj ugandoSI MS,tenemosa4 pers
onajesen nuestrafamil
ia.
Recordemosquecadapersonajetenía8 necesi
dades
,quebien podemosubicarl
asa
cadaunaen unavariabl
ede8 val ores
,os ea:

i
ntneces
idades
[8]
;//Cadaes
paci
osi
gni
fi
caraunaneces
idad

i
ntt
rabaj
o;

Perot
ambi
én cadaSi
m t
ieneunaves
timent
a:

i
ntves
timent
a;

Perot
ambi
en cadaSi
m t
ieneun pei
nado,col
orys
exo:

i
ntpeinado;
i
ntcolor;
i
ntsexo;
Ok,s
uponagmosques
on s
oloes
asvari
abl
es,t
enemoses
tasvari
abl
esparacadaSi
m:
i
ntnecesidades
[8]
;
i
nttrabajo;
i
ntvestimenta;
i
ntpeinado;
i
ntcolor;
i
ntsexo;
s
tructs im
{
i
ntneces idades
[8]
;
i
ntt rabajo;
i
ntves timenta;
i
ntpei nado;
i
ntcol or;
i
nts exo;
}

Entoncesahorapodemoscrearcon es
taes
tructura"
Sim"queconti
eneesosdat
os,
muchascopiascomos if
ueraun ti
podevariabl
e,porejempl
osiqui
erocrear4 Si
ms
bas
taríacon deci
r:
s
im pers
onaj
e1;//Creamosunaes
truct
uradelt
ipos
im l
lamadapers
onaj
e1
s
im pers
onaj
e2;//Creamosunaes
truct
uradelt
ipos
im l
lamadapers
onaj
e2
s
im pers
onaj
e3;//etc
s
im pers
onaj
e4;

Entoncesahorapers
onaj
e1 porej
emploesunaes
truct
ura,dent
rodeel
lacont
iene
aut
omat icament
elasmismasvari
abl
esquesi
m,esdecir:

i
ntnecesidades
[8]
;
i
nttrabajo;
i
ntvestimenta;
i
ntpeinado;
i
ntcolor;
i
ntsexo;

¿Sepueden modif
icar?.
..cl
aromens o,esoesf
acil
,suponi
endoquequeremosmodi fi
car
elpeinadodenuestropersonaje,elcolor,l
avesti
ment ayelsexoporqueestamosen l
a
ventanadecreaci
ón delpersonaj e,si
mplementepodemosaccederalcontenidodela
estruct
uraponi
endopunt o".
"s eguidodeelnombredel avariabl
eaacceder:
j
ugador1.
peinado=5;//Modi
fi
camoselval
orpei
nadodel
aes
truct
uraj
ugador1
j
ugador1.
color=2;
j
ugador1.
sexo=1;
j
ugador1.
vesti
menta=22;

CREANDO Ta-Te-Ti
(3 En Raya)
2 JUGADORES

¿
Esunagenial
idad no?.
..en bas
eat odoes
toqueaprendi
moscrearemosun TaTeTi2
j
ugadores
.Ambosjugadoresnecesi
tamosmanipul
arlossi
gui
ent
esdat os
:

-Posi
cion X en pantal
la
-Posi
cion Y en pant
alla
-Si
mbol ocharcon elqueDi buj
an s
umarca( X/O)
-Posi
cion en elTabl
ero( elt
ableroti
ene9 pos
ici
ones
)
Perfecto,comoambosvan atenerelmis moformat o,vamosacrearunaestruct
ura
entoncesydeal l
ívamosacrearlascopiascorres
pondientesaj
ugador1 yj
ugador2
quel uegomodif
icaremos
.Pri
merodefinamosl aestruct
ura:

s
tructJugador
{
intposX;
intposY;
charpersonaje;
intposTabla[
1][2];
}jugador1,jugador2;

Comovemosl uegodet ermi


narl oscorchetesyf i
nalizarelst
ructdecl
aréjugador1 y
j
ugador2,locualsepuedehacert ambien deesamanera.Es tadecl
araci
on est
af uera
delmain,def ormaqueelalcancedeambasesgl obal.Ahoravamosalmai n,vamosa
defi
nirl
osvaloresdecadaunadees tasvariabl
es:

jugador1.pers
onaje='X'
;//Elj ugador1 marcaracon unaX
jugador2.pers
onaje='O';//Eljugador2 marcaracon unaO
jugador1.posX =40;//Coordenadaen pant al
laX i
nicialeselcent
ro,l
uegoubi
caremos
//eltablero
jugador1.posY =12;//Coordenadaen pantallaY i
nici
aleselcentro
jugador2.posX =40;
jugador2.posY =12;

Vamosadi buj
arcos
asen pantal
la,comoelt abl
eroydemasparahacerl
omascopado,
asiquevamosatenerqueincl
uir3 libreri
as:

#i
ncl
ude<conio2.h>//Coordenadas
,li
mpiezadepant all
aydi buj
ado
#i
ncl
ude<cst
dl i
b>
#i
ncl
ude<unistd.h>//Parall
amaral afunci
on us
leep queus
aremosparaelFPS

Vol
vamosalmain,decl
aramoselbool
eanoquemant
endranues
troj
uegof
unci
onando
has
tafi
nal
izaryelwhilequel
omant endra:

boolgame_
over=f
als
e;

whi
le(
!game_
over)
{

}
Dent
rodelwhilel
oprimeroquemet
emoseselFPS,us
tedesaj
ust
en en numero,ami
meandabien aes
taveloci
dad:

us
leep(
30000)
;//Nues
tro"
FPS"
Luegodecadaes peradibuj
aremosen pant al
laeltabl
eroen cadavuelta,vamosa
crearunafunci
on ll
amadadi buj
ar_t
ableroprimerocon lascoordenadasydemasdel
tablero,amimecos toun pocoirencontrandolasposici
onescorrect
asperomaso
menosesas i
:

//Di
buj
adodelt
abl
ero

voi
d di
buj
ar_
tabl
ero(
)
{

gotoxy(
37, 10)
;
cout<<"
|";
gotoxy(
43, 10)
;
cout<<"
|";
gotoxy(
37, 12)
;
cout<<"
|";
gotoxy(
43, 12)
;
cout<<"
|";
gotoxy(
37, 14)
;
cout<<"
|";
gotoxy(
43, 14)
;
cout<<"
|";

gotoxy(
35,11);
cout<<"
-----------"
;

gotoxy(
35,13);
cout<<"
-----------"
;

s
tructJugador
{
intposX;
intposY;
charpersonaje;
intposTabla[
1][2];
}jugador1,jugador2,curs
or;
En elmain ahoral
eproporci
onamoss
usval
oresi
nici
alesal
aes
truct
uracurs
orque
creamos
:
curs
or.
personaje='+'
;
curs
or.
posX =40;
curs
or.
posY =12;
curs
or.
posTabla[
0][
0]=1;//X
curs
or.
posTabla[
0][
1]=1;//Y

posTablaesl
aposici
on en l
atabl
ade9 val
ores.Lahi
cede2 dimensi
onespor
quees
masf áci
lveralTa-Te-Ticomo3 fi
lasy3 col
umnas,ent
onces0 t
omaraelvalorde
fi
las,y1 decol
umnas :

Entendiendoent
onceses
tofil
aspuedetomarelvalorde0,1,2 ycol
umnas0, 1,2.Por
lotantoelmedioserí
afi
las1,col
umnas1...poresoleot
orguéesaposi
cion i
nici
al
comopodesver,lacualeselcent
rodeltablero:

curs
or.
pos
Tabl
a[0]
[0]=1;//X
curs
or.
pos
Tabl
a[0]
[1]=1;//Y
Est
onos ignif
icaques ealaposición en pantal
ladecoordenadas,soloeslapos i
ción en
eltableroqueus aremoscomoref erencialuegoparasaberquecas i
ll
erosocupamoscon
quemarcasono.Ahoral oquequeremoshaceresagregarl asvari
ablesgl
obalesque
uti
lizaraeljuegoen general,es
t asson 3 en micaso:elturno( j
ugador1 ojugador2) ,
lajugada( hasta9 jugadas)
,yelganador:

boolturno=0;//Turno0 est urnoj ugador1,1 esturnojugador2,comi enzaen 0


intjugadas
;//Jugadasloiremosincrement andoen cadajugada,alllegara9 s inadi
e
//ganóindicamoselempat eyfin dejuego
intganador=0;//Siganadores0 nohayganador,s ies1 entoncesjugador1 gana,
//sies2 entoncesj
ugador2 gana

Ahoracreamoselt ablerode3x3 tambi


en comovariabl
eglobal
..
.losvaloresquepodra
tomarcadaes paci
os on:"2"quesi
mboli
zaráelespaci
oos l
otdisponiboeol i
bre,"
1"
parasimboli
zaraun es paci
oocupadoporjugador2,y" 0"paraun es paci
oocupado
porjugador1:

i
ntt
abl
ero[
3][
3];//0 Jugador1,1 j
ugador2,2 Es
paci
oLi
bre
//Coordenadas

i
ntpos
ici
ones
[3]
[3]
[2]
;//0 X 1 Y

voi
di nici
ar_coordenadas
()
{
posi
ciones[0][0][
0]=35;
posi
ciones[0][1][
0]=35;
posi
ciones[0][2][
0]=35;
posi
ciones[1][0][
0]=40;
posi
ciones[1][1][
0]=40;
posi
ciones[1][2][
0]=40;
posi
ciones[2][0][
0]=45;
posi
ciones[2][1][
0]=45;
posi
ciones[2][2][
0]=45;
posi
ciones[0][0][
1]=10;
posi
ciones[0][1][
1]=12;
posi
ciones[0][2][
1]=14;
posi
ciones[1][0][
1]=10;
posi
ciones[1][1][
1]=12;
posi
ciones[1][2][
1]=14;
posi
ciones[2][0][
1]=10;
posi
ciones[2][1][
1]=12;
posi
ciones[2][2][
1]=14;
}

Entoncesalpri
nci
piodenuest
romain vamosal l
amaraes tafuncion paraqueya
arranqueasi
gnandoalavari
ablet
odaslascoordenadasqueseran laref
erenci
ade
dondeposici
onarparacadaunodelos9 es
paciosdeltabl
eroun elementoen pant
all
a:

i
nici
ar_
coordenadas
();
di
buj
ar_
curs
or(
);
voi
d mover_
jugador(
)
{

s
wit
ch(
get
ch(
))//Obt
enercodi
got
ecl
apres
ionada
{

cas
e27://Es cape
exi
t(1)
;//Fi
nalizaelprograma

cas
e75://Fl
echaI
zqui
erda

break;

cas
e77://Fl
echaDerecha

break;

cas
e72://Arri
ba

break;

cas
e80://Abaj
o

break;

cas
e'\r'
://Ent
er

break;

}
}

curs
or.
pos
X +=5;
curs
or.
pos
Tabl
a[0]
[0]
++;
Loi
nvers
oesparai
zqui
erdaporl
otant
o:

curs
or.
pos
X -=5;
curs
or.
pos
Tabl
a[0]
[0]
--;

Haciaarribaeles paci
oen ventanaesmenor,porl
otant
ocon modi
fi
car+=2 o-=2
segun l
adi recci
on quecorres
ponda(ARRI
BA oABAJO)bast
ari
a,porejempl
opara
Arribaseria:
curs
or.
pos
Y -=2;
curs
or.
pos
Tabl
a[0]
[1]
--;

Y paraabaj
oseri
a:
curs
or.
pos
Y +=2;
curs
or.
pos
Tabl
a[0]
[1]
++;

Ahorarecordaunacos a,estotedaríamovi mientoinfi


nito,ynos otrosqueremosque
nos epuedasal
irdelt abl
ero.Entoncesen l
osmovi mientosX (derechaei zqui
erda)
podemosponerun condi ci
onalparaques ean pos
ibl
es,porej emplos isevaal a
izqui
erda,l
aposici
on en eltabl
eronopodri aser0 porques i
noes tariamosen elborde,
entoncesparai
zquierda:

i
f(cursor.
pos
Tabla[0]
[0]!=0)
{
cursor.
posX -=5;
cursor.
posTabl
a[0][
0]--;
}
break;

En elcasodeladerechal
apos
ici
on nopodrí
aser2 por
quees
tari
amosen elot
ro
bordelimit
e,ent
onces:

case77://Fl echaDerecha
if
(cursor.
posTabl
a[0][0]!=2)
{
cursor.
posX +=5;
cursor.
posTabla[
0][0]++;
}
break;

Lomi smocon elrest


o.Ahoratenemosquell
amaraes tafuncion en elmai
n,dentro
delbucl
ewhil
es iempreycuandos ehayapresi
onadounat ecl
a,paraes olohacemos
comohabiamosvi s
todeestaforma,antesdelfi
naldelbucl
ewhi l
e:

i
f(kbhi
t()
)mover_
jugador(
);//Sis
epres
ionounat
ecl
aent
oncesl
lamaral
afunci
on
cl
rscr(
);

voi
d check_
jugada(
)
{

i
f(t
abl
ero[
curs
or.
pos
Tabl
a[0]
[0]
][curs
or.
pos
Tabl
a[0]
[1]
]==2)
{

Ahoras i
mpl ement etenemosquedarl eelvaloraes apart edeltablero,quevalgael
numerodelj ugador..
.elnumerodelj ugadorestarepresentadot ambien porelnumero
delturno,ent onceslediremosquedi chaposici
on XY en eltabl
eroahoravaaval erel
val
ordet urno( 0 erajugador1,1 erajugador2):

t
abl
ero[
curs
or.
pos
Tabl
a[0]
[0]
][curs
or.
pos
Tabl
a[0]
[1]
]=t
urno;

t
urno=!
turno;//Sit
urnoera0 ahoraes1,yvi
cevers
a

j
ugadas
++;

check_
jugada(
);
//Di
buj
adomarcas

voi
d di
buj
ar_
marcas
()
{

f
or(
intj=0;j<3;j
++)
{
f
or(
inti=0;i<3;i
++)
{

}
}

got
oxy(posi
ciones
[j]
[i][
0],posi
ciones
[j]
[i]
[1]
);//Recorremosl
as9 coordenadasdel
//t
ablero,0 eselvalorX,1 eselvalorY delaposici
on

if
(tablero[j
][i
]==0)//Sidicholugaren elt
ablerovale0
{
cout<<jugador1.
pers
onaj
e;//Dibujarels
imbolodej ugador1 (
X)
}
Ahoraagregamosunacondi
cion s
imi
laracont
inuaci
on paraj
ugador2,en es
tecas
o
teni
aquevaler1:
els
ei f
(tablero[
j][
i]==1)//Silapos
ici
on en elt
abl
eroactualval
e1 ent
onces
{
cout<<jugador2.pers
onaj
e; //Di
bujamossimboloj
ugador2 (O)
}
//Di
buj
adomarcas

void di
buj
ar_
marcas
()
{
for(
intj=0;j<3;j ++)
{
for(
inti=0;i<3;i ++)
{

got
oxy(
pos
ici
ones
[j]
[i]
[0]
,pos
ici
ones
[j]
[i]
[1]
);

if
(tablero[j
][i]==0)
{
cout<<jugador1.pers
onaj
e;
}
els
ei f
(tablero[j
][i
]==1)
{
cout<<jugador2.pers
onaj
e;
}

}
}

Vamosalmain yl
uegodeell
lamadoadi
buj
ar_
tabl
ero(
)agregaremosell
lamadoa
di
buj
ar_marcas
:
di
buj
ar_
marcas
();

Ant esdepoderdi bujareltablerodebemoslimpiarl


oparaques uval orini
cials
ea2
pordef ecto,os eaquees tell
enodees paci
osdis
poni bl
es.
..estotambien nospodria
servirsiqueremoshacerques epuedan i
nici
arvariaspart i
dasnuevament e,en fi
n,
creamosl af uncion l
impiar_
tableroquenoesni ngunaciencia,recorrelosdatosde
tablero[
][]yl osmodi fi
caalval or2:
voidli
mpi ar_
tabl
ero(
)
{
for(
intj=0;j<3;j ++)
//Vaci
amospos
ici
ones
{
for(
inti=0;i<3;i ++)
{
tabl
ero[j
][i]=2;
}
}
}
Bueni
simo,ahoraen elmai
n antesdei
nici
arelwhi
let
enemosqueas
egurarnosde
l
lamaraes t
af unci
on,ylohacemos:
l
impi
ar_
tabl
ero(
);

Vamosaagregarleunascosasmasalmai n as
inolovolvemosat ocarporquemej ode
iryveni
r.Despuesdedibuj
ar_marcas
()vamosachequears isehici
eron 9 j
ugadasysi
esas
idecirl
equeempat oychau..
.paraesorecordemosquet eni
amosunavari abl
e
ll
amadajugadasquevaincrementando,entoncessij
ugadasequi
valea9 decimosque
empatoyrompemoselwhi le:

i
f(jugadas==9)
{
cout <<endl
<<endl
<<"
EMPATE"
;
break;
}

el
seif(ganador!=0)
{
cout<<endl
<<endl
<<"
JUGADOR "
<<ganador<<"HA GANADO.
"<<endl
<<endl
;
break;
}

-Comprobaci
on del
ineaen FILAS (
Hori
zontal
).
-Comprobaci
on del
ineaen COLUMNAS ( Vert
ical
).
-Comprobaci
on dediagonal
es.
f
or(
intj=0;j<3;j ++)//Fil
as
{
i
nth1 =0;//Cont
adorj ugador1
i
nth2 =0;//Cont
adorj ugador2

f
or(
inti=0;i<3;i
++)//Col
umnas
{

}
}

if
(tablero[
i][j]==0)//Siposact
ualdelt
ableropos
eevalor0
{
h1++;//I ncrement amosh1
}
els
ei f
(tablero[i
][j
]==1)//Siposact
ualdeltabl
eropos
eevalor1
{
h2++;//I ncrement amosh2
}

if
(h1 ==3)
{
ganador=1;
}
els
eif(h2 ==3)
{
ganador=2;
}
Dees t
af ormayat enemoseldet ectordevi ctoriasporli
neas.Ahoravamoscon l as
columnas ,s al
imosdeambosbucl esForynosdi sponemosahacerl omi smoperoal a
inversa,esexactament el omi smoperomodi ficamoselbucleen lugardecomprobar
tablero[i
][j]locualveriamosl asf i
lascon prioridad,loi
nvertimosat ablero[j]
[i]para
nohacergrandescambi os,s
impl ement eescas icomocopi arypegarl oant eriorsol
o
quel edamosvuel t
al asvariablesparaquecompruebel ascolumnaspri meroycuent e
lasrepeticionesen lasmi smas.
..cree2 variablesv1 yv2 paradi f
erenciarlas,pero
hacen bas i
cament elomi s
mo,s on contadores .
..quedaasientoncesesapart equees
similar:

f
or(i
ntj=0;j<3;j ++)//Col
umnas
{
i
ntv1 =0;
i
ntv2 =0;
f
or(inti=0;i<3;i ++)
{
if
(tablero[
j][i]==0)
{
v1++;
}
els
ei f
(tablero[j
][i
]==1)
{
v2++;
}
if
(v1 ==3)
{
ganador=1;
}
els
ei f
(v2 ==3)
{
ganador=2;
}
}
}
Ahorasimplementet enemosquedecirleal amaqui naquecompruebel ases
quinas,si
l
asesqui
nasdelt abl
eroopuestasvalen igualad1 ent onceselj
ugadorhi
zodiagonal,
tenemos2 posi
blesdiagonal
esasiques eríamuybas ico:

Bueno,es
tofueikiysufin des emanadef eri
adohaciendoparalagente,POWER TO
THE PEOPLE!!
!.Vamoslocos,es peroquel
essirva,arockearhermanos
,mealegra
muchoquehayan ll
egadohas t
aacá.
LA LOGI
CA Y QUE RAYOS HAREMOS
Hoyaprenderemosbas icamenteacrearnuestroEditordeMapasquenosservi
rápara
crearcualqui
erjuego,yluegol
oconvertiremosen un Edi
tordeMapasparacrear
nuestrojuegoArkanoidlocualtambien l
esmostrarécomohacer.

Lesexpli
caréprimerocomonosvamosamanej arparaqueent i
endan haciadonde
voy:paraloquequeremoscrearneces i
tamosaprender3 cosasnuevas,novamosa
añadirmuchoal oquees t
uvimosviendo..
.primeroquenadavamosaaprenderl as
funci
onesofst
ream yi f
stream quenospermi ti
ran guadareltextoquequeramosen
un archi
vodet exto,yluegoleereltextodesdenuestroprogramaaccedi endoa
dichoarchi
vo.
CREANDO UN SI
STEMA DE COORDENADAS
Bueno,manosalaobra.LoprimeroquevamosahacerparacrearelEdi
tordeNi
vel
es
esemplearl
ass
igui
entesli
brerí
as:

#i
ncl
ude<ios
t ream>
#i
ncl
ude<coni o2.h>
#i
ncl
ude<cstdl i
b>
#i
ncl
ude<unist d.h>
#i
ncl
ude<fst
ream>//Headerf
stream

Comol oprimeroquevamosacreareselEdi tordeMapas ,tenemosqueconocerl a


lógica.Comos abí
amosaldi bujaralgoen elmapal ohacíamoscon coordenadasX eY.
Ent onceslapantall
adeal gunaf ormaes t
ácompues t
aporcoordenadasX eY. En cada
coordenada,os eaporejempl oX23,Y15,encont raremosdi f
erentesdatos.
..s
ien esa
coordenadapus imosun punt o,entoncespodemosdeci rqueX23,Y15 t i
eneun punt o.
As ícon cadaunadel ascoordenadas .Entonces,¿
cómopodemosrepres entartodal a
pant all
a,querecordemost i
eneALTO 25,ANCHO 80 ( pordefect
o)?.
Loqueharemosescrearunavari ablededosdi mensi
ones,yoen micas olall
amaré
mapa...es
tavariablecont endraen lugardef i
lasycolumnas,lascoordenadasX eY dela
pantall
a,yelvalorqueal maceneen cadaunadees tasseráloquees tádibuj
adoen di
cho
espaci
o,os eaun carácterquepuedes erun punto,una'O',un 8,cualqui
ercaract
erque
senosocurramet er.
..quedaríadeclaradaas
í:

charmapa[80][
25]
;//Escharpor
queal
ojaracaract
eresen cadaes
paci
oo"
cel
da"
//dei
nformaci
on

mapa[
40]
[13]='
I'
;
1)Us
abamosl
afunci
on gotoxy(
)paradeterminarl
ascoordenadasdondes
ees
cri
bía.
2)Us
abamosl
afunci
on cout<<paraes
cri
bir.
Entoncescomovamosaes cribirtodosloslugaresdelmapa,os ea80x25 (2000 lugares
)
noveol aconvenienci
adeponergot oxy2000 veces..
.loqueharemosesus arelrepeti
dor
For,pararecorrerlas80 posici
onesX,porl os25 espaci
osdelejeY.
..sirecordamoslo
haci
amosas í
,met i
endoun repetidordentrodeot ro:

for(i
nti=0;i<80;i++)
{
f
or(i
ntj=0;j<25;j++)
{
gotoxy();
cout<<;
}
}

got
oxy(
i,j
);

mapa[
i][
j];
Entoncesanues
trocoutledecimosquequeremosquei mprimacadaposi
cion act
ual
,si
es
távacioimpri
miraun espaci
ovaci
o,sitieneun datoal
ojadoent
oncesi
mpri miraese
dato:
cout<<mapa[i
][j]
;
ESCRI
BIENDO FI
CHEROS,ARCHI VO
DE TEXTO MEDIANTE OFSTREAM

Bueno,ahoraquehemosvi st
oquenuest ros
ist
emadecoordenadasf unciona,s evealgo
mediocreclaro,perovamosaavanzardeapocoparaqueus tedesal
líen cas aenti
endan,
siust
edes,en casa,ent
iendan,si
.Locopadodees tostext
oseshabl arsolo.En fin,l
oque
haremosahoraeshacerquet odonuestromapas eguardeen un archivodet extopara
masadel antepodercargarnuestromapades deesearchivo.Paraesout il
izaremosla
funci
on ofst
ream paraguardarnuestromapacomoarchi vomapa1. txt

of
stream mapa1(
"mapa1.
txt
");//Abri
mosmapa1.
txtmodoes
cri
tura
Ahoraquees tadeclaradoyabi ertoelarchivomapa1.txtmedi
antenuestropunteroo
variabl
emapa1 delt ipoofs
tream,t enemosquedecirl
equeesloqueguardaremosen
él.Haymuchasf ormasdepas arlelosdatos
,perocomol oquequeremosespasarleel
contenidodetodonues tromapacoordenadaporcoordenada,t enemosquevolvera
crearentoncesun buclequerecorrat odaslaspos
ici
onesdemapa,las2000:
f
or(i
nti=0;i<80;i++)
{
f
or(i
ntj=0;j<25;j++)
{
mapa[i
][j
];
}
}
Peroestos ol
orecorreríalasposici
ones,nol ees tamosdi ci
endoquel asponganies cribani
nadaen ni ngun l
ado,s erí
an datosques eleen ypi erden.Entonces,¿comohacemos
ahora?.
..ok,levamosadeci rquenues travari ableopunt eromapa1 delt ipoof
stream
reci
biracomof lujodeent rada(os eaescri
bi raen s uconteni
do)eldat odemapa[ j][i],o
seavaat omares evalor..
.paradecirl
ees olohacemoscon <<ali gualquehaci
amoscon
cout,yaquees es i
mbol oindicaelfl
ujodeent radaos al
idadedat os( s
olocomocuri osidad
telodigo),yquedaríaas i
:

mapa1 <<mapa[j]
[i];//Es
cribeen mapa1 (
alcuall
ecorres
pondemapa1.
txt
)el
//val
oral
ojadoen l
avariable

mapa[
i][
j]

mapa1.
clos
e()
;

//Guardarmapa

voi
d guardar_
mapa(
)
{

ofstream mapa1( "mapa1. t


xt"
);//Abri
mosmapa1.
txtmodoes
cri
tura
for(inti=0;i<80;i ++)
{
f
or(intj=0;j<25;j ++)
{
mapa1 <<mapa[ i
][j];
}
}
mapa1. cl
ose(
);//Cerramosescri
tura
}
LEYENDO FI
CHERO CON I
FSTREAM

voi
d car
gar_
mapa(
)
{

i
fst
ream mapa1(
"mapa1.
txt
");//Abri
mosmapa1.
txtmodol
ect
ura

¿Comohacemosparaquel eaelarchivodesdeelprincipi
ohas t
aelfi
nal?,en cual
quier
casohayunaf unci
on l
lamadaeof
()ques i
gnifi
caEND OFFI LE oFINALDELARCHI VO,
lacualdevuel
veVERDADERO s is
ellegoalfinalofals
os ino.
..ent
oncesledecimos
"Mient
rasnoes t
emosen elfi
naldelarchi
vo"blablabla..
.paraesoloponemosas i:

whi
le(
!mapa1.
eof
()){//Mi
ent
rasnos
eaelf
in delf
icheromapa1 ent
onces
{

f
or(
inti=0;i<80;i
++)
{
f
or(
intj=0;j<25;j
++)
{
mapa[i
][j
];
}
}
Ahoracomovemosrecorreracomomenci onetodoslosespaci
osdemapa[ ][]peronada
mas ,ahinodi cequeleas ignemoselvalordeltextoninada.Paraobt enerelvalordel
textohaymuchi si
masmaneras ,lopodemoshacerl i
neaporl i
nea,peroen micas o
comol oquequeremosesguardarcaract erporcaracter,oseacadaletra,usamosl a
funcion get(
)quesigni
ficaobt eneryloquehaceesobt enercaracterporcaracterei r
increment andosuposicion alas i
gui
ente.Quedarí
aas í
:

Sol
orestarí
acerrarl
alect
uraen elf
in denues
traf
unci
on,yl
ohacemoscon l
afunci
on
cl
ose(
):
mapa1.
clos
e()
;//Cerramosl
ect
ura

Loquet enemosquehacerademasesagregarl
ealpri
nci
piol
afunci
on cl
rscrparaque
cadavezquevamosacar garun nuevomapas el
impi
elapantal
lacon l
asposi
ciones
viej
as:
cl
rscr(
);

Asiquedanues
trafunci
on decar
gacompl
etaquepodemosl
lamarcuandos
enosocurra
l
asvecesquequeramos:

//Car
gamapa

voi
d car gar_mapa()
{
cl
rscr()
;
i
fstream mapa1( "
mapa1. txt")
;//Abrimosmapa1.txtmodol ect
ura
whi l
e(!
mapa1. eof
()){//Mi ent
rasnoseaelf
in delf
ichero
f
or( i
nti=0;i<23;i ++)
{
f
or( i
ntj=0;j<78;j ++)
{
mapa1. get
(mapa[ j]
[i])
;
}
}
}
mapa1. cl
ose()
;//Cerramosl ectura
}
//Act
ual
izarmapaen cadavuel
ta

void act
ualizar_mapa()
{
for(
inti=0;i<80;i ++)
{
for(
intj=0;j<25;j ++)
{
gotoxy(i
,j)
;//Pos ici
on deescri
tura
cout<<mapa[ i][
j];//Dibuj
aelval oren di
chapos
ici
on
}
}
}

act
ual
izar_
mapa(
);

voi
di nici
ar(
)
{
//Vaciamosvectordelmapa
for(i
nti=2;i<23;i ++)
{
f
or(i
ntj=2;j<78;j ++)
{
mapa[j
][i
][0]='';
}
}
}
Ahoradebeserunadelasprimerascos
asqueej
ecut
aremosen nuestromai n,yaqueni
bi
en car
gaelprogramaqueremosun mapali
mpioycon dat
ost rabajabl
es:

i
nici
ar(
);

Puesbi
en,t
odomuyboni to,ahoraempecemosadarleformaanuestroprograma.
Vamosamet eren elmain elbool
eanogameOvercomos i
empreparadeterminarque
hast
aquenos eaverdaderaeljuegosegui
rácorri
endounayotravezyejecutandos
e:

boolgameOver=f
als
e;

whi
le(
!gameOver)
{

}
Ahoral oquequi eroeshacerquecuandoelus uari
opres i
oneF5 elmapas eguarde,y
cuandopres i
oneF7 elmapas ecargue,os ealoqueharáF5 esl l
amaral af uncion
guardar_ mapayF7 car gar_mapa.Ent oncesen nuest
rocondi ci
onalwhi ledondes e
repiten nuestrosprocesosbás icosdeljuegovamosadeci rl
e"SIsepres i
onóunat ecla
entoncesl l
amaral afuncion responder_event
o",ycrearemosunaf uncion l
lamada
responder_eventoques erviraparares ponderacadat eclapres
ionadaen cadacas o.
Primerament eent oncesvamosaponeres eSisepresi
onoent onces.
..en elwhi l
e,de
estaf orma:
i
f(kbhi
t()
)res
ponder_
event
o()
;

Y ahoravamosacrearnues
traf
unci
on res
ponder_
event
o()
:

voi
d res
ponder_
event
o()
{

Perfecto,dentrodees t
af uncion tenemosquedetectarquetecl
asepresionoypara
cadacas oleasignamosunares puestadif
erent
e,estolohaci
amoscon getchquenos
devuelveelcodigodel atecla,ys iloponemosen un swi
tchpodemosselecci
onarcada
casodees tarespuest
a:

s
wit
ch(
get
ch(
))//Obt
enercodi
got
ecl
apres
ionada
{

}
Ahorat enemosquedeci
rleques isepres
ionaF5 l
lamealaf uncion guardar_
mapays i
sepresi
onaF7 ll
ameal af unci
on car
gar_mapa,paraes
todebemoss aberqueelcodi
go
ASCIIrecibi
dodeF5 es63,ydeF7 65,porl otantoquedaría:

case63://F5
guardar_
mapa()
;
break;

case65://F7
cargar_
mapa()
;
break;
Nues
traf
unci
on deres
ponder_
event
o()quedarí
amoment
aneayf
unci
onal
ment
eas
i:

switch(
getch(
))//Obt
enercodi
got
ecl
apres
ionada
{
case63://F5
guardar_mapa()
;
break;

case65://F7
cargar_
mapa()
;
break;
}
Tenemosqueteneren cuent
aqueelCurs
oroPunt
oquemoveremosen l
apant
all
a
ti
ene4 atri
but
os:

-Posici
on X
-Posici
on Y
-Caractercon elquel
omos tramosen pantal
laografi
camos
-Colorcon elquelograf
icamos(si
,es
tol overemostambien)
.
structCursor
{
intposX;//Posicion X
intposY;//Posicion Y
charpersonaje;//Figura
charcolor;//Color(tomavaloresdecaráct
eres,nonumeri
cos
,luegol overemos
)
}cursor;//Declaramoscurs
orquepos eeratodoslosdat
osdelaestructuraCurs
or

Ahoral etenemosquedarl aposici


on i
nici
alyelcaracteri
nici
alquel
orepresentará;lo
delcol
oraun nol ousaremosasiquenol eas i
gnaremosdatoporelmoment o.Ent onces
dentrodelmai n yaledaremoslosdatosinici
ales
,comoqueremosqueseencuent reen
elcentroelcursor,l
ediremosqueaparezcaen 40X,13Y:
curs
or.
pos
X =40;
curs
or.
pos
Y =13;

curs
or.
pers
onaj
e='
ß';

Ahoratenemosquedi
bujaranues
trocurs
oren pant
all
a,paraes
ovamosacrearuna
f
uncion l
lamadadi
buj
ar_
curs
or:

//Di
buj
adodelcurs
or

voi
d di
buj
ar_
curs
or(
)
{

Nues
traf
unci
on dedi
buj
adodelcurs
orcompl
etaquedaas
i:

//Di
buj
adodelcurs
or

voi
d dibujar_cursor(
)
{
gotoxy(cursor.pos
X,curs
or.
pos
Y);
cout<<cursor.pers
onaje;
}
whi
le(
!gameOver)
{

i
f(kbhi
t()
)res
ponder_
event
o()
;

di
buj
ar_
curs
or(
);

void mover_cursor(
)
{
switch(
getch())//Obtenercodi
got
ecl
apres
ionada
{
case63://F5
guardar_mapa( )
;
break;

case65://F7
cargar_
mapa()
;
break;
}
}

Lasf
lechasdi
recci
onal
espueden t
omarl
oss
igui
ent
escodi
gos
:

75:I
zquierda
77:Derecha
72:Arriba
80:Abajo
case75://FlechaI
zqui
erda
cursor.
pos
X -=1;
break;

case77://FlechaDerecha
cursor.
pos
X +=1;
break;

case72://Arri
ba
cursor.
pos
Y -=1;
break;

case80://Abaj
o
cursor.
pos
Y +=1;
break;
Ahoraadi
cional
ment
eleagregamosquecon ESCAPE (
códi
go27)elprogramaf
inal
ice:
cas
e27://Es
cape
exi
t(1)
;
Siprobamosnuestroprogramaveremosquenuest
rocursors
emueveef
ect
ivament
econ
l
asflechas
,perovemos2 compli
cacionesodes
perf
ect
os:
whi
le(
!gameOver)
{

us
leep(
20000)
;//Nues
tro"
FPS"

//Limpi amoss olol azonadeul t


imaposicion
gotoxy(curs or.
pos X,cursor.
posY);
cout<<mapa[ cursor.posX][curs
or.pos
Y][
0] ;
//Det ect amost eclado
if
(kbhit() )mover_ cursor()
;
//Dibuj amospos ici
on actualcursor
dibujar_cursor();
}

EDI
TANDO E I
NSERTANDO OBJETOS
EN ELMAPA (
MAPEANDO)

voi
d agregar_
obj
eto(
)
{

}
Lounicoqueharaagregarobj et
oviendol alogi
caesguardaren l ascoordenadasde
mapa[][]dondeseencuentreen es
emoment oelcursor,guardaraall
icomocaracter
eli
conoactualdelcurs
or,os eaen es
t ecasoelcuborepres entadocon elsi
mboloß.
Comot odosest
osdatoslostenemoss erí
aunacos at an si
mpl ecomoes ta:

mapa[curs
or.pos
X][
curs
or.
pos
Y]=cursor.
pers
onaj
e;//Guardaßen l
a
//pos
ici
on demapadondeestaelcurs
or

Quedarí
aas
i:
voi
d agregar_
obj
eto()
{
mapa[cursor.
pos
X][curs
or.
pos
Y]=curs
or.
pers
onaj
e;
}

cout
<<mapa[
curs
or.
pos
X][
curs
or.
pos
Y][
0];

case'\r'
:
agregar_obj
eto(
);
break;
//Si
mbol
osparaCurs
or

voi
d modi
fi
car_
pers
onaj
e()
{

Comoquieroquehaya12 s i
mbolosparaelegi
r,pri
merocreareunavari
abl
eglobal
l
lamadapersonaj
eActuall
acualcontendraun numero.Es
t enumeroeselnumerode
"pers
onaj
e"queestaraact
ivo,s
ipresi
onamosTAB aument ara,s
iendoal
goasimili
sta:
0:ß
1:.
2:-
3:O
4:o
5:|
6:_
7:@
8:8
9:
10:$
11:#
12:

Sol
obas t
ariadeci
rlequeparacadacas
eseguneelval
ordepers
onaj
eAct
ualent
onces
modif
icaremoscursor.
pers
onaj
e,as
iquelohacemosasi:

//Si
mbol
osparaCurs
or

voi
d modi
fi
car_
pers
onaj
e()
{

switch(
personaj
eActual
)
{
case0:
cursor.
pers
onaje='ß';//Bl
oque
break;

case1:
cursor.
pers
onaj
e='
.
';//Rocas
,di
sparo,
algo
break;

case2:
cursor.
pers
onaj
e='
-';
break;

case3:
cursor.
pers
onaj
e='
O';//Bol
agrande
break;

case4:
cursor.
pers
onaj
e='
o';//Bol
achi
ca
break;

case5:
cursor.
pers
onaj
e='
|'
;//Pared l
ateral
break;
case9://Tab
personajeActual++;
modi f
icar_pers
onaje()
;
break;

case9://Tab
if
(personajeActual!=12)
{
personajeActual++;
}
els
e
{
personajeActual=0;
}
modi f
icar_pers
onaje()
;
break;
CREANDO I
NTERFAZ (
GUI
)

f
or(i
nti=3;i<78;i++)
{
f
or(
intj=3;j<23;j++)
{
voi
d di
buj
ar_
gui
()
{

//BordeSuperi or
for(inti=0;i<77;i ++)
{
mapa[ i
+2][2]
[0]='
ß';
gotoxy(
i+2,2)
;
cout<<"
ß";
}

//BordesLat erales
for(inti=0;i<21;i ++)
{
mapa[ 1][i
+3] [
0]='ß';
gotoxy(1,i
+3);
cout<<"ß"
;

mapa[ 79][i
+3][
0]='
ß';
gotoxy(79,i
+3)
;
cout<<"ß"
;

//BordeI nferi
or
for(inti=0;i<77;i ++)
{
gotoxy(
i+2,24);
cout<<"
ß";
}
}

Lepodemosagregaranues
trafunci
on quedi
buj
eelt
ext
odedes
cri
pci
on paranues
tro
edi
torarri
bacomovimosen elej
emplo:
gotoxy(1,1);
textcolor(WHI TE);
cout<<"TAB:Cambi ar- ENTER:Insert
ar- F5 Guardar- F7 Car
gar-
0/9 Color" <<endl;//Es
paci
oini
cialparamenu
di
buj
ar_
gui
();
Ahoraquet enemosnuestraGUI,funci
onaperfect
amente,peronecesitamosdeci
rlea
nuestroprogramaquequeremosquenues trocurs
ornos obrepas
eestaGUI ,quenose
puedas al
irdel osl
imites
.Paraesovolvemosamover_cursoryl eponemosun parde
condici
onalesquedeterminan l
osl
imi t
esextremosdecadamovi miento,comovimos
en l
osapart adosanteri
ores
:

cas
e75://Fl echaIzqui
erda
i
f(curs
or.pos X!=2)//Siesdi
sti
ntoa2 l
apos
ici
on xs
emueveal
aizq,
//s
inoniapal o
{
cursor.posX -=1;
}
break;

case77://Fl echaDerecha
i
f(cursor.
posX! =79)//Siesdi
sti
ntoa79 l
apos
ici
on xs
emueve,s
ino
//niapal o
{
cursor.
pos X +=1;
}
break;

case72://Arriba
i
f(curs
or.pos
Y! =3)
{
cursor.
posY -=1;
}
break;

case80://Abaj o
i
f(curs
or.pos
Y! =23)
{
cursor.
posY +=1;
}
break;
GRAFI
CANDO EN COLORES

Ahoraquet enemost odaes t


amagi aleagregaremosal gomásanues t
roeditor,un
úl
t i
modet all
e:colores.Paragrafi
carun caractercon col
orl
oquet enemosquehacer
esdecirlealprogramacon quecol orestamosimpri miendoen pantall
a,yblancoes
pordef ect
o...est
os elodeci moscon l
af unci
on text
coloryentreparént es
isl
eponemos
en ingl
éselcol orquequeremosdeunagamaquet enemosparael egi
r.Elproblemaen
estepunt oesquenues travariabl
emapa[ ][]al
oja1 solodat
oqueeselcaract erde
dichapos i
cion,paraagregarmasdat ostendri
amosqueconvert irl
aen unavari abl
ede
3 dimens i
ones ,si
endoas í:

mapa[
80]
[25]
[2]
;

mapa[
80]
[25]
[0]='
O';
mapa[
80]
[25]
[1]='
w';
//Guardarmapa

voi
d guardar_
mapa(
)
{

ofstream mapa1( "mapa1. t


xt")
;//Abrimosmapa1.
txtmodoes
cri
tura
for(inti=0;i<78;i ++)
{
f
or(intj=0;j<23;j ++)
{
mapa1 <<mapa[ i
][j][
0];//Figura
}
}
mapa1. cl
ose(
);//Cerramosescritura
}
cas
e54://6 Fucs
ia
textcol
or(
MAGENTA)
;
cursor.
col
or='
m';
break;

case55://7 Gri
s
textcol
or(
8);
cursor.
col
or='G'
;
break;

case56://8 Azul
textcol
or(
1);
cursor.
col
or='b'
;
break;

case57://9 Negro
textcol
or(
0);
cursor.
col
or='n'
;
break;
//Act
ual
izarmapaen cadavuel
ta

voi
d act uali
zar_mapa( )
{
f
or(inti=3;i<78;i ++)
{
for(intj=3;j<23;j ++)
{
gotoxy(i,
j);
modi fi
car_col
or(mapa[i][
j][
1])
;//ACA LA MODI
FICACI
ON DE COLOR SEGUN
ELDATO ORI GINAL
cout<<mapa[ i
][j]
[0];
}
}
}

Basicamentecon es
ohemoscreadonues
troedi
tordemapas
.Nohaymasnadaque
agregar,nues
troeditores
tal
is
to.
ADAPTANDO EDITOR A EDI
TOR DE
NIVELES PARA ARKANOID

Bueno,t enemoselEditordeMapas .Ahoraqueremosquenues troEdit


ordeMapas
est
éori entadoalArkanoid yaqueeseljuegoquedesarrol
laremos.Bas
icament
een
nuestroeditornohayquecambi armucho.Simplementetengamosen cuenta2 cos
as
antesdeempezarparaverqueesl oquedeseocambiar:
-Nuest
roJuegoUt i
li
zaraBloquessemi
trans
parent
escomopueden apreci
aren el
di
bujo.
-Cadabloqueocupa3 cas
il
leros.

Primeroquenada,¿ cómodi bujamoslosbl oquessemi-transparentes


?..
.porun ladoes
fáci
l,es
tossegrafi
can con elsí
mbolo'°'l ocualyaprogramamosnues t
roeditorpara
queunodes uscaracteresseaes e,f
in delproblema1. Ahoravamoscon elprobl ema2,
elcualsinosj
odeun poco.Loquevamosahaceresquealgraf icarun bl
oqueas us
cost
adosaparezcan (
del aderechayl ai zqui
erda)otrosbloquesmas ,parall
egara3,
queesloqueocupacadabl oquecomopodemosapreci ar.
whi
le(
!gameOver)
{

us
leep(
20000)
;//Nues
tro"
FPS"

//Limpiamossol
olazonadeult
imapos
ici
on
gotoxy(
curs
or.
posX,
curs
or.
pos
Y);

i
f(mapa[ cursor.
posX-1] [curs
or.posY][0]=='°')//Sil
apos ici
on anteri
orX esun
//bloqueent onces
{
modi f
icar_col
or(mapa[ cursor.pos
X-1] [
cursor.
posY][
1] )
;//Elcolordelbloquees
igualaldel aposant erior
cout<<mapa[ cursor.posX-1][cursor.
posY]
[0];//Dibujarun bloqueen l
apos i
cion
//act ual
}
voi
d act uali
zar_mapa( )
{
f
or(inti=0;i<80;i ++)
{
for(intj=0;j<25;j ++)
{
gotoxy(i,
j);
modi fi
car_color(mapa[ i]
[j]
[1])
;
cout<<mapa[ i][j]
[0] ;
if
(mapa[ i][j
][0]==' °'
)//DibujarBl
oque
{
gotoxy(i-1,j);
cout<<mapa[ i]
[ j
][0];
gotoxy(i+1,j);
cout<<mapa[ i]
[ j
][0];
i+=2;
}
}
}
}
CREANDO ARKANOI
D
Unavezquet
enemost
odol
is
toahoravamosacrearnues
troArkanoi
d.

Primeroquenadaintegramoslasli
breríasqueus
aremos,l
aúni caqueagreguéqueno
vimosafondoeswindows .
h,lacualagregoen es
tecas
opor quemepermi tegenerar
soni
dosbási
cosquequieroparamij uego:

#i
ncl
ude<ios
t ream>
#i
ncl
ude<coni o2.h>
#i
ncl
ude<cstdl i
b>
#i
ncl
ude<unist d.h>
#i
ncl
ude<fst
ream>
#i
ncl
ude<windows .h>
#i
ncl
ude<cti
me>

charmapa[80][
25][2]
;//Coordenadas- Col
ores
intpers
onaj
eActual
;

Voyaagregarotravari
abl
egl
obalparacont
arl
ospunt
osques
evan acumul
andoal
gol
pearl
osbloques
:

i
ntpunt
os=0;
s
tructCurs or
{
intposX;
intposY;
charpersonaj
e;
charcolor;
}cursor;

s
tructCurs or
{
intposX;
intposY;
charpersonaje;
charcolor;
}cursor,pelot
a;

s
tructCurs or
{
intposX;
intposY;
charpers onaje;
charcolor;
intdireccion;
}cursor,pelota;
Tambien di
bujaremosl
aGUI,porloquelafunci
on esl
ami
sma,s
oloquevamosa
modif
icareltextodelasi
ndi
caci
onesporelpuntaj
e

voi
d dibujar_gui
()
{
gotoxy(1,1);
textcol
or(WHI TE);
cout<<"Puntos:"<<punt
os<<endl
;//Es
paci
oini
cialparamenu

//BordeSuperi or
for(inti=0;i<78;i ++)
{
mapa[ i
+2][2]
[0]='
ß';
gotoxy(
i+2,2)
;
cout<<"
ß";
}

//BordesLat erales
for(inti=0;i<23;i ++)
{
mapa[ 1][i
+3] [
0]='ß';
gotoxy(1,i
+3);
cout<<"ß"
;

mapa[ 79][i
+3][
0]='
ß';
gotoxy(79,i
+3)
;
cout<<"ß"
;

//BordeI nferi
or
for(inti=0;i<77;i ++)
{
gotoxy(
i+2,24);
cout<<"
ß";
}
}

Comoelpuntajesevaai ractual
izandovamosacrearunaf
unci
on quedi
buj
eel
punt
ajeact
ual,estan s
enci
ll
acomos eve:

voi
d act uali
zar_punt aj
e()
{
gotoxy( 1,
1);//Dibujaren elbordesuperi
ori
zqui
erdo
textcolor(WHI TE);//Decolorblanco
cout<<"Punt os:"<<puntos
<<endl;//Val
ordepuntos
}
Ahoravamoscon l asigui
entemodi f
icacion,copi
amoslaf unci
on dibujar_
cursor,pero
comovemosmii deaesqueelcurs oropal et
adeljugadormi da5 es paci
os,ynues tra
funcion s
olodibujaba1.Ent oncesloquehacemosen di bujarcurs
oresdeci rl
equel a
posici
on actualdelcursor-2,-1,l aact ual,+1 y+2 sedibujeelcubodel apalet
a,de
formaqueocupamosl os5 espaci
os..
.ademasl easi
gnamoses tecarácteramapa,para
quepuedadet ect
arsequehayunapal et
aahiycuandopas el
apelotapuedarebot ar.
Quedaríaas i:

//Di
buj
adodelcurs
or

voi
d dibujar_cursor()//Di bujamosl os5 puntosdel apal
etadelj
ugador
{
gotoxy(cursor.posX-1,cursor.posY);
cout<<cursor.personaje;
mapa[ cursor.posX-1] [curs
or.posY][0]=cursor.
personaj
e;
gotoxy(cursor.posX-2,cursor.posY);
cout<<cursor.personaje;
mapa[ cursor.posX-2] [curs
or.posY][0]=cursor.
personaj
e;
gotoxy(cursor.posX,cursor.
pos Y)
;
cout<<cursor.personaje;
mapa[ cursor.posX][cursor.
pos Y]
[0]=curs or.
personaj
e;
gotoxy(cursor.posX+1,cursor.posY);
cout<<cursor.personaje;
mapa[ cursor.posX+1] [curs
or.posY][0]=cursor.
personaj
e;
gotoxy(cursor.posX+2,cursor.posY);
cout<<cursor.personaje;
mapa[ cursor.posX+2] [curs
or.posY][0]=cursor.
personaj
e;
}

voi
d dibujar_pelota(
)
{
gotoxy(pelota.pos
X,pelot
a.pos
Y);//Dibuj
aren pos
ici
on del
apel
ota
cout<<pelota.pers
onaje;//Elsimbol
odel apel
ota
}
//I
nteracci
on delt
ecl
ado

voi
d mover_
curs
or(
)
{

s
wit
ch(
get
ch(
))//Obt
enercodi
got
ecl
apres
ionada
{

case27://Es
cape
exi
t(1)
;

cas
e75://Fl echaIzqui
erda
i
f(curs
or.posX! =4)//Comomi
de5 l
apal
etaahoraell
imi
tet
ieneqt
eneren
cuent
aes o
{
cursor.
pos X -=1;

}
break;

cas
e77://Fl echaDerecha
i
f(curs
or.posX! =76)//Ell
imi
tet
ieneen cuent
aquel
apal
etami
de5,pores
olo
modi
fi
que
{
cursor.
pos X +=1;

}
break;

}
Losi
guient
equedebemoshacerescrearunaf
unci
on l
acuals
irvaparamoverl
abol
a
ylall
amaremosen nues
trobucl
eprinci
pal
.

voi
d mover_
pelota()
{
swi
tch(
pelot
a.direcci
on)//Segun elval
ordedi
recci
on moveral
abol
aen s
upos
ici
on
//X eY
{

case0://Arribaderecha
pelot
a.pos
Y--;//Mover1 arri
ba
pelot
a.pos
X +=1;//Mover2 al aderecha
break;

case1://Abajoizqui
erda
pelot
a.pos
Y++;
pelot
a.pos
X-=1;
break;

case2://Arribai
zqui
erda
pelot
a.pos
X-=1;
pelot
a.pos
Y--;
break;

case3://Abajoderecha
pelot
a.pos
Y++;
pelot
a.pos
X+=1;
break;
}
}
if
(mapa[ pelota.pos X][
pel
ota.posY][
0]! ='' )//Sielespaciodondees tabolanoesun
//espacioen bl anco
{
switch(pelota.direcci
on)//Segun ladi recci
on en qestefluyendolapelota
{
case0://Arri baderecha
if
(pelota.
posX ==78)//Sil apos i
cion esellimitedelejeX
{
pelota.
direccion =2;//Rebot ocont raelbordederecho,cambi ardirecci
on hacia
//arribaal ai zquierda
pelota.
posX-=1;//Di smi
nuilelapos ici
on en X en 1 por
ques inotraspasalapared
}
els
e//Sinoesell imiteX entonces
{
pelota.
direccion =3;//Rebot ocont rabordes uperiorocont rabloque,direcci
on abaj
o
aderecha
pelota.
posY+=1;
}
break;

case1://Abaj oIzqui
erda
if
(pelota.pos X ==1)//Siestaen elli
mi teizqui
erdoX
{
pelota.direccion =3;//Rebotoen l
ai zquierda
pelota.pos X+=1;
}
els
ei f(
pel ota.pos
Y ==23)//Siyendohaci aabajotocoelbordei
nferi
or
{
exit(
1) ;//Termi nareljuego,perdi
steman
}
els
e//Si no
{
pelota.direccion =2;//Rebotocon bl
oque
pelota.pos Y-=1;
}
break;

//Lomi
smoparacadacas
e
Comovemoseval uamosl osdiferentesrebotes,cadadi recci
on comohabi amosvi st
o
puederebot aren 2 di f
erenteslugares.
..ademási nclui
mosques ucedesilabol apas aa
lazonadef i
n dej uego.Ahoranosf alt
aagregaracadacas een part icul
arquel l
ame
aunaf unci
on quenospermi taromperun bl oquesiesquehayunoen élygenerarel
rebotecon elbloque,en lami smaf uncion quecrearemosl l
amadaromper_ bloques e
detectarasis etratadeun bl oquelocol i
sionado,peroparaes opri merovamosa
ll
amarl aen loslugarescorrespondientesdees tafunci
on quehi cimosrecien asino
tenemosquei ryvol ver.
..

//Det
ecci
on col
is
ion bol
a

voi
d mover_
pel
ota(
)
{

i
f(mapa[
pel
ota.
pos
X][
pel
ota.
pos
Y][
0]!
=''
)
{

switch(pelota.di
recci
on)
{
case0://Arri baderecha
if
(pelot
a.pos X ==78)
{
pelota.
direccion =2;
pelota.
posX-=1;
}
els
e
{
romper_ bloque();
pelota.
direccion =3;
pelota.
posY+=1;
}
break;

Ahoravamosaprogramarl af
unci
on deromper_
bloque,s
olohayquet
ener2 cos
as
en cuent
a,hay2 opci
ones
:

-Gol
peamosun bl
oquedecolorydes apareceelbloquej
untocon s
uspart
es.
-Gol
peamosun bl
oquegri
s,loscual
est i
enen 2 vi
das,porl
ocualalpri
mergolpe
cambiadecol
ornadamas .
gotoxy(pelota.pos X-1, pelota.posY) ;
cout <<"";
punt os+=100;//Aument arpunt osen 100
act uali
zar_punt aje()
;//Act ual i
zamospunt aj
e
}
}
els
ei f(mapa[ pel ot a.posX+1] [
pelot a.posY][
0]==' °'
)//Sialaderechadepos
ici
on
pelotahayun cubo
{
colisi
on =t rue;//Col i
sion verdadera
if(
mapa[ pel ota.pos X+1] [pelot a.
pos Y][1]==' G')//Siesgri
s.
..bl
ablabl
alomi s
mo
quearri ba
{
mapa[ pel ot a.posX+1] [
pel ota.posY][1]=' b';
modi fi
car_ col or(mapa[ cursor. posX+1][cursor.
posY]
[1])
;
gotoxy(pel ot a.posX,pel ota.pos Y);
cout<<"°";
gotoxy(pel ot a.posX+1, pelot a.
pos Y);
cout<<"°";
gotoxy(pel ot a.posX+2, pelot a.
pos Y);
cout<<"°";
}
else
{
mapa[ pelota. pos X+1] [pelota.pos Y][0]='' ;
got oxy(pelot a.pos X,pelota.pos Y);
cout <<"";
got oxy(pelot a.pos X+1,pel ota.pos Y);
cout <<"";
got oxy(pelot a.pos X+2,pel ota.pos Y);
cout <<"";
punt os+=100;
act uali
zar_punt aje()
;
}
}

//Agregarun el
separal
aspos
ici
onesres
tant
esyalf
inal
ali
zart
odosl
oscondi
cional
es
agregar:

i
f(col
isi
on)//Sicol isi
on esverdaderaalf
inaldel
oscondici
onal
es
{
switch(pelota.di
recci
on)//Generamosrebotemodif
icandoladi
recci
on del
apel
ota
{
case0:
pelota.
direccion =3;
pelota.
posY+=1;
pelota.
posX-=1;
break;
cas
e1:
pelot
a.direccion =2;
pelota.
pos Y-=1;
pelota.
pos X+=1;
break;

case2:
pelot
a.direccion =1;
pelota.
pos X+=1;
pelota.
pos Y+=1;
break;

case3:
pelot
a.direccion =0;
pelota.
pos Y-=1;
pelota.
pos X-=1;
break;
}
}
}

voi
dl i
mpi ar_pos i
cion()
{
//Limpi amoss ololazonadeul timapos icion
gotoxy(cursor.pos X,curs or.posY) ;
modi f
icar_color(mapa[ curs or.posX] [cursor.posY]
[1])
;
mapa[ cursor.pos X+2] [
curs or.posY] [
0] ='' ;//Borramoslos5 punt
osdel
apal
eta
cout<<mapa[ curs or.pos X] [
curs or.posY][0] ;
gotoxy(cursor.pos X+1,curs or.
pos Y);
mapa[ cursor.pos X+1] [
curs or.posY] [
0] ='' ;
cout<<mapa[ curs or.pos X+1] [
curs or.
pos Y][0];
gotoxy(cursor.pos X+2,curs or.
pos Y);
mapa[ cursor.pos X][curs or.pos Y][
0] ='' ;
cout<<mapa[ curs or.pos X+1] [
curs or.
pos Y][0];
gotoxy(cursor.pos X-1,curs or.posY);
mapa[ cursor.pos X-1] [curs or.posY] [
0] ='' ;
cout<<mapa[ curs or.pos X-1] [
curs or.posY][0];
gotoxy(cursor.pos X-2,curs or.posY);
mapa[ cursor.pos X-2] [curs or.posY] [
0] ='' ;
cout<<mapa[ curs or.pos X-1] [
curs or.posY][0];
gotoxy(pelota.pos X,
pel ot a.
pos Y);//Borramosl apelota
cout<<mapa[ pel ota.posX] [
pelot a.
pos Y][0];
}
srand(ti
me( NULL))
;//Tomal ahoradelrel ojcomoref
erenci
aparaelrand
textcol
or(WHITE);//Modificaelcolorabl anco
boolgameOver=f als
e;//Fin deljuegoesf al
so
cursor.
personaj
e=' ß'
;//Elcurs orseraun bloque
cursor.
posX =40;//Pos i
cion X deljugador
cursor.
posY =22;//Pos i
cion Y
pelota.
personaj
e=' *'
;//Graficodel apelota
pelota.
posX =40;//Pos i
cion delapel ot
a
pelota.
posY =21;

Ahorall
amamosal afunci
on dedibuj
adodeGUIparaempezar,car
gamoselmapa
ydefi
nimosl
adirecci
on delabol
a:

dibujar_gui();
cargar_ mapa( );
pelota.direcci
on =rand(
)%3;

Y ahoracreamosnues t
robuclewhil
ell
amandoal
asfunci
onesdeli
mpiezadeult
ima
posi
cion,detecci
on detecl
ado,movi
mient
odepel
ota,ydibuj
adodecursorypel
ota:

whil
e(!gameOver)
{
usleep(20000) ;//Nues
tro"
FPS"
l
impi ar_posi
cion(
);
frameBol a++;

i
f(kbhi
t())mover_
curs
or(
);
di
bujar_curs
or(
);
mover_pelot
a()
;

di
buj
ar_
pel
ota(
);
}
Yacon es
tot enemosnuestrogame;comol apel
otavamuyrapidopodemosdecirl
e
que"mover_pelot
a"seproduzcaporejemploen l
a4°vezques
eej ecut
eelbucl
e
whil
e..
.paraesoalprinci
piodelmain decl
aramos:

i
ntf
rameBol
a=0;//Cont
ador

Y ahoradondet
eni
amosmover_
pel
ota(
)en elbucl
elocondi
cionamosdees
taf
orma:

i
f(f
rameBola==4)
{
mover_
pel
ota(
);
f
rameBola=0;
}
PUNTEROS,NEW,
DELETEYVECTORES
DI
NAMICOS.
i
nt*cl
aveBanco;

Acáaprovechoparaens eñarteun t i
p cl
ásicodel aprogramaci ón..
.voshabrásvisto
quecuandodecl arasvariabl
es
sinol esini
ciali
zasun valorpueden t omarcual qui
ervaloralazardel amemori a.
Ent oncesnoqueremosquenues tropunt eroyades deelpri nci
pi oapunteaun valor
sibien luegol ediremoselval or,yaqueavecesés tedat oquet omaalazarpara
inicial
izarseen sucreación l
ous amoss in quererypodemosobt enerres
ultados
erroneosoi mprevi s
tosquenadat ienen quevercon nues t
rasint enci
ones.Asíquelo
ques ehaces iempreques ecreaun punt ero,esinici
ali
zars uespacioen memori a
diciendoqueapunt aaun es pacioNULL( NulooVací o)
..
.éstos ehacedel as i
gui
ente
formaycomodi j
eesparaevi tarerrores :
.
Dees taformanuest
roes pacioen memori arepresentadoporelpunt eropuedei r
tomandodat osdediferentesvariablessegún l
eas i
gnemos .Perotambién nuestro
punteropuedeserutili
zadodeot raf ormaquenot edij
e,podríamosdecirl
eno
sol
odedondeobt enemoseldat o,sinot ambién haciadondel oqueremosobt ener,
generandounasuertede" conector",porej emplos idij
eramoss ol
ocon vari
ablessin
punteros:

i
ntx,y;
y=20;
x=y;//X val
e20

Con un punteropodríamoshacerlomi smo,di


ciendoqueelpunt eroref
erenci
eaX
queesdondes e"al
macenaran"losdatosqueobtengaelpunt ero,yquelosobtenga
apuntandoal avariableY.Entoncesnoeslomi smohaci adondeapuntaelpunt ero
quelareferenci
a,yaquepodemospas arl
eunaref erenci
a(dondealmacenaremosel
dato)delas i
guient
ef orma:

intx,y;
int*punt ero1;
y=20;
puntero1 =&x;//Suespacioen memori
aeselespaci
odex,porloques uref
erenci
a
//esx
*puntero1 =y;//Apuntaalavariabl
ey,obt
eni
endos udat
oyllevándol
ohaciasu
//espaci
oen memoria(x).
Ahorayas abemosdecl
ararpunteroscuyamemori apuedes erprovis
oria,peropara
esotenemosqueverelúl ti
mopas oymáss enci
ll
o:eli
minarlas
.Paraes outil
izamosen
ellugarqueyades eamosconcl
uircon suusolapalabradeletesegui
dadeldat oa
el
imi nar,en és
tecasopodrí
amoseliminarelpuntero:

delet
epunteroCaract
er;//El
imi
naelpunt
erocaract
erj
unt
ocon s
ues
paci
oocupado
//en memoria
Loquevoyaexpl i
carahoraesalgoquesin punterosesal
goheavymet aldehacer.
Supongamosquequeremosqueelusuarioingres
eun número,elus uari
oingres
ael
5,yqueremoscrearun arrayovectorovariabl
edi mensi
onalcon esacant
idad
i
ngresada.
..bi
en,s
ihacemosestopodríamos:

i
ntvari
abl
e1[
5];//Vari
abl
equeal
oja5 dat
os

i
ntpers
onaj
es[
1];//Ladecl
arascomo1 yaquet
enesun pers
onaj
e
Luegoseteuneotropersonaj
ealratoquevasj
ugando.
..¿yahoraque?..
.cagas
te,
porquetuvari
abl
esol
oalmacena1 dat oynolapodesredimensi
onar.
..elej
emplo
esun as
coasíquetepongounomej or.
..

i
ntzerl
ings
[10]
;//Paraguardari
nfode10 uni
dades
Ahorabien,¿porquél i
mi tarnosa10 unidades?.
..s
icreamos11 yachaunuestro
programa,nos ervi
ría.
..t
us oluci
ón aut
omáticaserí
a"bueno,ent
oncescreemosuna
vari
abledimensionalde100" ,ok:

i
ntzerl
ings
[100]
;

i
ntguardian[
100];
i
ntoverl
ord[100]
;
us
uari
oMU[
1000]
;

Ahipodríamosguardar1000 us uariosdelMU,pero¿ ysinuest


roj uegoesun éxi
toy
l
ascuentaspasan de1000?...necesi
tamosvariabl
esdinámicasypunt o,podrí
adart e
milej
empl osmásperocreoqueyal ovesclaramente,esmuyút ilconsegui
runaf orma
decrearunavariabl
edimens ionalquelepodamosdeciren elmoment oeltamañoque
debetomarl amisma("elvector")
.
Paraes
t ohayunares puestaynoest an dif
íci
l:vari
ablesprovi
sori
as.Si
,comol o
vi
nimosviendo,ahorasolonosfaltarí
as abercomocrearcon new unavari abl
e
di
mensional,l
ocualess enci
ll
o,si
mpl ement ealfinalleagregamoslacantidad dela
di
mension ovector,porejemplodeés taforma:
intvalorIngres ado;//Creamosvariableparaaloj
arvaloringres
adoporusuario
cin>>val
orI ngresado;
char*vari ableDinamica=NULL;//Creamospunt ero,datoen memoriavacio
variabl
eDi nami ca=new char[ val
orIngres
ado]
;//Punt eronuevocaract
ervectorde
//espaciosi gualavalorIngres
ado

Dees
taf
ormat
endrí
amosl
omi
smoque:

i
ntcharvari
abl
eDi
nami
ca[
5][
3];

structusuari
os//Es
tadodes
elecci
on depal
abras
{
char*clave=NULL;
};
s
tructus
uari
os*us
uari
o567;

us
uari
o567.
clave='
x';

Ladi f
erenciaquevamosamenci onaroelpequeñodetall
equequeríades tacaresque
cuandout il
izamoses
paciosdememoriamediantepuntero,os eacreamosun obj et
o
con punterodeunaes t
ructura,l
aformadeaccederal osatri
butosos ub-objet
osdel
mismos ehaceen lugardecon punto(.
)lohacemoscon eloperador->( ->).

Ej
empl
o:
us
uari
o567->cl
ave='
x'
CREANDO JUEGO DELAHORCADO

uns
igned s
hortvi
da=0;
structpalabras//Decl
aramoselt
ipodees tructuraomol deparanues traspalabras
{
char**palabra;//Decl
aramosunavari abl
echarcuyot amañovect ori
al[ ]aun no
//creamosodef ini
mos
}palabra1;//Creamoselobj
etopalabra1,pert eneci
ent
eal aestructurapal abras

i
ntl
ongi
tud_
pal
abra=0;//Cant
idad decaract
eresdel
apal
abra
Ahoravamosacrearun archivodetext
oquel l
amaremosahorcado.
txtyen elque
pondremosaproxi
madament eunas10 palabrasunadebaj
odeot ra,paral
eerlinea
porli
nealuegoyquenuestroprogramas el
ecci
oneuna.

Bueno,l l
egol ahoradel apartedi f
íci
l,vamosaobtenerlapalabradesdeelarchi
vo
det extoyas ignarl
aanues t
roobj etopalabra1,yadandolasdimensi
onesydemásde
l
oquenost oquealazar.Paraes ovamosacrearent oncestodoestodentrodeuna
función l
lamadaobt ener_
palabra()
:
voi
d obt
ener_
pal
abra(
)
{

i
ntnumeroPal
abra=rand(
)%10+1;//10 PALABRAS,ELEGI
R UNA ALAZAR

char*palabraProvi
s=NULL;
palabraProvi
s=new char[
20]
;
l
ongi
tud_
pal
abra=s
trl
en(
pal
abraProvi
s);

pal
abra1.pal
abra=new char*;//Creamospri
meradimension
pal
abra1.pal
abra[
1]=new char[longi
tud_
pal
abra]
;//Segundadi
mens
ion equi
val
ea
l
alongit
ud delapalabra
pal
abra1.pal
abra[
0]=new char[longi
tud_
pal
abra]
;//Segundadi
mens
ion equi
val
ea
l
alongit
ud delapalabra

Ahoraprocedemosacopi
arlapal
abra,paraesolohacemoscon l
afuncion s
trcpy
queserí
aunaabrevi
aci
ón i
ngl
esadelapalabrast
ringcopy(copi
artext
o)ynoscopi a
Y ahoradiras¿peroporquécopi as
telapalabra2 veces
?..
.¿noeraqueunoeran los
_
?...cl
aro,locopié2 vecesparaqueobtengaeltamañodel apropi
apal abraunade
l
asdi mensiones
,ahoravamosareempl azarlapal
abraporl os_entonces:

for(i
nti=0;i! =longit
ud_pal
abra;i
++)//Repetirhas
taqueiseaequi
val
ent
eallargo
//del apal
abra
{
palabra1.
palabra[
1] [
i]='_
';//Reemplazaelcaract
ernumeroideladimensi
on 1 por
//"_"
}

Yapodemosel
imi
narent
oncesl
apal
abraprovi
sori
a,l
iberarl
adel
amemori
a:

del
etepal
abraProvi
s;

s
rand(
time(
NULL)
);
Entoncespri
merovamosacrearl afuncion di
bujar_casi
ll
ascomomencionaba,y
vamosacrear2 vari abl
esquecont engan l
apos i
cion dondeiremosdi
bujandocada
caract
er,entoncesyadibuj
aremoscadacaract errecorriendotodanues
travari
abl
ey
avanzandoposici
on porposi
cion:

voi
d di
buj
ar_cas
il
las
()
{
i
ntposi
cionX =4;//Empezaremosdes
de4X con nues
tropri
mercaract
er
i
ntposi
cionY =4;

for(inti=0;i<l ongitud_pal
abra;i++)//Repetirmientrasiseamenorallargode
//lapal abra
{
gotoxy(posici
onX, pos
ici
onY);//I
ral aposi
cionX,4Y
cout<<palabra1.palabra[1]
[i]
;//Dibujarcaracternumeroidel adimensi
on 1
posici
onX=pos i
cionX+2;//Aument arposi
cionX en 2 paradi
buj
arelproxi
mo
//caract eraladerecha
}
}

Lesrecomiendocopiarl
afunci
on dedi
buj
ar_
gui
()del
osej
erci
ciosant
eri
oresparaque
tengaciert
aeleganci
a.
voi
d proces
ar_tecl
a()
{
charcaract
er;
caract
er=t oupper(get
ch(
));
}
voi
d di
buj
ar_
chabonci
to(
) case4:
{ //Brazo2
gotoxy(
41,13)
;
switch(
vida)//Detect
arcuant
oval
e cout<<"
-";
//lavariablevi
da gotoxy(
42,13)
;
{ cout<<"
-";
case1://Sival e1 break;
//Cabeza
gotoxy(40,12); case5:
cout<<"
O" ; //Pierna1
break; gotoxy(39,14)
;
cout<<".
";
case2: gotoxy(39,15)
;
//Estomago cout<<"|
";
gotoxy(
40, 13)
; gotoxy(39,16)
;
cout<<"
|"; cout<<"|
";
gotoxy(
40, 14)
; break;
cout<<"
|";
break; case6:
//Pierna2
case3: gotoxy(41,14)
;
//Brazo1 cout<<".
";
gotoxy(
39,13)
; gotoxy(41,15)
;
cout<<"
-"; cout<<"|
";
gotoxy(
38,13)
; gotoxy(41,16)
;
cout<<"
-"; cout<<"|
";
break; break;
}
}
boolexi
to=f
als
e;//Fl
agobanderaquenoss
ervi
raparai
dent
ifi
cars
inues
tral
etra
//est
aono

f
or( i
nti=0;i<=l ongi
tud_palabra;i++)//Mientrasiseamenoraelt amañodela
palabra
{
i
f(caract
er==pal
abra1.palabra[
0] [
i])//Sielcaract
eresi
gualalcaract
eren l
a
posici
on idel

vect
or
{
palabra1.palabra[
1][i
]=caracter;//Modi
fi
camosdi
mens
ion 1 caract
eri(
_)
porlaletra
exito=t rue;//Exitoesverdadero
}
}
if
(!exito)//Siexitoesf al
so
{
vida++;//Vi daoi ntentosaument aen 1
dibujar_chaboncito()
;//Dibujamoselahorcado
if
(vida>5)exi t(1);//Siintentamosmasde5 vecesperdi mos
}
else//Siexi toesverdadero
{
di
bujar_casi
ll
as();//Vol
vemosadi bujarpalabra[
1]
i
f(s
trcmp( palabra1.pal
abra[0],palabra1.
palabra[1]
)==0)ini
ciar_
juego(
);
//¿Ganamoso

no?
}

Ahoras ol
onosf al
tacrearl af
uncion quei
nicalapartida(nosgeneral aspal
abras
,
nosdibujalascasi
ll
asinici
almenteydemas ).
..s
el l
amaraini ci
ar_
juego(
)comot e
mostreys oloseencargaradel l
amaral asfuncionesi
nici
alescomot emencioné
reci
en:

voi
di nici
ar_ j
uego()
{
cl
rscr();//Limpi amospant al
la
dibuj
ar_ gui()
;//Di buj
amosbordes
obtener_ pal
abra( )
;//Obtenemospalabra
dibuj
ar_ casi
llas
();//Dibuj
amoscasi
ll
as_
vi
da=0;//I ntentos=0
}
Recordátenersiemprealpri
ncipi
opuestaslasli
brerí
ascorrect
as,yopuseun mont
ón
porquenorecuerdoyacualesnout i
li
cémientrasloibaarmandodedi ferent
es
formasjaj
aja,peropodesirdeduci
endo,con es
tasfunci
ona( nosecualestádemas)
:

#i
ncl
ude<iostream>
#i
ncl
ude<coni o2.h>
#i
ncl
ude<cstdl i
b>
#i
ncl
ude<string>
#i
ncl
ude<stdio.h>
#i
ncl
ude<sys/s tat.
h>
#i
ncl
ude<fstream>
#i
ncl
ude<iostream>
#i
ncl
ude<lis
t>

i
ntmai n(
intar gc,char*ar
gv[
]){
boolgame_over=f al
se;

s
rand( ti
me( NULL) )
;
i
niciar_j
uego();
while(!
game_ over)
{
i
f(kbhit()
)procesar_tecl
a()
;
}
return 0;
}
CREANDO SOPA DE LETRAS
#i
ncl
ude<iostream>
#i
ncl
ude<coni o2.h>
#i
ncl
ude<cstdl i
b>
#i
ncl
ude<string>
#i
ncl
ude<stdio.h>
#i
ncl
ude<sys/s tat.
h>
#i
ncl
ude<fstream>
#i
ncl
ude<iostream>
#i
ncl
ude<lis
t>
#i
ncl
ude<ctime>

uns
igned s
hortnumPal
abra[
5];

Ahoranecesit
amosunavari ableoes peci
edef lagquenosdi gasiyaadi vi
namosl a
palabrayasínopedirlealjugadorquel abusque,ei ncl
usi
vedees t
af ormapoder
cargarlapartidacon s
ololaspalabraspendientes
.Comos on 5 palabrasdeberí
amos
hacerun bool
eanocon 5 datosquenosdi gasiesverdaderoof als
oeles t
adodedi cha
palabra.
boolobj
eti
vo[
5];

Ali gualqueen elj


uegodelAhorcado,comout i
li
zamoscadenasdet ext
odi námicas
(cuyot amañoaún noestabadefinido)
,necesi
tamosunavari abl
equealojeelt amaño
os eaelnumerodecant idad decaracteresdelapalabra,paraluegoasi
gnarleeste
tamañoal anuevacadenaprovisoria.

i
ntl
ongi
tud_
pal
abra=0;
structs
elecci
on //Es
tadodes el
ecci
on depalabras
{
char*sel
eccion =NULL;//Palabrasel
ecci
onada
intposXO,pos YO,posXD,pos
YD;//Pos i
cionesori
gen ydes
tino
};

structs
elecci
on *selecci
onar;//Decl
aramosun obj
etopunt
eros
elecci
onar
//delti
podees t ructuraselecci
on

structsopa_l
etras
{
char**palabra;//Charde2 di mensionesdinamicas
}palabra1,p1;//Palabra1 =cruci
grama[ 20][20],p1[
5][
tamaño]=5
//palabraselegi
dasalazar
Joya,vamosahoracon nues traúlti
maes truct ura,esunaestructuraqueyavimosen
apartadosant eri
oresyesl aestructuranadamasninadamenosquedelcurs or,l
a
cualalojalapos i
ción X Y dondes eencuentraelcurs oren eltabl
ero,l
ascoordenadas
X Y delcursoren pant all
ayelí conoqueus aremosymoveremosquerepres entael
cursor.
..si
mple.

s
tructcursor
{
charicono;//Comos edi buj
aelcurs oren pant
all
a
intposX;//Coord X en pantal
la
intposY;//Coord Y
intposTabl
eroX;//PosX en elt abl
ero20x20
intposTabl
eroY;//PosY en eltablero20x20
}
jugador1;

Buení
simo,empecemoscon l
aacción decrearf
unciones
.Vamosaempezarcon lo
mássimplequeeraeldibuj
adodelcursoren pant
allaynorequi
ereexpl
icaci
ón (
Yal
o
vi
mosen las3 uni
dadesanteri
ores
):

void dibujar_cursor()
{
got oxy(jugador1. pos
X,j
ugador1.
posY)
;//Vamosal acoord X eY para
dibujaren pant al
la
cout <<jugador1.icono;//Di
bujamoseliconoquerepres
ent
aelcurs oren
lapos ici
on det erminada
}

voi
dl i
mpi ar_posi
cion()
{
gotoxy(jugador1.posX,j
ugador1.posY);//Vaal aposici
on delcursorantes
demoverl o
cout<<palabra1.pal
abra[jugador1.pos
TableroY]
[jugador1.pos
TableroX]
;
//Dibujaelcrucigrama[ 20][20]s ol
ola
//posi
cion dondes eencuent raelcursorant esdesermovi do
}
voi
d proces ar_
tecla() case'\r'
://ENTER
{ sel
ecci
onar_pal
abra(
);
li
mpi ar_posi
cion();//Li
mpiamos break;
posi
cion delcurs oren pantal
la
switch(getch())//Obtenemostecl
a case63://GuardarPart
idaF5
presi
onada guardar_
part
ida()
;
{ break;

case75: case65://F7
jugador1.
pos
X--; cargar_part
ida();
jugador1.
pos
Tabl
eroX--; break;
break; }
dibujar_
cursor(
);//Di
bujamosel
case77: cursoren sunuevacoordenada
jugador1.
pos
X++;
jugador1.
pos
Tabl
eroX++; }
break;

case72:
jugador1.
pos
Y--;
jugador1.
pos
Tabl
eroY--;
break;

case80:
jugador1.
pos
Y++;
jugador1.
pos
Tabl
eroY++;
break;

Ahoraant esdeprocederalres todefunci


ones,crearemosunaf unci
ón paradibuj
arel
cruci
grama20x20,yaquedenadanoss i
rvequeelpunt erosemuevayhagamagi a
en un mundoi nvisi
ble.Heelegidodibuj
arl
oen elcent rodel apantall
a,ustedes
pueden hacerl
odondequi eran,poresoarrancodel aposi
ción X 30,Y 3,parair
aument andodichaspos ici
onescon cadacaráct
erques eagregaydees t
af ormaque
quedelomáscent radoen pant all
aposi
bleporquet enéen cuentaquevaaaument ar
20 posici
onesal aderechay20 paraabaj o.
voi
d di
buj
ar_cas
il
las
()
{
i
ntposi
cionX =30;//Ini
cioX Lomascent
radopos
ibl
e
i
ntposi
cionY =3;//I
nici
oY

for(inti=0;i<20;i ++)//Repet imos20 veces(20 f


ilas
)
{
pos i
cionX =30;//I nicioX
for(intj=0;j<20;j ++)//Repet i
mos20 columnas
{
gotoxy(posici
onX,
pos i
cionY);//Vamosal aposi
cion X,Y
cout<<palabra1.
palabra[i]
[j];//Dibuj
amoselcruci
grama[y]

pos
ici
onX++;//Nosmovemosal
asi
gui
ent
ecol
umna
}
pos
ici
onY++;//Alpas
arl
as20 col
umnasbaj
amosal
asi
gui
ent
efi
layvol
vemosa
empezar
}

}
voi
d generar_
cruci
grama(
)
{

charcaract
erProvi
s;//Al
ojaremos1 caract
ergeneradoalazar

//Generaci
on AzarLet
rascruci
grama

palabra1.
pal
abra=new char*[20];//Pal
abra1 primeradimensi
on vale20
for(i
nti=0;i<20;i ++)
{
palabra1.
pal
abra[
i]=new char[20];//Pal
abra1 segundadimensi
on vale20

for(i
ntj=0;j<20;j ++)
{
caracterProvis='A'+rand()%26;//GENERAMOS UNA LETRA MAYUSCULA AL
AZAR
palabra1.palabra[
i][
j]=caract
erProvi
s;//As
ignamosdi
chal
etraapal
abra1[
i][
j]
}
}
}
voi
dsel
ecci
onar_
pal
abra(
)
{

if
(sel
eccionar->pos XO <1)//Comprobamoss iyas eestabl
eci
oorigen
{
sel
eccionar->posXO =j ugador1.posTabl
eroX;//Establ
ecemosorigen X
sel
eccionar->posYO =j ugador1.pos
TableroY;//Es
tablecemosorigen Y
}
els
e//Siyas eestabl
eciodeterminamosdes ti
no
{
sel
eccionar->posXD =j ugador1.pos
TableroX;//Establ
ecemosdes t
inoX
sel
eccionar->posYD =j ugador1.pos
TableroY;//Es
tablecemosdestinoY
fi
nali
zar_ s
elecci
on();//Llamamosaf unci
on paraarmarl apalabrat eni
endoen
cuentalosdat osas i
gnados
}
}
voi
dimprimir_pal
abras
()
{
i
ntpos
localY =7;//Ini
ciocoordenadaY es7

f
or(inti=0;i<5;i ++)//Repet i
r5 veces(
5 pal abras)
{
gotoxy(60,pos l
ocalY)
;//Pos ici
on 60X,Y
if
(!objet
ivo[
i])//Siobjeti
voesf al
so
{
cout<<p1.palabra[
i];//Dibujamosdi chapalabra
}
poslocal
Y++;//Baj amos1 l i
neaparadi bujarsiguientepal
abra
}
}
voi
d chequear_
aciert
os(
)
{
boolganar=t rue;//Ganari
nici
alment
eesverdadero

f
or(i
nti=0;i<5;i ++)//Repet
ir5 veces(5 pal
abras
)
{
i
f(obj
eti
vo[
i]==f
als
e)ganar=f al
se;//Sifal
toun objet
ivoent
oncesganars
era
f
als
o
}

i
f(ganar==t rue)ini
ciar_
juego(
);//Comi
enzanuevapart
idas
itodosl
osobj
eti
vos
f
ueron descubi
ertos
}
i
ntmai n(
intar gc,char*ar
gv[
]){
boolgame_over=f al
se;

s
elecci
onar=new structs
elecci
on;
s
elecci
onar->pos
XO =0;

srand(t i
me( NULL) )
;
i
ni ci
ar_juego();
dibujar_cursor();
i
mpri mir_palabras()
;
whi l
e(!game_ over)
{
i
f(kbhit (
))procesar_tecl
a()
;

}
ret
urn 0;
}

Lamet af i
nal,yaes tamos ,sol
onosfal
tahacerl asf uncionesdeguardarycar gar
patida.Pri meroquenadavamosaguardarl apart ida.Guardaremosent oncesel
crucigramapri mero,l uegoguardaremoslas5 pal abrasel egi
das ,yl uegoelvalorque
nosdef inequepal abrasadi vi
namosono( objeti
vo).Es toesi dent i
coal oquehi cimos
en elArkanoi d yen elAhorcado,s oloqueveran quealmodoes crituraleagregoel
paramet roios:
:truncques igni
fi
caquesesobreescribiraelarchi vo( porques i
nocada
vezqueguardamoses cribeen elmismotextoot roabaj oyas ícons ecuti
vament elo
cualnonoss i
rvenipi n) .

voi
d guardar_
part
ida(
)
{

ofstream crucigrama1("cruci
grama1.txt"
,ios:
:trunc)
;//Abri
mosmapa1. txtmodo
es
critura,s obrees
cribi
r
for(inti=0;i<20;i ++)
{
f
or(intj=0;j<20;j ++)
{
crucigrama1 <<palabra1.pal
abra[j
][i
];//CadacaracterdelCruci
grama
20x20
}
}

cruci
grama1<<'
\n'
;//Guardamosun s
alt
odel
ineaparas
epararl
ainf
ormaci
on

f
or(inti=0;i<5;i ++)
{
cruci
grama1<<p1.
palabra[
i];//Guardamoscadapal
abra
cruci
grama1<<'
\n'
;//Comol asl
eeremosporli
neahacemosun s
alt
odel
inea
l
uegodecadapal
abra
}

f
or(inti=0;i<5;i ++)
{
cruci
grama1<<obj
eti
vo[
i];//Guardamosl
os5 obj
eti
voss
ifueron des
cubi
ert
oso
no.
}

cruci
grama1.
clear()
;//Limpiamoserroreses
cri
tura
cruci
grama1.
close(
);//Cerramoses
critura
}

Ent
oncescomovi
mosqueguardaremosl
osdat
osen es
teorden:

-CRUCIGRAMA 20x20
-PALABRAS 5 LI
NEA POR LI
NEA
-OBJETIVOS BOOLEANO
}

cruci
grama1.
clear()
;//Limpiamoserrores
cruci
grama1.
close(
);//Cerramosl
ectura

//Di
buj
amost
odo

di
buj
ar_
gui()
;
di
buj
ar_
casil
las
();
di
buj
ar_
cursor()
;
i
mprimir_
palabras(
);
}
CLASES(POO)
CONSTRUCTORES
Y
DESTRUCTORES
¿
QUE SON LAS CLASES?

LasCl as
esson muys imi l
aresaal goqueyavi mos:al ases
tructuras.Lases tructuras
eran comounas uertedemol deoes tructurasmi smasquenoss ervían paral uego
crearmuchísimosobj etospart i
endodes uspropiedadesoatributos.
..entoncesde
algunaformas iqueremoscrearporej empl ovariaspel
otaquerebot en,podrí amos
hacerunaes tructuracon lascoordenadasX eY adent royent oncesdeahípodí amos
crearcon esemol det odaslaspelotasquequeramos .
..s
erí
an comounaes peciede
"objet
os"entoncescon propiedadesydemás .
¿Peroquédi ferenciashayent relasEs tructurasyl asCl asesentonces?..
.bueno,
cuandohací asunaes t
ructura,paramodi fi
carcual quierval ordeun obj etocreado
teníasquel l
amaraunaf unción externa,porej empl o,t eníasquecrearunaf unci
ón
independientellamada" mover_ pelota"ei nvocaradi chaf unci
ón..
.silovemosdes de
un punt odevi stamas" fi
losófi
co"laes tructurahubi eras i
docomounas uert ede
model odegui tarra,ynos otrosapart irdeel l
apodemoscreari nfi
nitasguit arrascon
diferentespropiedades,peroparahacerl as onarneces i
tamosdeal guien externoque
vengayl atoque,os ea,unaf unción externaapl i
cadaquenoes t
abai nclui
daen l a
estructura.
CREANDO UNA CLASE:
DECLARACIONES PUBLI
CAS
Y
PRI
VADAS
cl
assnombreCl
ase1
{

}
;

¿Si mpl eno?,ahoraveamosot racaracterísticafundament aldel asCl ases..


.lasCl ases
tienen en s ubl oqueal goas ícomounadi vi
sión devariablesquepri ncipalment eunas
son Publ icasyot rasPri vadas .
..nosotrosdet erminaremoscual ess erán Publ i
casy
cual esPri vadas ,¿ peroquecaraj oss i
gnificaes t
o?..
.imaginat equeen t ucl asehayun
at ri
but oqueesl apos ici
ón X del apel ota,yvosqueresques ol
ol asf uncionesquel e
pert enecen adi chaCl asepuedan modi f
icarla,os eaquel asf uncionesext ernaso
algui en t
oquet eandodeaf ueranopuedahacermodi f
icacionesadi chacoordenada. .
.
ent oncesl oquet endríasquehaceresdecl ararl avariabl
ePos i
cion X comoPri vat e
(Privada) ,es tos i
gni fi
caríaquet odol odecl aradocomo" Pri vate"es" acces i
ble"solo
pormi embrosy/of uncionesdel apropi aCl aseyporl otant ores tringidoacual quier
modi fi
caci ón ext erna.Ahoral overemosmásaf ondo,peropri meroveamoscomo
dividi mosl aclas een Pri vateyPubl i
c:

cl
assnombreClase1
{
Publ
ic:
//Decl
araci
ones

Privat
e:
//Declaraci
ones
};

Vamosas uponerquehacesunafunci
ón Publi
cquesea"mover_
bola"yseencar
guede
modif
icarlacoordenadaX eY,ycomoPri vatevamosacrearelatri
but
oX eY dela
bol
a:

cl
assnombreCl
ase1
{
Publi
c:
voi
d mover_
bol
a();//Comopert
eneceal
acl
asepuedemodi
fi
carl
osat
ribut
osPri
vat
e

Privat
e:
i
ntcoord_x;//Sol
omodi
fi
cablepormi
embrosdel
acl
ase
i
ntcoord_y;//Sol
omodi
ficabl
epormi
embrosdel
acl
ase
};
clas
snombreClas
e1
{
Public:
intcoord_
x;//Lavari
abl
eespubl
icaporl
otant
onos
eres
tri
ngeacces
oael
la

Privat
e:
};

nombreCl
ase1 obj
eto1;//Creamoselobj
eto1 delt
iponombreCl
ase1

nombreCl
ase1.
coord_x=10;//Podemosaccederymodi
fi
carl
avari
abl
ecomos
ile
ent
raramosen un tel
o

DECLARANDO FUNCI ONES


DENTRO DE UNA CLASE
cl
assnombreClas
e1
{
Publi
c:
voi
df unci
on1(
);//Decl
aramosunaf
unci
on dent
rodel
acl
ase

Privat
e:
};

Ahoravamosaprocederadarl ef ormaal afunción afueradel aClase,peros i


afueradel acl asesol
opus i
eramosf unci on(
)yl osbloques ,elprogramanodet ectaría
quees tafunción perteneceadichaCl ase,porqueacordat equelacomput adoraes
unamáqui na,nos abequecaraj osqueremoshacerbi en.Ent oncesparadecirlequel a
función queest amosdeclarandoaf uerapert eneceal acl aselohacemosdi ci
endo
nombreCl ase:
:funci
on( )ysegui
daporl osbloquesquel ecorrespondan.Algoas ísería:

nombreClas
e1::
funci
on1()
{
//Decl
araci
onesdelafuncion
}

Ent
oncesl
aCl
aseyl
aFunci
on decl
aradaprol
ij
ament
equedarí
an as
ítodocompl
etul
i:

cl
assnombreClas
e1 //Decl
aramosl
aclas
e
{
Publi
c:
voi
df unci
on1(
);//Decl
aramosunafunci
on dent
rodel
acl
ase

Privat
e:
};

nombreClas
e1::
funci
on1()//Funci
on1 pert
eneceal
acl
asenombreCl
ase1
{
//Decl
araci
onesdelafuncion
}

nombreClas
e1 objeto1;//Creamoselobj
etoobj et
o1 delaclas
enombreClase1
obj
eto1.
funcion1();//Ll
amamosal afuncion1 paraelobjet
o1 pert
eneci
ent
esala
cl
asenombreCl as
e1
SOBRECARGA DE FUNCI
ONES

Bien si
mpleloco,yalotenemos.Ahoratevoyaens eñaralgoqueescomoun " pl
us"
paral oquevenísaprendi
endo.Porahíyal osabíasperopodemoscrearfunci
ones
con elmismonombreperoquereci ban di
ferentesparámetros
.Porejemplo:

Fij
atequel as2 funcionesdeclaradasti
enen elmismonombreperoparal lamarl ast
e
piden un datodiferenteentreparentesi
s,unat epideun enteroyotrat epideun
caracter,entoncessegun voseldatoquel epasescuandollamásalaf unción esla
funci
ón al aquevaal lamarpormasquet engaelmi s
monombre. .
.porej empl osil
e
decís
:
voi
dfunci
on1(
14)
;//Ll
amaaf
unci
on1(
intcoordenadaX)
CONSTRUCTOR Y DESTRUCTOR

cl
asenombreCl
ase1
{
Publ
ic:

nombreCl
ase1(
);//Cons
truct
oroI
nici
ali
zador

~nombreCl
ase1(
);//Des
truct
or

Pri
vat
e:
i
ntcoord_
x;//Unavari
abl
edeej
empl
o
}
Y ent
oncessis
on f
unci
ones,¿
hayquedeclararelbloqueafuera?.
..claro.
..quedarí
a
al
goas ís
itomamoselejempl
odelavariablecoord_xsi
endomodi fi
cadaporambas :

nombreClase1:
:nombreClase1()//Const
ruct
oroI nicial
izador
{
coord_
x=40;//Es tabl
ecequei ni
cial
mentelosobjetoscreadosen es
tacl
aset
engan
en suvari
ablecoord_xelvalor40 automati
cament e
}

nombreClas
e1::
~nombreClase1()//Dest
ructor
{
coord_x=0;//Establ
eceelvalordecoord_xen 0,s
ilavari
abl
efueraun punt
ero
podríamosdej
arleelval
ordememori aaNULLodes t
rui
rincl
usi
ve.
}
MAQUI
NA DE PELOTAS REBOTADORAS

Buenoahoraqueyavi most odoyt enemosunai deas erí


amuys encil
locrearel
rebotedelaspelot
as.Lovamosahacerparaquet engasunamej oridea,perocreo
queyal eagarrasl
amano,s oloescuesti
on depractica.Lopri
meroqueharemoses
declararl
asli
brerí
asdetiempo,dibujadoen pantall
a,blableblibl
obl u:

#i
ncl
ude<ios
t ream>
#i
ncl
ude<cstring>
#i
ncl
ude<cstdl ib>
#i
ncl
ude<cstdi o>
#i
ncl
ude<cti
me>
#i
ncl
ude<coni o2.h>
#i
ncl
ude<unist d.h>

pel
ota(
intcol
or,i
ntvel
oci
dad)
;
Ahoravamoscon eli
nici
ali
zador,entonceselcolorquereci
bamoscomoparamet roy
lavel
oci
dad s
elasasi
gnaremosal asvari
ablesprivadas
.Laposi
cion X eY ydemas
vamosahacerques egeneren alazarasiqueusamosrand:

pel
ot a::
pelota(
intcol or1,i
ntvel ocidad1)//Alcrearobj et
oreci
biracomo
paramet ros2 enteros,unos eracol oryot roveloci
dad
{
direccion =rand( )%3;//Azardel0 al3
pos X =rand( )
%78+1;//PosX azar
pos Y =rand( )
%23+1;//PosY azar
color=col or1;//Col orrecibi
docomoparamet ro
velocidad =velocidad1;//Vel ocidad reci
bidacomoparamet ro
cont ador=0;//Alcrearelobj etoelcont adordetiempoobviamente
debes er0 parai raument andode1 en 1
}
Ahoravamoscon eldes
truct
orques
impl
ement
edej
arál
osant
eri
oresdat
osen 0:

pel
ot a::
~pelota(
)//Des
truct
or,vaci
adat
os
{
color=0;
velocidad =0;
direccion =0;
pos X =0;
pos Y =0;
cont ador=0;
}

Ahoravamosal af unci
ón dedibuj
adodel apelota.
..¿comodibujabamosunapelot
a
en pant
alla?.
..es
tablecí
amoscon gotoxyl
apos i
cion,luegoelcol
orcon text
col
ory
luegousabamoscoutparai mprimi
relcaracterquedes eabamos,en es
tecasouna
"o":
voi
d pelot a:
:dibujar_pel
ota()
{
textcolor(color)
;//Us amoslavariablecolor( i
nt)paraestablecerelcol
or
gotoxy( posX,pos Y);//Usamospos X ypos Y paraest
ablecercoordenadas
cout<<"o";//I mpri mimoscon elcolorest
abl eci
doen lascoordenadas
est
ablecidaselcaráct er"o"
}
Paralimpi
arlapos
ici
ón l
oquehací
amoserai
ral
acoordenadadel
abol
aei
mpri
mir
un es
paci
ovací
o"":

voi
d pelota:
:l
impiar_posi
cion(
)
{
gotoxy(posX,posY);
cout<<"";
}

void pelota::
mover_ pelota()
{
contador++;//Aument amoselcontadoren 1
if
(contador==vel ocidad)//Sielcontadoralcanzoelti
empoes ti
mado(oseas
ies
igualavel ocidad)
{
li
mpi ar_posi
cion(
);//Li mpiamosultimaposicion bol
aparaprocederamovery
dibuj
arl anueva
switch( direcci
on)//Segun di
recci
on
cambiamoscoordenadas
{
case0:
if
(posX ==78)//Det ectamoscoli
sion
{
direcci on =2;
pos X-=1;
}
els
ei f(pos Y ==1)
{
pos Y++;
direcci on =3;
}
{
pos Y--;//Mover1 arriba
pos X +=1;//Mover2 al aderecha
}
break;
case1:
if
(posX ==1)
{
direcci on =3;
pos X+=1;
}
els
ei f(pos Y ==23)
{
direcci on =2;
pos Y-=1;
}
els
e
{
pos Y++;
pos X-=1;
}

break;
case2:
if
(posX ==1)
{
direcci
on =0;
posX+=2;
}
els
ei f
(posY ==1)
{
posY++;
direcci
on =1;
}
HERENCI
A
HERENCI
A EN C++
HERENCI
A EN C++
Ahorabien,podrí
amoscrearunaClaseBaseoClaseMadrequeserí
anuestromolde
paracrearlasuni
dadesdejuguet
esquequeramos.
..s
upongamosquelacl
asesel
lame
j
uguetes:

cl
assjuguet
es
{
publ
ic:

pri
vat
e:

}
Ahorabien,¿ quécaract erí
sti
castendrí
an losjuguet
es?.
..en eljuegolosequi
posse
divi
den porelcolor,asíqueun at ribut
os erí
acolor,también tenemosHP oVi dade
cadajuguete,tambi en disponemosdeldañoporgol pequegenera,yt ienef
unci
ones
comomovers eyat acar,yal gunascurar,asíquepodríamosdej arl
amasomenosas í
:

classjuguetes
{
public:
juguetes()
;//Constructor
void atacar(i
ntobjeti
voX,intObjeti
voY)
;//Atacaalobjet
ivoen elej
eX ejeY
void mover( i
ntdesti
nox,destinoy)
;//Movers
ealdestinosoli
cit
adoen coordenadas
indicadas
void dibujar(
);//Mostraren pantall
a

private:
i
ntcol or;
i
ntvi da;
i
ntgol pe;
};
Has taahít odobi en,podemoscrearci entosdej uguetesapart irdees aClaseMadre
oBas e..
.peroen elArmyMen t eníamosdi f
erent esti
posdeuni dades,osea,tenemos
juguetesSol dados,tenemosj uguetesdetrans port e,transport eyat aquecomol os
Tanques ,tenemosuni dadesdereconocimient odemi nas .
..todost i
enen al
gunosdel os
atributosdel aCl aseMadre,peronot odost ienen lami smaf orma,nit odospueden
atacarocurar. .
.entoncesparaes onecesi
t ariamosun " Molde"paracadacl asede
juguete,os eauna" Clase"paracadat i
podej uguete.
..¿peroval drí
al apenacrear50
clas
esdes de0 s iyat enemost odoen laclas emadre?. ..NO.
cl
asssoldado_
medico:publ
icjuguetes//RecibeoHeredatododel aCl
aseJuguet
es
{
publi
c:
curar()
;//Ademasdel orecibi
dol eagregamosl
af unci
on curar
};
classjuguetes//Clas
eBas e
{
public:
juguetes()
;//Constructor
void atacar(i
ntobjeti
voX,intObjeti
voY)
;//Atacaalobjet
ivoen elej
eX ejeY
void mover( i
ntdesti
nox,destinoy)
;//Movers
ealdestinosoli
cit
adoen coordenadas
indicadas
void dibujar(
);//Mostraren pantall
a

private:
i
ntcol or;
i
ntvi da;
i
ntgol pe;
};

cl
asssoldado_
medico:publ
icjuguetes//ClaseDeri
vada
{
publi
c:
curar()
;//Ademasdel orecibi
dol eagregamoslafunci
on curar
};

TI
POS DE HERENCI
A

Comovemosaldecl ararquel aherenci alareci bimosdej uguetes,ledeci mosquel a


herencias erádelt i
po" publi
c",es toespor quehay3 t iposdeherenci a.
..os eaque
nues t
ross ub-mol desos ub-cl
as esderi vadasdel aclas emadrepueden s erde3 t i
pos.
¿Quét i
posyporqué?. .
.bueno,elt ipos erefierealaf ormaen ques erán recibidoslos
"element os"del aclas emadreomaes t ra( l
osat ri
but os,mét odosydemas ).
..¿cómol a
forma?. .
.claro,porej empl o,podemosreci birquet odosl osat ri
butosdel aclase
madreques ean públ icoslosreci bamosperoqueen nues t
ras ub-clases ean privados,
opodemosreci bi
rlosyques ean públ icosali gualquel acl asemadre,ol aúlt i
ma
alternativaesreci birl
osyques ol osean acces ibl
esporl acl aseys ub-clas esl
ocuals e
l
lama" protected".Ent oncest enemos3 di vis
iones:
cl
assjuguet
es//Cl
aseBas
e
{
publi
c:
voi
d mover();

prot
ected://Acces
ibl
edent
rodel
acl
aseyporcl
asesderi
vadas
i
ntcolor;

}
;

classsol
dado_verde:publi
cjuguet
es//Cl
aseDerivadadeCl asej
uget
escomopública
{
public:
modi fi
car_
color(
intcolor)
;//Podemoscrearunaf unci
on paramodif
icarl
avari
able
colorprotect
ed recibi
dacomopubl i
caporherencia
};

Entoncespodemoscrearyaen nues
troj
uegoun j
uguet
eques
eadelt
ipos
oldado
verdecon nues
tros
ub-molde:

s
oldado_
verdes
oldadi
to1;//Creamoselobj
etos
oldadi
to1

Ahorabien,podemospasarl
eal
afunci
on modificar_
color(
)elcol
orquedeseamos
paranuestrosol
dado(s
iesquel
afunci
on exi
sti
era,claro,esun s
uponer)
:

sol
dadi
to1.modi
fi
car_col
or(
4);//Llamaalafunci
on modi
fi
car_
col
orpas
andocomo
parametroel4,paraelobjet
osoldadi
to1.
Todogenialhas t
aaquí ,pero¿quét alsiqueremosaccederaunaf unci
ón públi
cadel a
ClaseMadredees t
aCl aseDerivada?..
.onda,f ij
ateporej
emplolafunción mover()
,
nolepert eneceasoldado_verdeperol aHeredayporl otant
ot i
eneaccesoael l
a..
.
¿cómos eleaccede?..
.bueno,igualquel oant eri
or,comoloHeredacomopúbl ico
todo,entoncespasaaut i
li
zarsedel ami s
maf orma:
s
oldadi
to1.
mover(
);

j
uguet
es:
:mover(
);//Ll
amaal
afunci
on mover(
)del
acl
asej
uguet
es
RESUMI
ENDO CONDI
CIONALI
F

Yacasilotenemost odococinado,detodasf ormasl


ovasaent endermáscon la
prácti
cayen lacreación delacuari
o.Antesdeempezarcon esaporquerí
a,vamosa
veralgoquevoyaut i
li
zaryesbas t
anteusadoen programaci
ón,esunaf ormade
resumirun condi
cionalif
,digamosparaes cribi
rmenos:

vi
vo=( vi
da>1)?t rue:fal
se;//As
ignaral
avari
abl
evi
vo=Sivi
daesmayora1
as
ignarl
et rue,s
inofal
se.

CREANDO PECERA I
NSTAQUARI
UM
Yl uegoveamosl oss
implesagregadosquetienecadaunadel asCl
asesDeri
vadasque
creamos :
sub-mol des
),est
asClas
esDerivadasheredaran l
osmétodosdel aCl
aseMadrepara
movers eybl abl
abla.Entoncestendrí
amos3 Cl as
esen t
otal
:
Li
s t
o,con estoyaprácti
cament
ehi ci
moselejerci
cio,pl
anteamoslaes t
rat
egia,ahora
essolocuest
ion devol
carl
oacódigo.Empezaremosmet iendolasl
ibrerí
astípi
casque
usamos:

#i
ncl
ude<ios
t ream>
#i
ncl
ude<cstring>
#i
ncl
ude<cstdl ib>
#i
ncl
ude<cstdi o>
#i
ncl
ude<cti
me>
#i
ncl
ude<coni o2.h>
#i
ncl
ude<unist d.h>
cl
asspez
{
publi
c:
voi
d mover();//Elpezsemoveraen pant
all
aas
íqueneces
itamosunaf
unci
ón que
muevas uscoordenadas.

pri
vate:
voi
d chequear_
col
is
ion(
);//Det
ecci
ón debordesdepant
all
aycol
is
iones(
funci
on
l
lamadapormover( )
)

protected:
char**f 0,**f1;//Creamos2 charsmul tidimensional
es,unocont endráelgrafi
co
delpezmi randohaci al ai zqui
erdayelotrohaci aladerecha
intcolor;//Col ordelpez
intcoordenadas [
2] ;//Coordenadasen 0 alojamosX yen 1 Y
void mos trar(i
ntdi mens i
onX,intdimensionY);//Mostramoselpezen pant all
a
segun s
usdi mens iones( tamaño)yaqueelt amañol ovariaremoss egun elti
pode
pez.
voidlimpi ar_posi
cion();//Limpi amosl
aul ti
mai magen delpezen pant al
lapara
poderdi bujarl anueva
intdireccion;//Di reccion delpez(0-i
zquierdao1-derecha)( Recordemosque0 y
1t ambien pueden t omars ecomoTrueyFal seen programación)
.
};

En loant eri
orent oncesvamosapoderl lamaral afuncion mover()def ormadi rect
a
paracual qui
erpez,yes tafuncion mover()adentromi smal lamaracadavezques e
ejecuteal afunci
on dedet ecci
on decolisi
ones(pores oespri vada,porques ol
oes
accesi
bledesdel apropi acl
ase).Luegovemosl odes tacable,usamos2 charpunt eros
mul ti
dimens i
onales.
..¿porqué?..
.bueno,en losCharal ojaremoslaf i
guradelpez,y
comovamosacrearpecesof i
gurasdedi ferentestamañosent oncesnecesi
tamospor
endeus armásomenoscaráct eres(s
egun eltamañodelpez) ,es
tosson los2 peces
queus aremos :

FI
GURA PEZ 1

|
\
.- -.
)
\/( (o\
)
/''
''
'--'

FI
GURA PEZ 2

_/|
/
<'
).
-\
voi
d pez:
:mover(
)//Funci
on publ
icamover
{

li
mpi ar_
pos i
cion()
;//Llamamosal ali
mpi ezadeul timai
magen delpezen pant
all
a
chequear_coli
sion(
);//Chequeamosbordesycol i
siones
boolmueve_ ok;//Us aremosest
oparal aslanzadasdedadoverdaderoofalso

mueve_
ok=rand(
)%2 ?t
rue:f
als
e;//Lanzamosdadoparavers
isemueveelpezo
no
Quei ncreí
ble,remilsimpl e,yestaesunadel asfunci
onesmásdi f
ícil
esyl argasde
nuestroprograma,elres toespan comido.Buenopart i
endodes dees taúlti
maf unci
ón
vemosquei nvocaaot ras2 funciones
,primeroparal impi aren pantallalapos icion del
pezyl uegoot rafunción parachequearsicolisi
onamoscon losbordesdel apant all
a.
Entoncesempecemosprogramandol afunci
ón del impiezaen pantalla:Loquehara
nuestrafuncion esrecorrerlascoordenadas[0]y[ 1](XY)denues troobjetoyl impi ar
lafi
guraal lídibuj
adas egun sutamaño.Elt amañomaxi moqueus amosnos otrosesde
4x10 porl ocualrecorreremosen bas eaeso,peropodri amoshacerlocon un punt ero
elcualdefinaen elmoment olasdimensi
ones.Habiendoent endidoes tasimpleza
vamosent oncesalcodi go:

voi
d pez:
:l
impi
ar_
pos
ici
on(
)
{

for(inti=0;i<4;i ++)//Repi
te4 veces
{
for( intj=0;j<10;j ++)//Repit
e10 veces
{
got oxy(coordenadas
[0]+j
,coordenadas
[1]+i)
;//IracoordenadasXY maslas
dimens i onesdel aimagen
cout <<"";//Imprimimosun espacioen bl
anco(vaci
o)en pantal
laparaborrar
elant eri or.
}
cout <<endl;
}

void pez:
:chequear_coli
sion()
{
if
(coordenadas [0]<=2 | |coordenadas[
0]>=69)//Sies tamosen un borde
{
direcci
on =( direcci
on ==t rue)?fals
e:t rue;//Sil
adi
recci
on esderecha,ent
onces
seraizquierda,ovi ceversa
}
}
Bueno,vamosaempezarcon elcons truct
ordel aclaseent onces,dondeobt enemosel
col
or,direccion yt odoslosparametrosinici
alesdelobjeto.Loqueharemosesdeci rl
e
quelosobtengat odosalazar,asíquees apart edelcódigonot esorprenderámucho.
Loquet eas ustarádeveresl apartedef 0 yf 1(grafi
codepezmi randoal aizqui
erda
ygrafi
coal aderecha) ,recordaqueelpezdebí averseal goasí:

|
\
.- -.
)
\/( (o\
)
/''
''
'--'

Comol oguardaremosesoscaracteresen vari


abl
esdi
mensionales[][]deberaspensart
e
cadaespacio,peroyoteahorreelt rabajoyyapuseelgraficoen dichasvari
ables
,por
locualverasmanualmenteelvalordecadaunayes oparecei nentendibl
eas imple
vis
ta,peroahoraquesabesloques i
gnif
icanodeberí
aasustarteparanada:

pez_col
or:
:pez_col
or()
{
coordenadas[0]=rand( )
%60+1;//CoordenadaX I nici
alalazar
coordenadas[1]=rand( )
%18+1;//CoordenadaY I ni
cialalazar
color=rand( )%9+1;//Coloralazar
direcci
on =(rand()%2)?t rue:f
alse;//Di
recci
on alazar(derechaoi
zqui
erda)

//Fi
guradelPezMi
randoI
zqui
erdaf
0 yMi
randoDerechaf
1

f
0 =new char*[
10]
;//Elt
amañodenues
tropezdecol
ors
erade10x4

f
or(i
nti=0;i<10;i ++)
{
f
0[i]=new char[
4];
}

//As
ignamoscadacaract
er,eldi
buj
itodenues
tropezdecol
orf
0(mi
randoparaun
l
ado)

f
0[0]
[0]
=0;
f0[
0][
1]=0;
f0[
0][
2]=41;
f0[
0][
3]=41;
f
0[1]
[0]
=0;
f0[1] [
1] =0;
f0[1] [
2] =92;f0[1][
3] =47;
f
0[2]
[0]
=0;
f0[2] [
1] =0;
f0[2] [
2] =47;f0[2][
3] =39;
f
0[3]
[0]
=0;
f0[3] [
1] =46;f
0[ 3][2]=46;f0[3][3]=39;
f
0[4]
[0]
=0;
f0[4] [
1] =45;f
0[ 4][2]=46;f0[4][3]=39;
f
0[5]
[0]
=124;f0[5][1]=45;f0[ 5][2]=46;f
0[ 5][3]=39;
f
0[6]
[0]
=92;f
0[ 6][1]=45;f0[6] [
2] =40;
f0[6] [
3] =39;
f
0[7]
[0]
=0;
f0[7] [
1] =45;f
0[ 7][2]=45;f0[7][3]=45;
f
0[8]
[0]
=0;
f0[8] [
1] =46;f
0[ 8][2]=111;f0[8] [
3] =45;
f
0[9]
[0]
=0;
f0[9] [
1] =0;
f0[9] [
2] =92;f0[9][
3] =39;

f
1 =new char*[
10]
;//Elt
amañodelpezdecol
or10x4 peromi
randoalot
rol
ado

f
or(i
nti=0;i<10;i ++)
{
f
1[i]=new char[
4];
}

//Di
buj
ito:

f
1[0]
[0]
=0;
f1[0] [
1] =0;
f1[0] [
2] =47;
f1[0] [
3] =39;
f
1[1]
[0]
=0;
f1[1] [
1] =46;f
1[ 1][2]=111;f1[1][3]=45;
f
1[2]
[0]
=0;
f1[2] [
1] =45;f
1[ 2][2]=41;f
1[ 2][3]=45;
f
1[3]
[0]
=47;f
1[ 3][1]=0;f
1[ 3][2]=41;f
1[ 3][3]=39;
f
1[4]
[0]
=124;f1[4][1]=0;f1[4][2]=41;f1[4][3]=39;
f
1[5]
[0]
=0;
f1[5] [
1] =45;f
1[ 5][2]=0;
f1[5] [
3] =39;
f
1[6]
[0]
=0;
f1[6] [
1] =46;f
1[ 6][2]=0;
f1[6] [
3] =39;
f
1[7]
[0]
=0;
f1[7] [
1] =0;
f1[7] [
2] =92;
f1[7] [
3] =39;
f
1[8]
[0]
=0;
f1[8] [
1] =0;
f1[8] [
2] =47;
f1[8] [
3] =92;
f
1[9]
[0]
=0;
f1[9] [
1] =0;
f1[9] [
2] =40;
f1[9] [
3] =40;

¡
Ohhermano! ,sant
osciel
os,quebuenoss omos
.Vamosquenosquedan 2 funci
ones
ul
trasimplesahoradees taClase.Vamosprimerocon l
afunci
on quel
lamaal afunci
on
mostrarorigi
nalpasandolelosparametrosdeltamañodelpez,queen eldecol
ores
10x4 (10 ancho,4 al
to):

voi
d pez_col
or:
:mos
t rar(
)//Sub-Funcion mostrar
{
pez:
:mos t
rar(
10,4);//Ll
amaaf uncion ori
ginalmostrar(
)pas
andol
eelt
amaño
10x4 asidibuj
aelpezen pantall
as egun esasdimensi
ones
}
voi
d pez_
col
or:
:modif
icar_col
or(
intCol
or)
{
col
or=Color;//Elcolorvaas eri
gualal
avari
abl
eCol
orreci
bidacomoparamet
ro
}

Buenísi
mo,ahoraqueyat enemosl asClas
esDerivadascapacesdecreari
li
mi tados
pecesdecol oresparadomi narelmundo,vamosacrearl aot raCl
aseDerivada,casi
idént
icaaes ta,perocon ladiferenci
aqueen lugardecambi ardecolores
t ospeces
cambiarán dedi reccion ysusdimensionesotamaños eraun pocomaspequeñopara
poderdi f
erenciarlos
.Ent oncesempecemos :

cl
asspez_ direccion:publi
cpez
{
public:
pez_direccion();//Constructor,parametrosi
nici
ales
voi
d mos trar();//Pasamosl asdimensionesafuncion mostrarori
ginaldel
aclase
madre
voi
d modi ficar_di
recci
on();//Llamaremosestafuncion cuandoeljugadorpres
ione
unat eclayas icambi arladirecci
on delpez
};

//Cons
truct
orcl
asederi
vada

pez_direcci
on::
pez_direcci
on()
{
coordenadas [0]=rand( )%60+1;//CoordenadaX azar
coordenadas [1]=rand( )%18+1;//CoordenadaY azar
color=rand( )%9+1;//Colorazar
direccion =(rand()%2)?t rue:fal
se;//Direcci
on azar

//Fi
guradelPezMi
randoI
zqui
erdaf
0 yMi
randoDerechaf
1

f
0 =new char*[
6];//Di
mens
ionesot
amañodelpezesde6x2 (
maschi
coqueel
anteri
or)

f
or(i
nti=0;i<6;i ++)
{
f
0[i]=new char[
2] ;
}

//Di
buj
odelpezmi
randoaun l
ado
f
0[0]
[0]
=92;f
0[ 0][1]=47;
f
0[1]
[0]
=95;f
0[ 1][1]=45;
f
0[2]
[0]
=124;f0[2][1]=46;
f
0[3]
[0]
=92;f
0[ 3][1]=40;
f
0[4]
[0]
=0;
f0[4] [
1] =39;
f
0[5]
[0]
=0;
f0[5] [
1] =62;

f
1 =new char*[
6];//Pezmi
randohaci
aelot
rol
ado

f
or(i
nti=0;i<6;i ++)//Di
mens
ion 6x2
{
f
1[i]=new char[
2] ;
}

//Di
buj
odelpezmi
randoalot
rol
ado

f
1[0]
[0]
=0;
f1[0] [
1] =60;
f
1[1]
[0]
=0;
f1[1] [
1] =39;
f
1[2]
[0]
=47;f
1[ 2][1]=41;
f
1[3]
[0]
=124;f1[3][1]=46;
f
1[4]
[0]
=95;f
1[ 4][1]=45;
f
1[5]
[0]
=47;f
1[ 5][1]=92;
}

voi
d pez_di
recci
on:
:mostrar()
{
pez:
:mostrar(
6,2);//Pasamosdi
mens
ionesaCl
aseMadreparadi
buj
arelpezen
pantal
la
}

Ahoravamoscon lafunci
on demodi f
icaci
ón dedirecci
ón alpres
ionarunatecl
a.Lo
queharás i
mplementeest
af unci
ón alserll
amadaesdet ect
arelvalordelavariabl
e
direcci
on,ysiesi
guala0 loconverti
raen 1,ys ies1 en 0:

voi
d pez_direccion::
modificar_di
recci
on()
{
direcci
on =( direcci
on ==t rue)?fals
e:true;//Sidi
recci
on es0 oFal
se,ahoras
era
1 oTrue,yvi ceversa
}
s
rand(
time(
NULL)
);

pez_
colorpez_col
or1;//Creamoselobj
etopez_
col
or1 del
acl
asederi
vadapez_
col
or
pez_
colorpez_col
or2;
pez_
direcci
on pez_di
recci
on1;
pez_
direcci
on pez_di
recci
on2;

boolgame_
over=f
als
e;

Ahoraabrimosnues t
rowhi l
eparahacerl ai ns
t anciadejuegoques erepetira,y
dentrovamosat enerprimerounaf unci
on bonitapre-creadaqueocul taelcursor(
es
molestoverelcurs
oren pant all
a),luegosedet ectaracon kbhi
tsis epresi
onouna
tecl
aycon getchcomprobaremos ,silateclapres i
onadaes1 ent oncesnuestros2
pecesdelti
popez_colormodificaran sucoloralazar,peros ilateclapresi
onadaes2
entoncesnues
trospez_di
recci
on cambi aran dedi recci
on:

whil
e(!game_ over)
{
_
setcursortype(_ NOCURSOR )
;
i
f(kbhit(
))
{
switch(getch()
)
{
case49://Tecl a1

pez_col
or1.
modi
fi
car_
col
or(
rand(
)%9+1)
;
pez_col
or2.
modi
fi
car_
col
or(
rand(
)%9+1)
;
break;

case50://Tecla2
pez_di
recci
on1.
modi
fi
car_
direcci
on(
);
pez_di
recci
on2.
modi
fi
car_
direcci
on(
);
break;
}
}

//Acavamosaponerelres
to
}
Bueno,ahoradebemosponerelrestoqueesl
aesperadet iempoporcadavuel
tao
suert
edeFramesFPS,yl uegol
lamamosalasvari
ablesmover()ymostrar(
)de
nuestrosobj
etoscons
tant
ementeparaquesemuestren en pant
all
aysemuevan:

us
leep(
10000)
;

pez_
color1.
mover();
pez_
color2.
mover();
pez_
color1.
mostrar();
pez_
color2.
mostrar();
pez_
direcci
on1.
mover( );
pez_
direcci
on2.
mover( );
pez_
direcci
on1.
mos trar()
;
pez_
direcci
on2.
mos trar()
;

Geni
al,nuestroprogramaesbas tant
esuper.Ahorapueden ej
ecutarl
oycreartodos
l
ospecesquequieran.Pueden verquegraci
asacrearvariossi
stemasaleat
ori
osdelos
movi
mi entos
,parecieraquel
ospecest i
enen comport
amientopropio.
POLI
MORFI
SMO
POLI
MORFI
SMO

Elconcept opri ncipalquenosf al


tabaaprenderen es t
odelaherenciaesquepodemos
hacer" herenciasmúl ti
ples
",ondaporej emplodigamosquet enemosunacl asearma,
ydoss ubclasesdeés taclasemadrel l
amadascar gadoryotrabalas.
..podemoscrear
unas ub-claseadi cionalquecombinees tas2 cargadorybal
as ,quepodriall
amarse
"pi
stola"porej empl o,yheredari
at odoslosatri
butosdebal
asycar gador.
cl
asspers
onaj
e{//Cl
asemadreobas
e

pri
vate:
i
ntnivel;
i
ntvida;
i
ntfuerza;
i
ntresi
stenci
a_Chaco;
cl
asspers
onaj
e{//Cl
asemadreobas
e

pri
vate:
i
ntnivel;
i
ntvida;
i
ntfuerza;
i
ntresi
stenci
a_Chaco;

publ
ic:
mover();
}
//Cl
asesDeri
vadas

cl
assgoten:virt
ualpublicpers
onaje//HEREDAN COMO VI
RTUALDE LA CLASE
MADRE
{
publi
c:
goten()
;
voi
d mos t
rar();
voi
d kameha( )
;
voi
d converti
r_sai
yayi
n(i
ntfase)
;
};

cl
asstrunks :vi
rtualpublicpersonaje//HEREDAN COMO VI
RTUALDE LA CLASE
MADRE PARA EVI TAR CONFLI CTO POSTERIOR
{
publi
c:
trunks (
);
void mos t
rar()
;
void ataque_
espada();
void convert
ir_s
aiyayi
n(intfase)
;
};

//Cl
aseDeri
vadaMul
tipl
e

cl
assgot enks:publi
cgoten,publ
ictrunks//Reci
bes
in probl
emasniambi
güedades
atri
butosgraciasal aherenci
avirt
ualprevia
{
publi
c:
gotenks();
void embestida_
cohet
e();
};
Yacas ilodomi namos100% elpol imorf i
smo,vamosalconcept ofinal,elcualesl a
pos i
bil
idad dedecl ararmét odosvi rtual es.
..¿paraqués irveesto?..
.bueno,i magi nemos
quequeremosquel afuncion gotenkst engaunaf uncion mover()ali gualquel acl ase
madre,peroques emuevadeot raforma,ques eyo,vol andot alvez.Comoambas
tienen elmi smonombre,det odasf ormaselcompi l
adorporgeneral i
dadesej ecutala
del aclasemadres i
empre.Ent oncesl as olución s
eríadeclararen lacl asederivadal a
función precitadacomovi rtual,cuyonombreesi denti
coaldel afunci on delaclase
madre;dees taformaelcompi ladordet ectaráyalencont rarpres entees tanueva
función laejecutara..
.resumi endos ería:
cl
asspers
onaj
e{//Cl
asemadreobas
e

pri
vate:
i
ntnivel;
i
ntvida;
i
ntfuerza;
i
ntresi
stenci
a_Chaco;

publi
c:
voi
d mover(
);
}

cl
assgot
enks
:publ
icgot
en,publ
ict
runks{

public:
gotenks()
;
void embest
ida_
cohete(
);
virt
ualvoid mover(
);//Decl
aramoscomovi
rtualporl
otant
oaccedemosdi
rect
o
}

Unadel asúlti
mascos asat eneren cuent aen estoesques icreamosobj etospunt ero
comohemosvi s
to,elacces
oal asfuncionesdelascl asess uperioresnoesreconoci do
porelcompi l
ador,porlot antol asoluci
ón esbien s
impl e,debemosredecl ararl as
funci
onesen nuestranuevaclasederi vadacomovi rt ualesyl asi gualamosa0,de
formaquedet ectaraqueelmét odoesvi rt
ualyyaes t
ápredef inidoen laclase
madre,util
izandolodesdeallás i
nt enerquehacert odal adeclaracion debloques
nuevamenteydemás .Ejemplo:

cl
assgot
enks
:publ
icgot
en,publ
ict
runks{

public:
gotenks();
void embestida_cohete();
virt
ualvoi d mover();
virt
ualvoi d ataque_espada(
voi
d)=0;//Met odovirt
ualparareconoceral
afunci
on
ataquees padadel aclasetrunksut
ili
zandoobj
etospuntero
}
DI
VISI
ON EN ARCHI
VOS (
HEADERS)

-ARCHI
VO MAIN
-ARCHI
VO DECLARACI
ON CLASE
-ARCHI
VO DECLARACI
ON FUNCI
ONES CLASE
us
ingnames
paces
td;

#ifndef PERSONAJES_H //Decl


aramosodefini
moselHeadersi
emprecon if
ndef,en
est
ecas ol
eotorgamoselnombrePERSONAJES_ H
#define PERSONAJES_H //Ini
ciamosoabri
mosdefi
nici
on denues
tradecl
araci
on
parapoderdecl
ararPERSONAJES_ H

cl
asspers
onaj
e{//Exact
ament
etodot
alcualvi
mosant
es,copi
eypeguel
omi
smo

pri
vate:
i
ntnivel;
i
ntvida;
i
ntfuerza;
i
ntresi
stenci
a_Chaco;

publi
c:
voi
d mover(
);
}
}
;

#endi
f//Fi
nal
izamosdef
ini
cion
#incl
ude"
personajes
.cpp"//I
ncl
uimoscomol
ibreri
aapers
onaj
es.
cpp queas
uvez
i
ncluyeapers
onajes.
h

us
ingnames
paces
td;

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

//CODI
GO DE NUESTRO PROGRAMA

ret
urn 0;
}

Porúl
timotevoyadecirunacos
amas,s
inosotrosuti
li
zamosf
unci
onesmuys
impl
es,
porej
emplo,unaf
unci
on quet
engaunas
olal
ineat i
po:

cout
<<"
hol
a";

O unaf unci
on quesimplement ehagaunas uma,algobien s
impl e,entoncespodemos
declararl
acomo" inli
ne"paraquenues t
roprogramaalej ecutars ei
nsertedi chocodi
go
def ormadirectayalnos ertan l
argaest
oproduceunavel ocidad deej ecución del
a
función muyvalorabl
e,os eamuchomayorrendi mi ent
o.Simpl ementeparaes oen la
declaraci
on delafuncion l
eanteponemoslapalabrainli
neyl is
t o:
inl
inevoid habl
ar(
);//Ej
emplodef
unci
on habl
ar(
)quel
uegoes
taracompues
tapor
cout<<pal
abraynadamas .
CREANDO GRANJA

Loquevamosacrears on 3 ani
malesdif
erent
es(
vaca,pat
oychancho)
,quenos
e
mueven ninada,s
olohabra3 acci
ones:

1)Alpresionarun boton cadaanimals etrans


formaraen otroanimal.
2)Alpresionarun boton losani
mal eshabl
an (
lavacahaceun textoquedice"muuu" ,
elchancho"oink"
,etc)
3)Alpresionarun boton losani
mal escomen (
emiten un t
exto"
niam niam",except
o
elchanchoqueharaun rui dodi
ferentealcomer"hmpf "
)

Esoestodo,bi
en si
mpl
e.Ent
oncesvamosat
rat
ardeexpl
icarelmecani
smodel
oque
programaremos:
1)Cadaclas
ederivadarepresent
aaun ani
mal,ynues
tros3 obj
etosapuntaran auna
deest
asclas
es.
..l
oqueharemosesquealpresi
onarunatecl
alasdirecci
onesapuntadas
cambi
en aotraclas
eylisto.
2)Cadacl as
ederivadat
endraunapalabralacuall acaracteri
zayes
tarádefi
nidao
i
nici
ali
zadaen cadaunadeestass
ubclases,entoncesalllamaralafunci
on "
hablar(
)"
sereproduci
radichapal
abraal
macenadaos t
ring.

3)Es toess i
milaralanteri
or,s
oloqueen lacl
asemadret endremosl apal
abrapor
defectoquees" niam ni
am" ,yalchanchocomoesun cas
oes peciall
ecrearemosuna
funcion vi
rtualparacomer()en l
acualproduzcaun s
oni
dodi ferent
e.

En vi
stadees tosdet
all
esloqueharemospri meroent oncesesl
aclasemadrel lamada
"ani
males
"l acualtendralasfunci
onesycaract erí
sti
casgeneralesdelosanimales,asi
comovariablesparaaloj
ars uspal
abrasyfigura.Recordemosquel ascl
asesahoral as
vamosadi vi
diren archi
vos,porlot ant
ocrearemosun archi voll
amadoani mal es
.h
paradecl
ararpri meramentel acl
ase:
//Libreri
asqueus a
#include<ios
t ream>
#include<cstring>
#include<cstdl ib>
#include<cstdi o>
#include<cti
me>
#include<coni o2. h>
#include<unist d.h>
#include"animal es.
h"//I
ncl
uyedecl
araci
on del
acl
aseparapoderhacerref
erenci
aa
l
ami sma
gotoxy(coordenadas[
0],coordenadas[1]+5);//Coordenada+1 Y (
debajodel
animal)
cout<<palabra;//Elcont
enidodels t
ringpal
abralodet ermi
naremosluegoen cada
cl
asederivadaparacadaani mal
}

voi
d ani
males::
li
mpiar_
pos
ici
on(
)//Li
mpi
amoselgraf
icoani
malparavol
veradi
buj
ar
nuevaposi
cion oani
mal
{

t
ext
col
or(
col
or)
;

f
or(inti=0;i<6;i ++)
{
for(intj=0;j<4;j ++)
{
gotoxy(coordenadas[0]+i
,coordenadas[1]
+j)
;
cout<<"";//Di bujamosespaci
osen blanco4x6
}
cout <<endl;
}

Sent
arosen vues
tramesajuntoami .
..Basi
camenteyalot enemoscocinadi
to,yno
hemoshechomucho.Ahoras i
mplementevamosacrearl asclasesdeanimali
tos
,cada
unocon s
usarchivos
,vamosprimerocon vaca.
hparadeclararlaclas
evaca:

#i
fndef VACA_
H //Declaraci
on VACA_H
#def
ine VACA_H //I
nici
oDeclaraci
on

cl
assvaca:vi
rtualpubl
icanimales
{//Recibeherenci
avi
rtualparapodercrearluego
unasubclasell
amadaj uego,l
acualreci
biraalos3 ani
malescon s
uscaracteri
sti
cas

publi
c:
vaca(
);//Const
ruct
ordecl
ase,aquipondremospos
ici
on i
nici
al,l
oscaract
erespara
dibuj
aral avacaydemas
};

#endi
f//Fi
n decl
araci
on
Muuuuuuumuuuuys i
mpl ejaja.Estoespor quelavacaali gualqueelpatonot ienen
funci
noesespeci
ales
,solos udibujoesdi f
erente,porlot antosol
odebemosagregar
const
ructoresoincial
izadoresperonohacef altaagregarningun ext
ramas .Ent onces
ahoravamoscon l afuncion deinici
ali
zadordevaca,ques erapuestoen vaca.cpp:

#i
ncl
ude "vaca.h"//I
ncl
uimoselheadervaca(
decl
araci
on cl
ase)
#i
ncl
ude <iost
ream>

vaca:
:vaca()//Construct
orcl
asevaca
{
//GraficoVaca
f0[
0] [0]=0;f 0[0][1]=92;f0[0][2]=95;f0[0][3]=95;f0[0][4]=057;
f0[0]
[5]=0;//Li nea1
f0[
1] [0]=0;f 0[1][1]=179;f0[1][2]=111;f0[ 1]
[3]=111;f 0[1]
[4]=179;
f0[1]
[5]=0;//Li nea2
f0[
2] [0]=0;f 0[2][1]=179;f0[2][2]=167;f0[ 2]
[3]=167;f 0[2]
[4]=179;
f0[1]
[5]=0;//Li nea3
f0[
3] [0]=0;f 0[3][1]=0;f0[3][
2]=92;f 0[3][
3]=47;f 0[3][
4]=0;f 0[
3][
5]=
0;//Linea4

col
or=1;//Col
ordegraf
ico

pal
abra=" MUUUUUU!
";//Def
ini
mosels
tri
ngpal
abraqueut
ili
zaremosl
uegoen l
a
f
uncion habl
ar(
)
}

Esoestodo,bi
en s
imple.Ahorat
enemosquehacerl omismocon elpat
o,s
olocambi
a
l
agrafi
ca.Primerodef
inimosentoncesl
acl
aseen elheader.
h:

#i
fndef PATO_
H //Def i
nimosPATO_H
#def
ine PATO_H //I
niciamosdef
ini
cion

cl
asspat
o:vi
rtualpubl
icani
mal
es{

publ
ic:
pato(
);//Cons
truct
orcl
ase

}
;

#endi
f//Cerramos

Y hacemosl
omi smoquecon vaca,comol aúnicafunci
ón esl
adeconst
rucci
ón de
cl
aseeslaúnicaquenecesi
tamosdeclararbl
oque,asíquelohacemos
,vamosentonces
acrearelpato.
cpp paraes
o:
#i
ncl
ude "
pat
o.h"//I
ncl
uimosheader(
def
ini
cion cl
ase)

#i
ncl
ude <i
ost
ream>

pat
o::
pat
o()
{

//Grafi
coPat
o
f0[
0][0]=0;f 0[0][
1]=0;f 0[
0][2]=95;f0[
0][3]=95;f0[
0][4]=0;f0[
0][
5]=
0;//Linea1
f0[
1][0]=62;f 0[1][1]=40;f0[
1][2]=239;f0[1]
[3]=0;f0[
1][4]=41;
f0[1]
[5]=0;//Li nea2
f0[
2][0]=0;f 0[2][
1]=0;f 0[
2][2]=41;f0[
2][3]=47;f0[
2][4]=0;f0[
1][
5]=
0;//Linea3
f0[
3][0]=0;f 0[3][
1]=0;f 0[
3][2]=92;f0[
3][3]=47;f0[
3][4]=0;f0[
3][
5]=
0;//Linea4

col
or=4;//Col
ordegraf
ico

pal
abra="
CUAK!
!";//St
ringpal
abraqueus
aremosalhabl
ar
}

Ahoravamosal aúni
caclasequetieneun pequeñocambi o,recordemosqueelchancho
comíadiferent
e,porl
ot antolecreamosunaf uncion comerespecial,es
oserí
atodolo
dif
erent
e.Vamosadecl ararlacl
aseentoncesen elheaderchancho. ha.
cpp:

#i
fndef CHANCHO_
H //DeclaramosCHANCHO_H
#def
ine CHANCHO_H //I
nici
amosdecl
araci
on

cl
asschancho:
virt
ualpubl
icani
mal
es{

publi
c:
chancho(
);//Cons
truct
or
inl
inevoi
d comer(
);//Funci
on comeres
peci
alparachancho

};
#endi
f

Ahoravamosacrearelarchi
vo.cpp quecont
ienel
asfunci
ones,en és
tecasoseran 2
f
uncionescomovemos
,elconstruct
oryl adecomer.Asiquedaentonceschancho.
cpp:
#i
ncl
ude "chancho.
h"//I
ncl
uimosheader
#i
ncl
ude <ios
tream>

chancho:
:chancho(
)
{

//Graf i
coChancho
f0[0][0]=94;f 0[0][1]=0;f0[0][2]=0;f0[0][3]=0;f0[0][4]=0;f0[0][5]=
94;//Li nea1
f0[1][0]=0;f 0[1][
1]=46;f 0[1][2]=0;f0[1][3]=0;f0[1][4]=46;f0[1][5]=
0;//Li nea2
f0[2][0]=0;f 0[2][
1]=46;f 0[2][2]=167;f0[ 2]
[3]=167;f 0[2]
[4]=46;
f0[1][5]=0;//Li nea3
f0[3][0]=0;f 0[3][
1]=0;f 0[3][
2]=0;f 0[3][
3]=0;f 0[3][
4]=0;f 0[3][
5]=0;
//Linea4

col
or=5;//Col
ordegrafi
co
pal
abra="OI
NK";//As
ignamosdat
ocorres
pondi
ent
ealSt
ringpal
abra

voi
d chancho::
comer(void)//Funcion comerespeci
alparaelchancho
{
gotoxy(
coordenadas[0],coordenadas[1]+5);//Debajodelchanchodi
buj
ar
cout<<"
HMFPMPF" ;//Ruidodecomeres peci
al
}

Buenísi
mo,ahoracrearemosunat ercerclase,l
acualcont endraeljuego,l al
lamare
"gameloop"porcapricho,yesdondet endremosalgunasf unci
onesdelj uegoasícomo
ladeclaraci
on denuestros3 obj
etos( animales)
,porlot antonecesi
tamosheredars us
caract
eristi
cas
.Primerodeclaramosl acl aseen suheadercorrespondiente:

#ifndef GAMELOOP_ H //Declaramosdefi


nici
on
#def i
ne GAMELOOP_ H //Inici
amosdefini
cion
cl
as sgamel oop :publicpat o,publi
cchancho,publ
icvaca{//Cl
asegamel
oop heredade
3 clasesderivadas
public:
gamel oop();//Cons tructor
void modi fi
car_animal es(
intcombinaci
on);//Alpres
ionarunatecl
asemodi f
icael
objetoaot racl as
e( elt i
podeani mal
)
private:
ani males*ani mal 1;//Creamoselobj etoanimal
1
ani males*ani mal 2;//Creamoselobj etoanimal
2
ani males*ani mal 3;//Creamoselobj etoanimal
3
};
#endi f//Cerramosdef inici
on
ani
mal
1->borrar_
li
nea(
);//Borramost
ext
odondehabl
an
}
}

Yaloult
imamos,l
arockeamos
,tenemostodoloqueneces
itamos.Si
mplementevamos
acrearnues
tromain.
cpp yai
nvocaralosarchi
vosdel
asclasesdenues
trojuego:

//Libreri
as
#include<iostream>
#include<cstring>
#include<cstdl ib>
#include<cstdi o>
#include<ctime>
#include<coni o2. h>
#include<unist d.h>
//Inclui
mosarchi vosdecl as
esqueas
uvezi
ncl
uyen headers
#include"animal es.cpp"
#include"chancho. cpp"
#include"pato. cpp"
#include"vaca. cpp"
#include"gamel oop. cpp"

us
ingnames
paces
td;

i
ntmai
n(i
ntar
gc,char*ar
gv[
]){

gameloop j
uego;//Creamoselobjet
oj uegodelti
pogameloop,elcuals
irecordasbi
en
adent
rocrea3 obj et
osanimalespunteroylosinici
ali
za

boolgame_
over=f
als
e;//Fl
agparadet
ermi
nari
nst
anci
adej
uego

whil
e(!game_ over)//Mient rasfl
ags eafal
soentonceselj
uegocorre
{
_
setcursortype(_ NOCURSOR ) ;//Quitarcurs
ordepant al
la
i
f(kbhit(
))//Sis epres i
onaunat ecl
a
{
switch(getch()
)//Obt enert ecl
a
{
case49://Sil aTeclaes1
juego.modi f
icar_
animal es
(1);//Enviamosparametro"1"amodi
fi
car_
ani
mal
es
break;

case50://SilaTeclaes2
juego.
modi
fi
car_animal
es(
2);
break;
case51://Tecl
a3
juego.
modi
fi
car_ani
mal
es(
3);
break;

case52://Tecl
a4
juego.
modi
fi
car_ani
mal
es(
4);
break;

case53://Tecl
a5
juego.
modi
fi
car_ani
mal
es(
5);
break;

}
}

}
ret
urn 0;
}