You are on page 1of 19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
Username

What'sNew?

Ttcdinn

Ccbivitmi Lch

ForumActions

Lptrnhchongimi

Password

Login

ngk

Nhtivo?

Help

Tutorials&Ththut

QuickLinks

Tmkimcaocp

Dinn LPTRNHC++|LPTRNHC|LPTRNHC++0X
(Xpgch)ngin(hngdnbnghnhnh)

Ththut,TutorialsvMngunC/C++/C++0x

CTutorialHngdnvitgameTetris

NuyllnutinbnghthmdinncngngCVit,vuilngtmhiulutlthamgia,ccchngdntrckhibntinhnhngkmttikhon.Bnphi
ngkthnhvintrc,hocngnhpbngtikhonfacebookcabnbnmicthgibivit,ticcnhkm.
Thch RyxHuyv5.860ngikhcthchiuny.

T1ti10trntngs46ktqu

Trang1trntngs5 1 2 3 ...

Cuicng

ti:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
Thch

Chias 19ngithchnidungny.Hylngiutintrongsbnbcabn.
Cccngcti

Display

22082010, 04:35PM

#1

tauit_dnmd

Ngygianhp:
Ni:
Bivit:

Thnhvinnhittnh

102009
CloseAll
993

HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

HngDnVitGameTETRIS
nGin
ViNgnNgC/C++TrnDOS
Xinchoccbn!
Chchnchngtacngscngiammlmgamevcngmunmnhcthvitc1hocnhiugame,nhngkhiunhthno?
,cchlmrasao?,cnnhngkinthcjkhilmgame?.lmcnhnggameln,hay,pvgiaodinthccbncthbtulmvi
nhnggamenh,ngin.Mnhchcrnglmnhvythknngvitcodecabnstngrtnhanhvbnsttinhnkhilm1gamehay
1chngtrnhtngiln.
Cinyththeokinhnghimcamnhthrtng.Ngitathngninngnht,chtbsingnngtchcpnhngkinthcnhscngy
bnnhnragitrcanhnggbnthnhcc.Mnhcngkhnggiigiangjccngchl1thngITbnhthng,nhngbtchcchunn
munchiastkinhnghimvitgamenginchoccbnnewbie(chccprothemkhngdmmamyu)
Lnuvittutnncjccbnngchmnha.
Writer:tauit_dnmd
Email:tauit.dnmd@gmail.com.
Uitstudent.com&congdongcviet.com
Liniu
TrongTutnymnhshngdnchoccbnchititcchlmgameXpGchtrnDosnhthno:tmtgame chncutrcd
liu codehonchnh.
TisaomnhlibtuvigametrnDOS(mnhnhconsole)?Tiv:mnhmunaicngcthchiucciTUTny,vlmtrnDOSri
thchuynqualmcgiaodinthrtngin.MnhcngcodegamenytrnDosvWinform(viC#).CodedemotrnC/C++cagameny
mnhlylicamnhcodehimihcC/C++nncthnkhngchayvchuncholm(vmihcthaimchg.hihihi).
.tinvthunlikhitheodiTutnyccbncnphibitcchhotngvcchchigameXpGch(Tetris)Loinginy(Vtetris
crtnhiubinthvlutchikhcnhau).
hiurlutcagameccbnticinyvchilhiu:
+DOSversion:TetristrnC[Baogmcsourcecode]
+Winformversion(C#+GDI+):GameMagicblocks
MnhvittrnComplierlMicrosoftVisualStudio2008nn1shmchcBC,TCskhngxicnnmnhsdng1thvinngoi
(ngitavitli1shmmtcndng).Cchmcchatrongfilesupport.cpp.

I/Tmhiucutrcgame.
Lutlcagamemmnhstrnhby:
+GamemphnggameXpGch(Tetris),nhimvcangichildichuyncckhigchangrittxungtrongkchthchnhch
nht18hngx10ct(trnmnhnh).Chnocgchrithkhngdichuynctivtr.
+Ngichicgngxpcnhnghngynhngvingch.Nuxpc1hngsccngimvhngsbxa.
+Nukhigchkhngthrtxungcnathnumvnchahinhtramnhnhthngichisthua
ChngtasixemcigameTetriscnhngjno?Cchqunlrasao?.Ccbncoisciny

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

1/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Cigiaodinchigame,ccbncththyncchiarathnhtngvungnh,vcttcl18x10nhth,vccbncththyrng
cccthcvunghockhngcvung.Thcrakchthcmnhnhchigamenykhngphicnh,ngivitgamecthchn1
kchthckhccngc.Nhngytchndng18x10.
>Nhvylutrngthicatrchitatmthicthdng1mng2chiukchthc18x10(18hngx10ct).Khixtnimhay
cht(gameover)tachcnxttrnmatrnBoardnythi.
VD:intBoard[18][10]
MiBoard[i][j]sidincho1vungnhvchagitr0hoc1:
+0:chacvungnhno.
+1:cvungnh.
Vdvicihnhdemodiy:

>Nhngbncngthyrng,clckhigchcachngtahinc1phnlnmatrnkchthc18x10(18hngx10ct)thingkhng
no?
VD:Tackhihnhvungmichhinra1natrnmatrnthi:

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

2/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Vy1natrnu?Tabitmngkhngcchsmngkhngno.Thccht,dqunlthmnhschnthm4hngvnanghal
thayvdngmatrnBoard[18][10]thdngmatrnBoard[22][10].Khi4hngutin(0>3)cdnglmvtrtmchocckhigchcc
phncakhigchmnmtrongkhuvc4hngutinskhngcvlnmnhnhgame.
Vythnghamatrnsaukhiiuchnhl.

Ktlun:
+Vyqunltsdng1matrn2chiukchthc22x10(22hngx10ct)Vinghatgiithchtrn.
+VgitrcamatrnBoardchcthitlpkhi1khigchkhngthrixungcna.Cntrongqutrnhkhigchrithgitrcama
trntikhngthayi(vnl0)
*Qunlkhigch:
ChngtabitgameXpGchc7loihnh:vung,chZ,hnhchL,thngng(gingcygy)Tathymikhigchccutot4
hnhvungnhxplivinhau.Tacthcoicckhigchnhlnhnghnhchnhtckchthckhcnhau.
Davokchthckhimmnhschiathnh3loikhicbn:

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

3/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Cchnhkhcctorakhixoaycckhicbnnyccgctngng90o,180o,270o.Khixoaythcnghatasxoaymatrntrngthi1
gc90o.
VvydqunlcckhicngnhxydngccphngthcxoaykhichngtasdngmtmatrnckchthcRowxCol(Rowhngx
Colct)xcnhhnhdnghinticamtkhigilMaTrnTrngThi.titkimthmnhsdngbnhng:
VD:
C++Code:

SelectAll|Show/Hide

int**arr

chnghn,khicnkchthcbaonhiuthtacpphtbynhiu.Vnhgiiphngbnhkhikhngcnxina.
Mtkhigch,gitrcamatrntrngthicxcnhlvtrnolgchscnhs1,khngcgchnhs0.

Nguynlkhitokhigch:
Sdngnguynlxlbitxydng.Matrntrngthisctrngchokhigch.tomatrntrngthichotngkhigchtasdng
phpxlbit,sdng(RowxCol)bitcnhstbtcaonhtttriquaphivttrnxungdixcnhkhi.

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

4/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Do,mikhigch(mihnhdngkhigch)cbntac7loikhicbnsc7considinchon.

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

5/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

II/Tchcchngtrnh,chncutrccit.
PhnIchngtacnissquatng,cutrccagameTetrisnyri.PhnIItshngdncchvitcodevtchcgame.
1/Cchmbtr
Vtronggamemnhcsdngcchmnhgotoxy(),textcolor(),delay()mtrongVS2k8khngcnnphivitlicchmny.Cc
hmnychlphthinnchngtachpcodevlc,khngcnphihiucchmnyhotngrasaoc.
Sauylcodemucacchmny.
VisualC++Code:

SelectAll|Show/Hide

1. enum
2. {
3. BLACK,
4. BLUE,
5. GREEN,
6. CYAN,
7. RED,
8. PURPLE,
9. GRAY,
10. WHITE,
11. LIGHTGRAY,
12. LIGHTBLUE,
13. LIGHTGREEN,
14. LIGHTCYAN,
15. LIGHTRED,
16. LIGHTPURPLE,
17. LIGHTYELLOW,
18. LIGHTWHITE
19. };
20. voidgotoxy(intx,inty)
21. {
22. COORDc;
23. c.X=x1;
24. c.Y=y1;
25. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
26. }
27. voidclrscr()
28. {
29. COORDcoord;
30. DWORDwritten;
31. CONSOLE_SCREEN_BUFFER_INFOinfo;
32.
33. coord.X=0;
34. coord.Y=0;
35. GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&info);
36. FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),'',
37. info.dwSize.X*info.dwSize.Y,coord,&written);
38. gotoxy(1,1);
39. }
40. voidtextcolor(WORDcolor)
41. {
42. HANDLEhConsoleOutput;
43. hConsoleOutput=GetStdHandle(STD_OUTPUT_HANDLE);
44.
45. CONSOLE_SCREEN_BUFFER_INFOscreen_buffer_info;
46. GetConsoleScreenBufferInfo(hConsoleOutput,&screen_buffer_info);
47.
48. WORDwAttributes=screen_buffer_info.wAttributes;
49. color&=0x000f;
50. wAttributes&=0xfff0;
51. wAttributes|=color;
52.
53. SetConsoleTextAttribute(hConsoleOutput,wAttributes);
54. }
55. voidSetBGColor(WORDcolor)
56. {
57. HANDLEhConsoleOutput;
58. hConsoleOutput=GetStdHandle(STD_OUTPUT_HANDLE);
59.
60. CONSOLE_SCREEN_BUFFER_INFOscreen_buffer_info;
61. GetConsoleScreenBufferInfo(hConsoleOutput,&screen_buffer_info);
62.
63. WORDwAttributes=screen_buffer_info.wAttributes;
64. color&=0x000f;
65. color<<=4;
66. wAttributes&=0xff0f;

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

6/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
67. wAttributes|=color;
68.
69. SetConsoleTextAttribute(hConsoleOutput,wAttributes);
70. }
71. voiddelay(intx){Sleep(x);}
72.
73.
74. voidNocursortype()
75. {
76. CONSOLE_CURSOR_INFOInfo;
77. Info.bVisible=FALSE;
78. Info.dwSize=20;
79. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&Info);
80. }

2/Cutrcgame
MnhschncchvitcodegamenydngStructure.Mcdtheomnhthydngclasssdqunlvnhntrcquanhn.Nhngnhiubn
chahchngitng(OOP)nndngStructurelhplchoccbn.Dngstructurenn1schmnhtchcqunlchattnnccban
thngcmnha.ngchmemmtinghip.
NhmnhniphnIthgamescqunlchungbng1matrnBoard[22][10].Domnhskhaibomatrnnylkiuint,vl
bintoncc.
C++Code:
SelectAll|Show/Hide
1. #defineMaxI22
2. #defineMaxJ10
3. intBoard[MaxI][MaxJ];

xcnhvtrvkhungmnhnhchigame(tngngvimatrnmap)lnmnhnhconsole.LurngnhmnhnithBoardc
kchthc[22][10]nhngthtschvlnmnhnhkchthc18x10tabi4hngutrongmatrnBoardi(cindexti=0>3).
Takhaibo:
C++Code:
SelectAll|Show/Hide
1. #defineLEFT4
2. #defineTOP4

dhnhdungthbnbit.Mnhnhconsoleckchthcl25hngx80ct.

Sauylhmvcikhunghinthlnmnhnh.
C++Code:

SelectAll|Show/Hide

1. voidDrawBoard()
2. {
3. inti,j;
4. for(i=LEFT;i<=LEFT+10+1;i++)
5. for(j=TOP;j<=TOP+18+1;j++)
6. {
7. if((j==TOP||j==TOP+18+1)&&i>LEFT&&i<LEFT+10+1)
8. {
9. gotoxy(i,j);textcolor(7);cprintf("%c",205);
10. }
11. if((i==LEFT||i==LEFT+10+1)&&j>TOP&&j<TOP+18+1)
12. {
13. gotoxy(i,j);textcolor(7);cprintf("%c",186);
14. }
15. }
16. gotoxy(LEFT,TOP);textcolor(LIGHTRED);cprintf("%c",219);
17. gotoxy(LEFT+10+1,TOP);textcolor(LIGHTRED);cprintf("%c",219);
18. gotoxy(LEFT,TOP+18+1);textcolor(LIGHTRED);cprintf("%c",219);
19. gotoxy(LEFT+10+1,TOP+18+1);textcolor(LIGHTRED);cprintf("%c",219);
20.
21. }

Cihmnysvlnmnhnhnhthny:

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

7/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Hmvtrngthimatrncagame.NuBoard[i][j]=1(nghalcgchy)viphi>=4thvktcmASCII=2(hnhmtci)ln
mnhnh.ngclithkhngvlnmnhnh.
C++Code:
SelectAll|Show/Hide
1. voidDisplayBoard()
2. {
3. inti,j;
4. for(i=0;i<MaxI;i++)
5. for(j=0;j<MaxJ;j++)
6. {
7. if(Board[i][j]==1&&i>=4)
8. {
9. gotoxy(j+LEFT+1,i+TOP+14);textcolor(15);cprintf("%c",2);
10. }
11. if(Board[i][j]==0&&i>=4)
12. {
13. textcolor(BLACK);gotoxy(j+LEFT+1,i+TOP+14);cprintf("");
14. }
15. }
16. }

ikhilnshotngtngtnhvdmtbndi.

Khixpc1hngythtaphixahngvcpnhtligitrchomatrnBoardlichong.
C++Code:
1.
2.
3.
4.
5.
6.
7.
8.
9.

SelectAll|Show/Hide

voidCapNhatLaiToaDo(inthang)
{
inti,j;
for(i=hang;i>0;i)
for(j=0;j<MaxJ;j++)
{
Board[i][j]=Board[i1][j];
}
}

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

8/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Structurequnlkhigch:
Nhnitngtrn,mnhscodehacutrcnhsau:
C++Code:
1.
2.
3.
4.
5.
6.

SelectAll|Show/Hide

typedefstruct
{
int**arr;
intRow,Col;
intiBoard,jBoard;
}KhoiGach;

+arrl1contrmtMaTrnTrngThichotngloikhigch:4x1,2x2,2x3.Cn2binRow,Colthhinkchthccamatrntrng
thi(arr,Row,Colschobithnhdngcakhigchlhnhj).Matrnnydngkimtravachmkhidichuynkhigch,xoaykhigch
+iBoard,jBoard:chobitvtrhinticaKhiGchangnmutrnmatrnBoard[22][10]chnhlvtrcaarr[0][0]sovimatrn
Board[22][10].KhimikhitokhigchthiBoard,jBoardsnmkhuvckhngchinth.

MnhphntchphnIrngmnhsdng1constngtrngchotngkhigch.Khibitsidincanthtachcndngphp
tondchbtsuyramatrntrngthicachng.
+15:Thngng
+31:Hnhvung
..

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

9/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Hmkhitothngs1khigchtngngvisIDcan:
C++Code:

SelectAll|Show/Hide

1. KhoiGach*TaoKhoiGach(intID)
2. {
3. KhoiGach*pkhoigach=(KhoiGach*)malloc(sizeof(KhoiGach));
4. switch(ID)
5. {
6. case15:
7. pkhoigach>Row=4;
8. pkhoigach>Col=1;
9. pkhoigach>iBoard=0;
10. pkhoigach>jBoard=5;
11. break;
12. case31:
13. pkhoigach>Row=pkhoigach>Col=2;
14. pkhoigach>iBoard=2;
15. pkhoigach>jBoard=5;
16. break;
17. default:
18. pkhoigach>Row=2;
19. pkhoigach>Col=3;
20. pkhoigach>iBoard=2;
21. pkhoigach>jBoard=5;
22. break;
23. }
24. pkhoigach>arr=(int**)malloc(pkhoigach>Row*sizeof(int*));
25. for(inti=0;i<pkhoigach>Row;i++)
26. {
27. pkhoigach>arr[i]=(int*)malloc(pkhoigach>Col*sizeof(int));
28. }
29. for(intk=0;k<pkhoigach>Col*pkhoigach>Row;k++)
30. {
31. pkhoigach>arr[k/pkhoigach>Col][k%pkhoigach>Col]=(ID>>(pkhoigach>Col*pkhoigach>Row1k))&1;
32. }
33. returnpkhoigach;
34. }

on:
C++Code:
1.
2.
3.
4.
5.

SelectAll|Show/Hide

pkhoigach>arr=(int**)malloc(pkhoigach>Row*sizeof(int*));
for(inti=0;i<pkhoigach>Row;i++)
{
pkhoigach>arr[i]=(int*)malloc(pkhoigach>Col*sizeof(int));
}

Chlcpphtbnhchomatrntrngthithi.ChchnccbnsthcmcrngnucID=58thsaocthtoramatrntrngthil:
OutputCode:

SelectAll|Show/Hide

111
010

Rtnginthi:
Vd:viID=58thkhigchscmatrntrngthil2x3.Row=2,Col=3.
OutputCode:

SelectAll|Show/Hide

000
000

Banumatrntrngthiarr:
VRowxCol=2x3=6(bit).Nntai58sangsnhphn6dibitl:111010
oncode:
C++Code:

SelectAll|Show/Hide

1. for(intk=0;k<pkhoigach>Col*pkhoigach>Row;k++)
2. {
3. pkhoigach>arr[k/pkhoigach>Col][k%pkhoigach>Col]=(ID>>(pkhoigach>Col*pkhoigach>Row1k))&1;

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

10/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
4. }

+Tont>>ltontdchbtsangphi.
+arr[k/Col][k%Col]=(IDdchsangphi(RowxCol1k)bit)&1//(phpANDtrongtinhcchcaicngbit)
Vik=0:[arr[k/Col][k%Col]=arr[0][0].
58dchsangphi(610)bt=111010dchsangphi5bitl000001.Saukthpvi000001&1thktqusl1.>Vyarr[0][0]=1
OutputCode:
SelectAll|Show/Hide
100
000

Vik=1:[arr[k/Col][k%Col]=arr[0][1].
58dchsangphi(611)bt=111010dchsangphi4bitl000011.Saukthpvi000011&1thktqusl1.>Vyarr[0][1]=1
OutputCode:
SelectAll|Show/Hide
110
000

Vik=2:[arr[k/Col][k%Col]=arr[0][2].
58dchsangphi(612)bt=111010dchsangphi3bitl000111.Saukthpvi000111&1thktqusl1.>Vyarr[0][2]=1
OutputCode:
SelectAll|Show/Hide
111
000

Vik=3:[arr[k/Col][k%Col]=arr[1][0].
58dchsangphi(613)bt=111010dchsangphi2bitl001110.Saukthpvi(001110)&1thktqusl0.>Vyarr[1][0]=0
OutputCode:
SelectAll|Show/Hide
111
000

Vik=4:[arr[k/Col][k%Col]=arr[1][1].
58dchsangphi(614)bt=111010dchsangphi1bitl011101.Saukthpvi(011101)&1thktqusl1.>Vyarr[1][1]=1
OutputCode:
SelectAll|Show/Hide
111
010

Vik=5:[arr[k/Col][k%Col]=arr[1][2].
58dchsangphi(615)bt=111010dchsangphi0bitl111010.Saukthpvi(111010)&1thktqusl0.>Vyarr[1][2]=0
OutputCode:
SelectAll|Show/Hide
111
010

Vycuicng:tacmatrntrngthidngviconsID=58.VicckhigchmangIDkhcthcchlmcngtngtthi
Hmkimtravachmkhidichuynkhigchsangtri,sangphi,rixung:
tng:
+xcnhxem1vtri,jtrnmatrnBoardcdichuynsangtrichaykhngthtaxemlinkbntri(chnhlvtri,j1)
cancgchhaycha,nucgchthkhngdichuync(a[i][j]=1thcgchvngclia[i][j]=0lkhngcgch).Dichuynsang
phihayxtrixungcngtngtnhththi(cngxtlinkbnphii,j+1hoclinkbndii+1,j)
+Nhvyxtnguynkhigch(gm4gchnh)cthdichuyncthttcccgchnhfaidichuync,nuc1khngdi
chuyncthkhigchkhngthdichuync.

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

11/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
C++Code:

SelectAll|Show/Hide

1. intInside(inti,intj)//Xemi,jcthucmngBoard[22][10]haykhng?
2. {
3. return(i>=0&&i<MaxI&&j>=0&&j<MaxJ);
4. }
5. intLeft(inti,intj)
6. {
7. if(j>0&&Inside(i,j)&&Board[i][j1]==0)return1;
8. return0;
9. }
10. intRight(inti,intj)
11. {
12. if(j<MaxJ1&&Inside(i,j)&&Board[i][j+1]==0)return1;
13. return0;
14. }
15. intDown(inti,intj)
16. {
17. if(i<MaxI1&&Inside(i,j)&&Board[i+1][j]==0)return1;
18. return0;
19. }

+Hmtrnmichxt1dichuyncho1(i,j)thi.Sauyslhmxtdichuynchottckhigch.
Note:
+1khigchchdichuynsangtrivphikhikhngnmtrongkhuvckhngchinth(nghaliBoard>3).
+i,jtrnmatrntrngthicvtrtngngtrnmatrnBoardl:
pkhoigach>iBoard+i,pkhoigach>jBoard+j:

C++Code:

SelectAll|Show/Hide

1. voidSangTrai(KhoiGach*pkhoigach)
2. {
3. for(inti=0;i<pkhoigach>Row;i++)
4. for(intj=0;j<pkhoigach>Col;j++)
5. if(pkhoigach>arr[i][j]==1)
6. {
7. if(Left(pkhoigach>iBoard+i,pkhoigach>jBoard+j)==0||pkhoigach>iBoard<=3)return;
8. }
9.
10. pkhoigach>jBoard=1;//Dichvitricuabangtrangthaisangtrai1sovoiBoard[22][10].
11. }
12. voidSangPhai(KhoiGach*pkhoigach)
13. {
14. for(inti=0;i<pkhoigach>Row;i++)
15. for(intj=0;j<pkhoigach>Col;j++)
16. if(pkhoigach>arr[i][j]==1)
17. {
18. if(Right(pkhoigach>iBoard+i,pkhoigach>jBoard+j)==0||pkhoigach>iBoard<=3)return;
19. }
20.
21. pkhoigach>jBoard+=1;//Dichvitricuabangtrangthaisangphai1sovoiBoard[22][10].
22. }
23. intRoiXuong(KhoiGach*pkhoigach)//0:khngthrixung,1:cthrixung.
24. {
25. for(inti=0;i<pkhoigach>Row;i++)
26. for(intj=0;j<pkhoigach>Col;j++)
27. if(pkhoigach>arr[i][j]==1)
28. {
29. if(Down(pkhoigach>iBoard+i,pkhoigach>jBoard+j)==0)return0;
30. }
31. pkhoigach>iBoard+=1;//Roixuong1sovoiBoard[22][10]
32. return1;
33. }

HmgngitrchomatrnBoardkhikhigchkhngrixungcna:Khivinhngarr[i][j]==1camatrntrngthithta
gngitrbng1choBoard[i][j].Vi(i,j)ltatngngca(i,j)trnmatrnBoard,mcchimnhnitrnri.
C++Code:
SelectAll|Show/Hide
1.
2.
3.
4.
5.

voidGanGiaTri(KhoiGach*pkhoigach)
{
for(inti=0;i<pkhoigach>Row;i++)
for(intj=0;j<pkhoigach>Col;j++)
if(pkhoigach>arr[i][j]==1)

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

12/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
6.
7.
8.
9.

{
Board[pkhoigach>iBoard+i][pkhoigach>jBoard+j]=1;
}
}

Haizz,tiythtacnggnxongnhngcicbncagameXpGchri.Chngtastihmxoaykhigchnalcoinhxong.Cixoay
khigchnyrtd,bnnolmbixoaymatrn2chiu1gc90otheochiukimnghrithcinyrtdhiu.
Hmxoay:Xoaykhigchthcchtccbnchcnxoaymatrntrngthicakhigch1gc90otheochiukimnghthi,vmatrn
ykhngphilmatrnvungnnkhixoaythkchthccamatrnsbthayiRow=Col,Col=Row.Tachcnvit1hmxoayduy
nhtthcthxoaycttcccloikhigch(7loicbnvcckhikhicxoaykhc).Chngtasxoaythmatrntrngthivsau
xtxemvtrcamatrnsaukhixoaytngngtrnmatrnBoardchplhaykhng(khngclnBoard[i][j]==1novkhng
vtrakhigiihncaBoard).Nuhplthmichpnhn,cnngclithvnginguynmatrntrngthinhbanu.
+VtrcvsaukhixoaythiBoard,jBoardkhngthayigitr(vnginguyn)cinylcchmnhchnchod(vxl,rcrithm)
thi.Chccbncthchncchkhcxoaychophn.Vccbncoicihnhmtdiy.

C++Code:

SelectAll|Show/Hide

1. voidXoayKhoiGach(KhoiGach*pkhoigach)
2. {
3. inti,j;
4. int**tmpArr;
5. inttmpRow=pkhoigach>Col;
6. inttmpCol=pkhoigach>Row;
7. //CpphtbnhchomatrnphtmpArr.
8. tmpArr=(int**)malloc(tmpRow*sizeof(int*));
9. for(i=0;i<tmpRow;i++)
10. {
11. tmpArr[i]=(int*)malloc(tmpCol*sizeof(int));
12. }
13. ///////////////////////////////////////////////
14. for(i=pkhoigach>Row1;i>=0;i)
15. for(j=pkhoigach>Col1;j>=0;j)
16. {
17. tmpArr[j][pkhoigach>Rowi1]=pkhoigach>arr[i][j];
18. }
19. //Kimtrahpl.
20. for(i=0;i<tmpRow;i++)
21. {
22. for(j=0;j<tmpCol;j++)
23. if(!Inside(pkhoigach>iBoard+i,pkhoigach>jBoard+j)||Board[pkhoigach>iBoard+i][pkhoigach>jBoard+j]==1)
24. return;
25. }
26. for(i=0;i<pkhoigach>Row;i++)free(pkhoigach>arr[i]);
27. free(pkhoigach>arr);
28. //Cpnhtthayisaukhixoay.
29. pkhoigach>Col=tmpCol;
30. pkhoigach>Row=tmpRow;
31. pkhoigach>arr=tmpArr;
32.
33. }

Khilmvicvibnhngthccbnnncnthnxincpphtxongvkhikhngxinathphigiiphngbnhtrnhtnhtrng
memoryleak.
Hmv,xakhigchlnmnhnhconsole:MnhnitrnthmnhdngbinLEFT,TOPxcnhvtrvmatrnBoardlnmnhnh
console.
C++Code:
SelectAll|Show/Hide
1. voidVeKhoiGach(KhoiGach*pkhoigach)
2. {
3. inti;
4. intj;
5. for(i=0;i<pkhoigach>Row;i++)
6. for(j=0;j<pkhoigach>Col;j++)
7. if(pkhoigach>arr[i][j]==1&&(pkhoigach>iBoard+i)>3)
8. {
9. textcolor(LIGHTRED);
10. gotoxy(LEFT+pkhoigach>jBoard+j+1,TOP+pkhoigach>iBoard+i3);
11. cprintf("%c",2);
12. }
13. }
14. voidXoaKhoiGach(KhoiGach*pkhoigach)
15. {
16. inti;
17. intj;
18. for(i=0;i<pkhoigach>Row;i++)
19. for(j=0;j<pkhoigach>Col;j++)
20. if(pkhoigach>arr[i][j]==1&&(pkhoigach>iBoard+i)>3)
21. {
22. textcolor(BLACK);

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

13/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
23. gotoxy(LEFT+pkhoigach>jBoard+j+1,TOP+pkhoigach>iBoard+i3);
24. cprintf("");
25. }
26. }

3/Thngtinvim,cp,tc.
Gamethkhngththiuphntnhimvthngtinlevel.tngtnhhpdnchogame.Diymnhdemo1cchtnhimvkh1
cchrtnginchogame.Ciphnnyccbncthtychnhtheomnh.Mnhkhaibo1structureluthngtin.
C++Code:
SelectAll|Show/Hide
1.
2.
3.
4.
5.
6.

typedefstruct
{
intscore;
intlevel;
floatspeed;
}INFO;

+Mnhschiagameralm2cp:Cp1:0>200Cp2:200>300
+Mihngncsc+10.
+KhitngLevelthspeedcngnhanhhn1cht.
+Nuc300trlnthWingame.
Cchmbtr:
C++Code:

SelectAll|Show/Hide

1. voidInitGame(INFO*info)
2. {
3. info>level=1;
4. info>score=0;
5. info>speed=0.4;
6. }
7.
8. intCapNhat(INFO*info,intscore)
9. {
10. info>score+=score;
11. if(info>score>=200&&info>level<2)
12. {
13. info>level++;
14. info>speed=0.1;
15. }
16. return0;//Chuawingame.
17. }
18. voidVeBangDiem(INFOinfo)
19. {
20. textcolor(LIGHTYELLOW);
21. gotoxy(LEFT+MaxJ+2,10);cprintf("SCORE:%3d",info.score);
22. gotoxy(LEFT+MaxJ+2,11);cprintf("LEVEL:%3d",info.level);
23. gotoxy(LEFT+MaxJ+2,12);cprintf("SPEED:%3f",info.speed);
24. }

Kimtragameoverhaykhngvtnhtonshngnim:Khikhigchkhngthrixungcnathtakimtra:
+GamektthckhikhigchkhngrixungcnamiBoardvn<=3.>thGameover.
+Nuchagameover,taxtxemcnchngnokhng?TakhngcnphixthtttccchngcamatrnBoard[22][10](vnhvy
tnchiph)mchcnkimtralnltcchngiBoard+0,iBoard+1,,,iBoard+Row1lOK.NuhngnocMaxJcgitrbng1th
hngnimc.
+nnhiunhtchc4hng/1ln.
C++Code:
SelectAll|Show/Hide
1. intKiemTra(KhoiGach*pkhoigach,INFO*infogame)//1:gameover0:win
2. {
3. inti,j,count;
4. i=pkhoigach>Row1;
5. if(pkhoigach>iBoard<=3)return1;//Gameover
6. if(infogame>score>=300)return0;//Win
7. do
8. {
9. count=0;
10. for(j=0;j<MaxJ;j++)
11. {
12. if(Board[pkhoigach>iBoard+i][j]==1)count++;
13. }
14. if(count==MaxJ)
15. {
16. CapNhat(infogame,20);
17. CapNhatLaiToaDo(pkhoigach>iBoard+i);
18. DisplayBoard();
19. }
20. else
21. {
22. i=i1;
23. }
24. }while(i>=0);
25. return1;
26. }

Hmtrv1nugameover,trv0nungichiwin(score>=300).VtrongstructureKhoiGachcsdngcontr(arrmatrntrngthi)
cpphtngnnmnhsphivit1hmgiiphngbnhtrnhvicmemoryleak.
C++Code:

SelectAll|Show/Hide

1. voidHuyKhoiGach(KhoiGach*pkhoigach)
2. {
3. inti;
4. //Huybonhocuamatrantrangthaiarr.
5. for(i=0;i<pkhoigach>Row;i++)free(pkhoigach>arr[i]);
6. free(pkhoigach>arr);
7. /////////////////////////////////////////////////////////
8. //Saudomoifree(pkhoigach)
9. free(pkhoigach);
10. pkhoigach=NULL;
11. }

4/Chnngunhinkhigchvkhigchtiptheosxuthin.
Hmnysrandom1khigchchi.Trvsidinchokhigch.
C++Code:

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

SelectAll|Show/Hide

14/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
1. intLoai()
2. {
3. intx=rand()%7;
4. switch(x)
5. {
6. case0:
7. return15;
8. break;
9. case1:
10. return31;
11. break;
12. case2:
13. return51;
14. break;
15. case3:
16. return30;
17. break;
18. case4:
19. return58;
20. break;
21. case5:
22. return57;
23. break;
24. case6:
25. return60;
26. break;
27. }
28. }

Hmv,xakhigchtiptheosxuthin:
C++Code:

SelectAll|Show/Hide

1. voidVe_Next(intID)
2. {
3. KhoiGach*pnext=TaoKhoiGach(ID);
4. intiRoot=LEFT+MaxJ+5;
5. intjRoot=TOP;
6. for(inti=0;i<pnext>Row;i++)
7. {
8. for(intj=0;j<pnext>Col;j++)
9. {
10. if(pnext>arr[i][j]==1)
11. {
12. textcolor(LIGHTGREEN);
13. gotoxy(iRoot+j,jRoot+i);cprintf("%c",2);
14. }
15. }
16.
17. }
18. HuyKhoiGach(pnext);
19. }
20. voidXoa_Next()
21. {
22. intiRoot=LEFT+MaxJ+5;
23. intjRoot=TOP;
24. for(inti=0;i<4;i++)
25. {
26. for(intj=0;j<4;j++)
27. {
28.
29. textcolor(BLACK);
30. gotoxy(iRoot+j,jRoot+i);cprintf("");
31. }
32.
33. }
34. }

Ktlun:
+Coinhgamehonthnhnhngphncbn.Bygitaghpccthnhphnlivinhauvvitbtuvithmmainchogamechythi.
5/Cngviccuicng:Vithmmainvvnglpcagame.
Victohiungchuynngldovicxac,vmikthpvihmdelay()cttrong1vnglptonncmgicchuynng.
bitckhinobnphmcnhnvphmnocnhntadnglnh_kbhit()vgetch()bt.Tronggamenymnhquynhl:
+Phmdichuynsangtril:A(ASCII=65)
+Phmdichuynsangphil:D
+Phmxoaykhil:W
+Phmtngtcril:S
oncodexlnhnbnphm:
C++Code:
SelectAll|Show/Hide
1. if(_kbhit())//Nubnphmcnhn
2. {
3. c=toupper(getch());//Lymphmvacbm
4. XoaKhoiGach(currKhoi);//Xakhigch
5. switch(c)
6. {
7. case'W':
8. XoayKhoiGach(currKhoi);
9. break;
10. case'A':
11. SangTrai(currKhoi);
12. break;
13. case'D':
14. SangPhai(currKhoi);
15. break;
16. case'S':
17. RoiXuong();
18. break;
19. }
20. VeKhoiGach(currKhoi);//Vlikhigchsaukhicpnhtthayi.
21. }

*Vnglpchogame:
Khitogitrbanuchogame.Vkhunggiaodin.Khitoccthamslevel,score,speed.
Nguynbncgibitauit_dnmd

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

15/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
Do
{
VlikhigchvmatrnBoardlnmnhinh.
TrongkhichahtINFO.speedthlpliqutrnh:
Nucskinnhnbnphmxyra(if(_kbhit()))th
+XaKhigch.
+Xlnhnbnphm
+Vlikhigchsaukhithayi.
Chokhigchrixung:
Nurixungkhngc:
+GngitrchomatrnBoard.Sdnghm:voidGanGiaTri(KhoiGach*pkhoigach)
+Kimtrathngthuavcpnhtliim.Nugameoverhocwinthktthctrchi.
+Hybnhcakhigchhintivsaukhitokhigchmi.
}While(!gameoverhoc!win)

Codedemovnglpcagamel:
C++Code:

SelectAll|Show/Hide

1. do
2. {
3. VeBangDiem(info);
4. VeKhoiGach(currKhoi);
5. Xoa_Next();
6. Ve_Next(IDKhoiTiepTheo);
7. Start=clock();
8. do
9. {
10.
11. if(_kbhit())
12. {
13. c=toupper(getch());
14. XoaKhoiGach(currKhoi);
15. switch(c)
16. {
17. case'W':
18. XoayKhoiGach(currKhoi);
19. break;
20. case'A':
21. SangTrai(currKhoi);
22. break;
23. case'D':
24. SangPhai(currKhoi);
25. break;
26. case'S':
27. RoiXuong(currKhoi);
28. break;
29. }
30. VeKhoiGach(currKhoi);
31. }
32. End=clock();
33. }while(float(EndStart)/CLK_TCK<info.speed);
34. XoaKhoiGach(currKhoi);
35. if(RoiXuong(currKhoi)==0)//kodichuyenxuongdc
36. {
37. GanGiaTri(currKhoi);
38. intketqua=KiemTra(currKhoi,&info);
39. if((ketqua==1||ketqua==0))break;
40. HuyKhoiGach(currKhoi);//Giaiphongbonho.
41. currKhoi=TaoKhoiGach(IDKhoiTiepTheo);
42. IDKhoiTiepTheo=Loai();
43. DisplayBoard();
44. }
45.
46. }while(1);

OK!Ccbntoprojectvchythgameno.Vylhnhnhcagamekhichy.Mnhchhngdncchqunl,xydngcutrcchng
trnhgamethi,mnhdemorttchcnng.Numunccbncthvitthmphnsave,loadgame,pausegame

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

16/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

III/KtThc
+VylxongTuthngdnvitgameTetrisviC/C++.Cmnccbntheoditutny.Mnhhivngcsnghvkincacc
bnlnsaucthvit1Tutkhchayvhpccbnhn.
+Hnccbnbivittiptheo.CthlhngdncchlmgameLine(ttcchlnucth).Vnuccopybivitnyinikhcth
xinhayghirngunvtcgi.Cmnnhunhu.
+,mnhcnhkmtheonguynprojectcagamenyvittrnVS2K8.Ccbncthtivcoi+tutnysdhnhdunghn.Mnhcngsave
Tutnythnh1file.docccbndtheodi.
Chngtrnhtiylhtri.Cmnquvquantmtheodi.Xinhngplivochngtrnhlnsau!Cmnvchotmbit
AttachedFiles
CodeTETRIS_tauit_dnmd.rar(18.6KB,3000views)
HowtomakeTetrisgame(bytauit_dnmd).doc.rar(648.4KB,3462views)

cchnhsalncuibitauit_dnmd:13052011lc08:34PM.

http://freelancer.com
Trlicngvitrchdn

25082010, 11:07PM

#2

tauit_dnmd

Ngygianhp:
Ni:
Bivit:

Thnhvinnhittnh

102009
CloseAll
993

topickhngblong.Nnccbncthcmcjcpostln,mnhscgnggiiptrongkhnngcamnh

http://freelancer.com
Trlicngvitrchdn

26082010, 10:35AM
dinhbacvip
Thnhvinmi

#3
Ngygianhp:
Ni:
Bivit:

082010
Nng
4

hihibaiviethaylam....................
Trlicngvitrchdn

17092010, 12:19PM
phongilg
Thnhvinmi

#4
Ngygianhp:
Bivit:

092010
4

Eangcngpciluthuttoncagamenymyanhgipevickhng
Trlicngvitrchdn

17092010, 04:41PM
tieuyeu_ht91
Thnhvinchnhthc

#5
Ngygianhp:
Bivit:

082010
58

Bni,ciphngotoxy()vclrscr()bngiithchrllmnhthnokhng.MnhthngdngvittrnBCnnquenkiumnliuri.
Chngtrnhbnvitrthaynhngciphntogchmihilongngongnh.Nulmnhthsdnglunmtcimng4x4chonhanh,
phicppht:P.
Trongbicumnhthyhaynhtlphnmngtrn.Sdslvicinravingchlcbanu.
Cubitgamebnxetngkhng,lmlungamedi.Hngdnmnhvi:P

Skhngbunvnhngiutachalmc...
Trlicngvitrchdn

17092010, 05:22PM

#6
Ngygianhp:

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

102009

17/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
tauit_dnmd

Ni:
Bivit:

Thnhvinnhittnh

CloseAll
993

HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)
Nguynbncgibitieuyeu_ht91

Bni,ciphngotoxy()vclrscr()bngiithchrllmnhthnokhng.MnhthngdngvittrnBCnnquenkiumnliuri.
Chngtrnhbnvitrthaynhngciphntogchmihilongngongnh.Nulmnhthsdnglunmtcimng4x4chonhanh,phicppht
:P.
Trongbicumnhthyhaynhtlphnmngtrn.Sdslvicinravingchlcbanu.
Cubitgamebnxetngkhng,lmlungamedi.Hngdnmnhvi:P
Ciphntomngtrngthicakhigchthcchmnhthylngngn,logichnmycicodetrnmngmmnhtngcoiqua.Vmnh
dngcpphtngtitkimbnhym.
Xetngthmnhchabaogilm,khinomnhlmthmnhsvitlun1bihngdnlun.

http://freelancer.com
Trlicngvitrchdn

17092010, 10:43PM

#7

phongilg

Ngygianhp:
Bivit:

Thnhvinmi

092010
4

hmnemmilmcintmhiulptrnhgametettrismkhningthyiciluthuttonanhchtopicbitnhiugipemc
khnganh
Trlicngvitrchdn

18092010, 09:56PM

#8

tauit_dnmd

Ngygianhp:
Ni:
Bivit:

Thnhvinnhittnh

102009
CloseAll
993

Nguynbncgibiphongilg

hmnemmilmcintmhiulptrnhgametettrismkhningthyiciluthuttonanhchtopicbitnhiugipemckhnganh
Cijgilluthuttonhbn?

http://freelancer.com
Trlicngvitrchdn

18092010, 10:12PM

#9

zstar

Ngygianhp:
Ni:
Bivit:

Moderator

042009
Gmcu
2,230

Nguynbncgibitauit_dnmd

Cijgilluthuttonhbn?
lulciny,hihctinicngsutngythybtv

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

18/19

13/5/2015

CTutorial:HngdnvitgameTetris(Xpgch)ngin(hngdnbnghnhnh)

Trlicngvitrchdn

20092010, 02:52PM

#10

phongilg

Ngygianhp:
Bivit:

Thnhvinmi

092010
4

Cistrnlngrinhngmphipdngvcioncodecagamenymyciluvithmmycivnglpnaa
Trlicngvitrchdn

Trang1trntngs5 1 2 3 ...
QuickNavigation

Cuicng

Ththut,TutorialsvMngunC/C++/C++0x Top

Vitbnhlun
CngnglnFacebook

ngvitcchlTuanKhoaNguyen

Bnhlun

PluginxhicaFacebook

tilintrc|tilinsau
Cctitngt
GameTetrisvitbngJava+htrchiquamng[Bitplnmnlptrnhmng]

GibiWaziArmstrongtrongdinnDn&SourcecodeJava
LptrnhgameTetrisBngCSharp

Gibinguyennam1199trongdinnNhpmnlptrnhC#,ASP.NET

Trli:8
Bivitcui:24052013,03:06PM
Trli:0
Bivitcui:01102011,10:29AM
Trli:6
Bivitcui:02052011,11:57PM

GameTetris2Dvitbngjava

GibivietductrongdinnDn&SourcecodeJava

Trli:0
Bivitcui:18122010,12:58AM

codegamexphnh(tetris)

GibivodanhuittrongdinnNhpmnlptrnhC/C++
gipemvgiithutlptrnhgametetris

GibiManhvokiemtrongdinnThcmclptrnhC/C++/C++0x

Trli:1
Bivitcui:28052010,12:16AM

Quynhncabn

Bnkhngthgitimi
Bnkhngthgibitrli
Bnkhngthgiccnhkm
Bnkhngthchnhsabivitcabn
Tmhiulutlthamgiadinn

BBcode:On
Mtci:On
[IMG]code:On
[VIDEO]codeisOn
HTMLcode:Off

BngPhn,Bngghim
Snxutbngvit,bngdingGiaohngminphtrongthnhph

Linhchngti CngngCVit Archive Top

ComputerStyle

SnglpbiKevinHoang@2006
NgunccungcpbivBulletin4.2.2
Bnquynngun2015vBulletinSolutions,Inc

TonbthigiantnhtheomiGMT+7.Bygil01:22AM.

SdngvphttrinbiCngngCVit:20062014

http://diendan.congdongcviet.com/threads/t35476::huongdanvietgametetrisxepgachdongianhuongdanbanghinhanh.cpp

19/19

You might also like