俄罗斯方块小游戏设计.docx
- 文档编号:27015568
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:15
- 大小:93.95KB
俄罗斯方块小游戏设计.docx
《俄罗斯方块小游戏设计.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块小游戏设计.docx(15页珍藏版)》请在冰豆网上搜索。
俄罗斯方块小游戏设计
z
自动化专业综合设计报告
设计题目:
俄罗斯方块的设计
实验室:
自动化系统仿真实验室
指导教师:
学生姓名:
同组组员:
班级:
学号:
成绩评定:
一、设计目的
学会MATLAB的GUI图形界面化模块的使用,以及编程语言的熟练运用。
二、设计要求
1、图形界面化。
2、实现各种方块图案形状之间的转化。
3、方块落地时判断下方是否存在障碍,判断是否填满一行,及使其消除。
三、设计内容
1.首先,使用GUI建立一个图形界面如图:
用callback其生成.m文件。
2、在.m文件中添加程序,实现题目要求。
主程序如下:
functionRussiaBlock(action)
%定义全局变量
globalCENTER_XCENTER_YPOSSTUCKUSED_SPACEH;
globalWIDTHHEIGHTLEVELTIME_DELAYSQ_XSQ_Y;
globalH_SLIDER_WIDTHH_SLIDER_HEIGHT;
globalH_TEXT_WIDTHH_TEXT_HEIGHTH_TEXT_SCORE;
globalSTART_HANDLESTOP_HANDLESTOP_GAMEEXIT_HANDLE;
globalH_AH_BBOXH_LINE;
ifnargin<1,action='initialize';end;
ifstrcmp(action,'initialize'),
WIDTH=10;%默认游戏窗口的宽度
HEIGHT=25;%默认游戏窗口的高度
BOX=1;%默认显示游戏边框
TIME_DELAY=1*exp((5/9)*log(0.1));%时间延时设置
fig=figure(...
'Name','RussiaBlockforMatlab','NumberTitle','off',...
'Visible','off','BackingStore','off');
SQ_X=[0-1-10]';%方块单元的X轴顶点坐标
SQ_Y=[00-1-1]';%方块单元的Y轴顶点坐标
%游戏窗口为axes表格
figure(fig);
H_A=axes(...
'Units','normalized','Position',[.1.18.4.8],...
'Visible','off','DrawMode','fast',...
'NextPlot','replace','XLim',[1WIDTH+1],'YLim',[0HEIGHT]);
H_B=axes(...
'Units','normalized','Position',[.1.18.4.8],...
'Visible','off','DrawMode','fast',...
'NextPlot','replace','XLim',[1WIDTH+1],'YLim',[0HEIGHT]);
%游戏界面初始边框
ifBOX==1,
BOX=~BOX;
RussiaBlock('box');
end
%各按键信息设置
STOP_HANDLE=uicontrol('units','normalized',...
'position',[.848.876.1.05],'string','stop',...
'callback','RussiaBlock(''stop'')',...
'interruptible','yes','visible','off');
EXIT_HANDLE=uicontrol('units','normalized',...
'position',[.85.757.1.05],'string','exit',...
'callback','delete(gcf)',...
'interruptible','no');
START_HANDLE=uicontrol('units','normalized',...
'position',[.848.876.1.05],'string','start',...
'callback','RussiaBlock(''start'')',...
'interruptible','yes','visible','on');
left_handle=uicontrol('units','normalized',...
'position',[.534.521.1.05],'string','<---',...
'callback','RussiaBlock(''left'')',...
'interruptible','yes');
right_handle=uicontrol('units','normalized',...
'position',[.673.521.1.05],'string','--->',...
'callback','RussiaBlock(''right'')',...
'interruptible','yes');
drop_handle=uicontrol('units','normalized',...
'position',[.604.462.1.05],'string','drop',...
'callback','RussiaBlock(''drop'')');
rotate_handle=uicontrol('units','normalized',...
'position',[.593.59.1.05],'string','rotate',...
'callback','RussiaBlock(''rotate'')');
H_TEXT_SCORE=uicontrol(...
'ForegroundColor',[011],...
'Position',[0.5520.8760.20.07],...
'String','Score:
xxxxx',...
'Units','normalized');
end;%结束时初始化程序
%切换表格边框
ifstrcmp(action,'box'),
BOX=~BOX;
ifBOX==1,
H_LINE=line([1WIDTH+1WIDTH+111],[11HEIGHTHEIGHT1]);
else,delete(H_LINE);
end
end;
%左移动作
ifstrcmp(action,'left'),
stopped=0;
fori=1:
4,ifUSED_SPACE(POS(i,1)-1,POS(i,2))==1,stopped=1;end;end;
ifstopped==0,
POS(:
1)=POS(:
1)-1;
CENTER_X=CENTER_X-1;
fori=1:
4,set(H(i),'XData',SQ_X+POS(i,1),'YData',SQ_Y+POS(i,2));
end;
drawnow;
end;
end;
%右移动作
ifstrcmp(action,'right'),
stopped=0;
fori=1:
4,ifUSED_SPACE(POS(i,1)+1,POS(i,2))==1,stopped=1;end;end;
ifstopped==0,
POS(:
1)=POS(:
1)+1;
CENTER_X=CENTER_X+1;
fori=1:
4,set(H(i),'XData',SQ_X+POS(i,1),'YData',SQ_Y+POS(i,2));
end;
drawnow;
end;
end;
%整体下降
ifstrcmp(action,'drop'),
whileSTUCK==0,
fori=1:
4,ifUSED_SPACE(POS(i,1),POS(i,2)-1)==1,STUCK=1;end;
end;
ifSTUCK==0,POS(:
2)=POS(:
2)-1;end;
end;
fori=1:
4,set(H(i),'XData',SQ_X+POS(i,1),'YData',SQ_Y+POS(i,2));end;
drawnow;
end;
%旋转
ifstrcmp(action,'rotate'),
new_x=-(POS(:
2)-CENTER_Y)+CENTER_X;
new_y=(POS(:
1)-CENTER_X)+CENTER_Y;
stopped=0;
fori=1:
4,
if((new_x>1)&(new_x<(WIDTH+2))&(new_y>1)),
ifUSED_SPACE(new_x(i),new_y(i))==1,stopped=1;end;
else,stopped=1;
end;
end;
ifstopped==0,%空格没有被占据
POS=[new_xnew_y];
fori=1:
4,set(H(i),'XData',SQ_X+POS(i,1),'YData',SQ_Y+POS(i,2));
end;
drawnow;
end;
end;
%暂停
ifstrcmp(action,'stop'),
STOP_GAME=1;
end;
%开始俄罗斯方块
ifstrcmp(action,'start'),
STOP_GAME=0;
score=0;
set(START_HANDLE,'visible','off');
set(STOP_HANDLE,'visible','on');
set(EXIT_HANDLE,'visible','off');
set(H_TEXT_SCORE,'string',['Score:
'num2str(score)]);
h_matb=zeros(WIDTH+2,HEIGHT);
USED_SPACE=zeros(WIDTH+2,HEIGHT);
USED_SPACE(:
1)=ones(WIDTH+2,1);
USED_SPACE([1WIDTH+2],:
)=ones(2,HEIGHT);
drawnow;
axes(H_A);
%各类方块图案形状定义
a_shape=[-1012;0000]';%长方形
b_shape=[-1001;0010]';%Zmirror
c_shape=[-1001;0011]';%Znormal
d_shape=[-1001;1100]';%truncatedT
e_shape=[0011;0101]';%正方形
f_shape=[-1011;0001]';%Lnormal
g_shape=[-1-101;1000]';%Lmirror
shape_matrix=[a_shapeb_shapec_shaped_shapee_shapef_shapeg_shape];
s=size(shape_matrix);
num_shapes=s
(2)/2;
color_matrix=[001;010;011;100;101;110;111];
home_pos=ones(4,1)*[(WIDTH/2)(HEIGHT-2)];
POS=a_shape+home_pos;
fori=1:
4,H(i)=patch(SQ_X+POS(i,1),SQ_Y+POS(i,2),'r');
end;
while((sum(USED_SPACE(2:
WIDTH+1,HEIGHT-4))==0)&(STOP_GAME==0)),
shape_index=ceil(num_shapes*rand
(1));%选择随机形状
current_color=color_matrix(shape_index,:
);%颜色
POS=shape_matrix(:
(2*shape_index-1):
(2*shape_index))+home_pos;%设置图形起始位置
CENTER_X=home_pos(1,1);%设置旋转原点
CENTER_Y=home_pos(1,2);
fori=1:
4,
set(H(i),'XData',SQ_X+POS(i,1),'YData',SQ_Y+POS(i,2),...
'FaceColor',current_color,'Visible','on');
end;
drawnow;
STUCK=0;
t0=clock;
while((STUCK==0)&(STOP_GAME==0)),
drawnow;
ifetime(clock,t0)>TIME_DELAY,%下一个单元块
fori=1:
4,
ifUSED_SPACE(POS(i,1),POS(i,2)-1)==1,STUCK=1;end;
end;
ifSTUCK==0,
t0=clock;
POS(:
2)=POS(:
2)-1;
CENTER_Y=CENTER_Y-1;
fori=1:
4,
set(H(i),'YData',SQ_Y+POS(i,2));
end;
drawnow;
end
end;
drawnow;
end
fori=1:
4,USED_SPACE(POS(i,1),POS(i,2))=1;end;%退格
fori=1:
4,set(H(i),'Visible','off');end;%隐藏活动区域
axes(H_B);
fori=1:
4,h_matb(POS(i,1),POS(i,2))=patch(SQ_X+POS(i,1),SQ_Y+POS(i,2),current_color);
end;
i=2;
whilei ifsum(USED_SPACE(2: WIDTH+1,i))==WIDTH, score=score+10;%添加完成一行的分数 set(H_TEXT_SCORE,'string',['Score: 'num2str(score)]); fork1=2: WIDTH+1,delete(h_matb(k1,i));end; fork2=(i+1): HEIGHT, fork1=2: WIDTH+1, ifh_matb(k1,k2)~=0, set(h_matb(k1,k2),'YData',k2-1+SQ_Y); end; end; end; h_matb(2: WIDTH+1,i: (HEIGHT-1))=h_matb(2: WIDTH+1,(i+1): HEIGHT); h_matb(2: WIDTH+1,HEIGHT)=zeros(WIDTH,1); USED_SPACE(2: WIDTH+1,i: (HEIGHT-1))=USED_SPACE(2: WIDTH+1,(i+1): HEIGHT); USED_SPACE(2: WIDTH+1,HEIGHT)=zeros(WIDTH,1); elsei=i+1; end end axes(H_A); end%结束循环 %删除对象,清空游戏窗口 fork2=2: HEIGHT, fork1=2: WIDTH+1, ifh_matb(k1,k2)~=0, delete(h_matb(k1,k2)); end; end; end; set(START_HANDLE,'visible','on'); set(STOP_HANDLE,'visible','off'); set(EXIT_HANDLE,'visible','on'); end%结束游戏 运行时显示画面: 点击start游戏开始。 方块填满一行之后消行并且下落一行。 四、设计实验结果及分析 1、图形界面化。 2、实现各种方块图案形状之间的转化。 3、方块填满时消除得10分。 五、结论 通过对MATLAB的GUI图形界面化模块的学习和应用以及编程语言的应用,完成了俄罗斯方块小游戏的设计。 六、设计感受 本次实验在郭**和张**两位老师的耐心指导下,我和我的组员们利用MATLAB设计出了符合实验要求的俄罗斯方块小游戏。 在一个星期的学习中,我们对MATLAB和编程语言的应用也变得更加的熟练,也明白每一个人组员在实验中的重要性,合理的分工使这个复杂的实验变的简单了,也希望自己以后能设计出更复杂更有趣的小游戏,让自己的专业知识得到更充分的应用!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 小游戏 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)