俄罗斯方块小游戏设计.docx

上传人:b****3 文档编号:27015568 上传时间:2023-06-25 格式:DOCX 页数:15 大小:93.95KB
下载 相关 举报
俄罗斯方块小游戏设计.docx_第1页
第1页 / 共15页
俄罗斯方块小游戏设计.docx_第2页
第2页 / 共15页
俄罗斯方块小游戏设计.docx_第3页
第3页 / 共15页
俄罗斯方块小游戏设计.docx_第4页
第4页 / 共15页
俄罗斯方块小游戏设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

俄罗斯方块小游戏设计.docx

《俄罗斯方块小游戏设计.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块小游戏设计.docx(15页珍藏版)》请在冰豆网上搜索。

俄罗斯方块小游戏设计.docx

俄罗斯方块小游戏设计

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和编程语言的应用也变得更加的熟练,也明白每一个人组员在实验中的重要性,合理的分工使这个复杂的实验变的简单了,也希望自己以后能设计出更复杂更有趣的小游戏,让自己的专业知识得到更充分的应用!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1