《俄羅斯方塊實(shí)習(xí)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《俄羅斯方塊實(shí)習(xí)報(bào)告.doc(16頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
計(jì)算機(jī)實(shí)習(xí)報(bào)告
姓名:劉天
班級(jí): 2010211114
學(xué)號(hào): 10210417
小班序號(hào):14
指導(dǎo)老師:丘廣暉
題目:俄羅斯方塊
俄羅斯方塊實(shí)驗(yàn)報(bào)告
一.功能說明
1.1總體功能說明
本程序主要是用VC6.0編程軟件通過Windows控制臺(tái),實(shí)現(xiàn)俄羅斯方塊這一游戲。
本程序?qū)崿F(xiàn)了俄羅斯方塊的隨機(jī)產(chǎn)生及移動(dòng)等,玩家在進(jìn)入游戲界面后,可以通過鍵盤操作這個(gè)游戲。在游戲界面右邊,寫有玩家分?jǐn)?shù)和一定的操作說明,同時(shí)內(nèi)部也有暫停和退出的設(shè)置,在玩家疲憊時(shí),可隨時(shí)停止游戲。
1.2用戶界面
(1)歡迎界面
(2)游戲界面
(3)結(jié)束界面
1.3使用方法
玩家可通過鍵盤的W、S、A、D鍵分別控制方塊的上下左右,暫停鍵是E,之后可按任意鍵繼續(xù)游戲,退出鍵則是Q。邊框右側(cè)有下一個(gè)方塊的預(yù)告。
二.程序設(shè)計(jì)說明
2.1 總體設(shè)計(jì)框架
C++程序執(zhí)行流程(總流程圖):
開 始
定義一些變量,并將部分變量初始化
定義界面函數(shù),旋轉(zhuǎn)函數(shù),移動(dòng)函數(shù)等
進(jìn)入歡迎界面
NO
按下任意鍵進(jìn)入游戲?
YES
進(jìn)入游戲界面
停留在游戲界面
按下暫停按鈕?
YES
NO
按下退出按鈕?
結(jié)束畫面
YES
2.2 關(guān)鍵算法描述
bool table[15][23]={0}; 繪制操作面板;
bool menu(); 設(shè)定游戲的初始界面(歡迎界面);
void spin(); 決定方塊的旋轉(zhuǎn);
TurnLeft()、TurnRight()、TurnDown()則是俄羅斯方塊移動(dòng)方向的判定;
typenext=rand()%7; 隨機(jī)數(shù)的產(chǎn)生,決定了方塊的形狀;
while(1); 循環(huán)的開始;
if(kbhit()); 上下左右控制的判定;
2.3 程序設(shè)計(jì)的難點(diǎn)和關(guān)鍵點(diǎn)
一、怎樣設(shè)置方塊的狀態(tài),變化等;
二、怎樣使將要產(chǎn)生的方塊與預(yù)示方塊相同;
三、方塊下落時(shí)如何判定下方已存在方塊,從而使這個(gè)方塊不在下落;
四、消行的實(shí)現(xiàn)。
2.4 調(diào)試的方法
調(diào)試中多采用斷點(diǎn)調(diào)試單步執(zhí)行的方法來查看和改正錯(cuò)誤。
2.5 程序性能評(píng)價(jià)
優(yōu)點(diǎn):
1、 游戲運(yùn)行流暢,整體較為穩(wěn)定,不會(huì)因?yàn)橥婕业恼`操作而出現(xiàn)停滯;
2、 游戲說明簡(jiǎn)單明確,上手容易;
3、 采用模塊化編程,多個(gè)文件組成整個(gè)工程;
4、 編碼中的變量、函數(shù)等名稱合理而清楚,一目了然;
不足:
1、 某些細(xì)節(jié)上還不夠精致,可能還存在bug;
2、 視覺效果一般。
3、 程序代碼的格式還不夠工整,有待提高。
4、 沒有多種界面風(fēng)格,沒有等級(jí)系統(tǒng),不夠人性化。
三.心得體會(huì)
從一開始的手無足措到一步步的攻克困難,從一開始的茫然停滯到如今的清晰明朗,小學(xué)期在時(shí)間不知不覺的流逝中,就這樣結(jié)束了。俄羅斯方塊從可以隨機(jī)出現(xiàn),到可以自動(dòng)下落,從左右移動(dòng),到可以自動(dòng)旋轉(zhuǎn),消行,加分…… 看著一個(gè)個(gè)下落的方塊,興奮的心情真的難以用語言描述。回憶著小學(xué)期的一幕幕,我慢慢的對(duì)編程產(chǎn)生了強(qiáng)烈的興趣,同時(shí),也有了把它做好的信心和決心。
我相信,我可以越做越好。
附代碼:
#include"colorConsole.h"
#include
#include
#include
#include
HANDLE handle;
WORD wColors[2];
int x1=1,x2=1,x3=1,x4=1;//
int y1=1,y2=1,y3=1,y4=1;//方塊坐標(biāo)
int type,typenext,typetemp=0;//目前方塊和下一個(gè)方塊的產(chǎn)生
int score=0,speed=10,times=0,level=0;//得分和速度等
int key;//按鍵
char scorech[10]={0};
bool flag=1;//生成新方塊判定
bool start=1;
bool table[15][23]={0}; //繪制操作面板
bool menu() //游戲的初始界面 (歡迎界面)
{
for(int o=1;o<22;o++)
{
textout(handle,2,o,wColors,1," ");
}
for(int i=21;i>0;i--)
{
for(int j=1;j<14;j++)
{
table[i][j]=0;
}
}
wColors[0]=FOREGROUND_BLUE|FOREGROUND_GREEN;
textout(handle,6,5,wColors,1,"歡迎進(jìn)入");
textout(handle,10,6,wColors,1,"俄羅斯方塊");
textout(handle,6,10,wColors,1,"請(qǐng)按任意鍵進(jìn)入游戲");
while(start)
{
if(kbhit())
{
start=0;
textout(handle,6,5,wColors,1," ");
textout(handle,10,6,wColors,1," ");
textout(handle,6,10,wColors,1," ");
}
}
return 0;
}
void erase()//清除
{
textout(handle,x1*2,y1,wColors,1," ");
textout(handle,x2*2,y2,wColors,1," ");
textout(handle,x3*2,y3,wColors,1," ");
textout(handle,x4*2,y4,wColors,1," ");
}
void rewrite()//出現(xiàn)
{
textout(handle,x1*2,y1,wColors,1,"■");
textout(handle,x2*2,y2,wColors,1,"■");
textout(handle,x3*2,y3,wColors,1,"■");
textout(handle,x4*2,y4,wColors,1,"■");
}
void spin()//旋轉(zhuǎn)
{
switch(type)
{
case 0:
if(typetemp==0)
{
if((table[y2+1][x2]||table[y2+2][x2]||table[y2+3][x2])==0)
{
x1=x2;x3=x2;x4=x2;
y1=y2+1;y3=y2+2;y4=y2+3;
typetemp=(typetemp+1)%2;
}
}
else
{
if((table[y2][x2-1]||table[y2][x2+1]||table[y2][x2+2])==0)
{
y1=y2;y3=y2;y4=y2;
x1=x2-1;x3=x2+1;x4=x2+2;
typetemp=(typetemp+1)%2;
}
}
break;
case 1:
break;
case 2:
switch(typetemp)
{
case 0:
if((table[y4][x1]||table[y4+1][x4])==0)
{
y1++;
x3=x4;y3=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case 1:
if((table[y4][x4+1])==0)
{
y3=y4;x3=x4+1;
typetemp=(typetemp+1)%4;
}
break;
case 2:
if((table[y4+1][x4])==0)
{
x1=x4;y1=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case 3:
if((table[y2][x2-1]||table[y2][x2+1])==0)
{
y1=y2;y3=y2;
x1=x2-1;x3=x2+1;
typetemp=(typetemp+1)%4;
}
break;
}
break;
case 3:
switch(typetemp)
{
case 0:
if((table[y2+1][x2]||table[y2+2][x2])==0)
{
x3=x2;y3=y2+1;
x4=x2;y4=y2+2;
typetemp=(typetemp+1)%4;
}
break;
case 1:
if((table[y3][x3-1]||table[y3][x3+1]||table[y3-1][x3+1])==0)
{
x4=x3-1;y4=y3;
x1=x3+1;y1=y3;
x2=x3+1;y2=y3-1;
typetemp=(typetemp+1)%4;
}
break;
case 2:
if((table[y4-1][x4]||table[y4+1][x4]||table[y4+1][x4+1])==0)
{
x1=x4;y1=y4-1;
x2=x4;y2=y4+1;
x3=x4+1;y3=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case 3:
if((table[y1][x1+1]||table[y1][x1+2])==0)
{
x2=x1+1;y2=y1;
x3=x1+2;y3=y1;
typetemp=(typetemp+1)%4;
}
break;
}
break;
case 4:
switch(typetemp)
{
case 0:
if((table[y4+1][x4]||table[y4+1][x4-1])==0)
{
x2=x4;y2=y4+1;
x1=x4-1;y1=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case 1:
if((table[y4][x4-1]||table[y4][x4-2]||table[y4-1][x4-2])==0)
{
y3=y4;x3=x4-1;
y2=y4;x2=x4-2;
y1=y4-1;x1=x4-2;
typetemp=(typetemp+1)%4;
}
break;
case 2:
if((table[y1][x1+1]||table[y2+1][x2])==0)
{
y2=y1;x2=x1+1;
y3=y1+1;x3=x1;
y4=y1+2;x4=x1;
typetemp=(typetemp+1)%4;
}
break;
case 3:
if((table[y2][x2+1]||table[y2+1][x2+1])==0)
{
y3=y2;x3=x2+1;
y4=y2+1;x4=x2+1;
typetemp=(typetemp+1)%4;
}
break;
}
break;
case 5:
if(typetemp==0)
{
if((table[y3][x3-1]||table[y3+1][x3-1])==0)
{
x1=x3-1;y1=y3;
x4=x3-1;y4=y3+1;
typetemp=(typetemp+1)%2;
}
}
else
{
if((table[y2][x2-1]||table[y3][x3+1])==0)
{
x1=x2-1;y1=y2;
x4=x3+1;y4=y3;
typetemp=(typetemp+1)%2;
}
}
break;
case 6:
if(typetemp==0)
{
if((table[y4][x4+1]||table[y4+1][x4+1])==0)
{
x2=x4+1;y2=y4;
x3=x4+1;y3=y4+1;
typetemp=(typetemp+1)%2;
}
}
else
{
if((table[y4][x4-1]||table[y1][x1+1])==0)
{
x2=x1+1;y2=y1;
x3=x4-1;y3=y4;
typetemp=(typetemp+1)%2;
}
}
break;
}
}
bool TurnLeft()//左移判定
{
if((table[y1][x1-1]||table[y2][x2-1]||table[y3][x3-1]||table[y4][x4-1])==0)
return(true);
else
return(false);
}
bool TurnRight()//右移判定
{
if((table[y1][x1+1]||table[y2][x2+1]||table[y3][x3+1]||table[y4][x4+1])==0)
return 1;
else return 0;
}
bool TurnDown()//下移判定
{
if((table[y1+1][x1]||table[y2+1][x2]||table[y3+1][x3]||table[y4+1][x4])==0)
return 1;
else return 0;
}
////////////////////////////////////////////////////////////////////////////////
int main()
{
handle=initiate();
wColors[0]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN;
wColors[1]=FOREGROUND_RED;
textout(handle,36,15,wColors,1,"操作說明:");
textout(handle,36,16,wColors,1,"左: A");
textout(handle,36,17,wColors,1,"右: D");
textout(handle,36,18,wColors,1,"加速下落:S");
textout(handle,36,19,wColors,1,"翻轉(zhuǎn): W");
textout(handle,36,20,wColors,1,"暫停: E");
textout(handle,36,21,wColors,1,"退出: Q");
textout(handle,36,4,wColors,1,"當(dāng)前分?jǐn)?shù):");
textout(handle,36,8,wColors,1,"下一塊:");
srand(time(NULL));
textout(handle,0,0,wColors+1,1,"︽︽︽︽︽︽︽︽︽︽︽︽︽︽︽");
textout(handle,0,22,wColors+1,1,"︾︾︾︾︾︾︾︾︾︾︾︾︾︾︾");
for(int k=1;k<22;k++)
{
textout(handle,0,k,wColors+1,1,"||");
textout(handle,28,k,wColors+1,1,"||");
}
wColors[0]=FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED;
for(int m=1;m<23;m++)//table初始化
{
table[m][0]=1;
table[m][14]=1;
}
for(int n=0;n<15;n++)
{
table[22][n]=1;
}
if(menu())
return 0;
typenext=rand()%7;
while(1) //////////////// 循環(huán)
{
if(flag)//下一個(gè)方塊
{
flag=0;
typetemp=0;
type=typenext;
switch(type)
{
case 0:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=8;y4=1;break;
case 1:x1=6;y1=1;x2=7;y2=1;x3=6;y3=2;x4=7;y4=2;break;
case 2:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=6;y4=2;break;
case 3:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=5;y4=2;break;
case 4:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=7;y4=2;break;
case 5:x1=5;y1=1;x2=6;y2=1;x3=6;y3=2;x4=7;y4=2;break;
case 6:x1=6;y1=1;x2=7;y2=1;x3=5;y3=2;x4=6;y4=2;break;
}
rewrite();
typenext=rand()%7;
switch(typenext)//下一塊預(yù)覽
{
case 0:textout(handle,36,10,wColors,1,"■■■■");textout(handle,36,11,wColors,1," ");break;
case 1:textout(handle,36,10,wColors,1,"■■ ");textout(handle,36,11,wColors,1,"■■ ");break;
case 2:textout(handle,36,10,wColors,1,"■■■ ");textout(handle,36,11,wColors,1," ■ ");break;
case 3:textout(handle,36,10,wColors,1,"■■■ ");textout(handle,36,11,wColors,1,"■ ");break;
case 4:textout(handle,36,10,wColors,1,"■■■ ");textout(handle,36,11,wColors,1," ■");break;
case 5:textout(handle,36,10,wColors,1,"■■ ");textout(handle,36,11,wColors,1," ■■");break;
case 6:textout(handle,36,10,wColors,1," ■■ ");textout(handle,36,11,wColors,1,"■■ ");break;
}
}
if(kbhit())//上下左右按鍵控制
{
key=getch();
switch(key)
{
case 100://右
case 68:
if(TurnRight())
{
erase();
x1++;x2++;x3++;x4++;
rewrite();
}
break;
case 97://左
case 65:
if(TurnLeft())
{
erase();
x1--;x2--;x3--;x4--;
rewrite();
}
break;
case 115://下
case 83:
if(TurnDown())
{
erase();
y1++;y2++;y3++;y4++;
rewrite();
}
break;
case 119://上
case 87:
erase();
spin();
rewrite();
break;
case 69://暫停
case 101:
wColors[0]=FOREGROUND_RED;
textout(handle,0,23,wColors,1," 暫停中.. 按任意鍵繼續(xù) ");
key=getch();
wColors[0]=FOREGROUND_BLUE|FOREGROUND_GREEN;
textout(handle,0,23,wColors,1," ");
break;
case 113://退出
case 81:
return 0;
}
}
Sleep(50);
times=(times+1)%speed;
if(times==0)//自動(dòng)下移判定
{
if(TurnDown())//下移
{
erase();
y1++;y2++;y3++;y4++;
rewrite();
}
else //不下移
{
itoa(score,scorech,10);
textout(handle,36,5,wColors,1,scorech);
table[y1][x1]=1;
table[y2][x2]=1;
table[y3][x3]=1;
table[y4][x4]=1;
flag=1;
typetemp=0;
for(int a=1;a<14;a++)//死亡的判定
{
if(table[1][a])
{
textout(handle,4,8,wColors,1," ");
textout(handle,4,9,wColors,1," GAME OVER ");
textout(handle,4,10,wColors,1," ");
textout(handle,4,11,wColors,1," 按任意鍵重新開始 ");
textout(handle,4,12,wColors,1," ");
Sleep(100);
key=getch();
if(menu())return 0;
break;
}
}
for(int p=21;p>0;p--)//消行的判定
{
for(int q=1;q<14;q++)
{
if(table[p][q]==0)break;
else if(q==13)//消行
{
score+=10;
itoa(score,scorech,10);
textout(handle,36,5,wColors,1,scorech);
for(int b=p;b>0;b--)
{
for(int g=1;g<14;g++)
{
table[b][g]=table[b-1][g];
}
}
p++;
}
}
}
for(int c=21;c>0;c--)//刷新
{
for(int Q=1;Q<14;Q++)
{
if(table[c][Q])textout(handle,Q*2,c,wColors,1,"■");
else textout(handle,Q*2,c,wColors,1," ");
}
}
}
}
}
}
鏈接地址:http://italysoccerbets.com/p-9033847.html