专栏首页帮你学MatLabmatlab实现俄罗斯方块

matlab实现俄罗斯方块

%% 初始化

global piece pieces_types all_pieces running interface plane max_column max_row

max_row = 23; max_column = 15;

plane = zeros(max_row,max_column);

interface = figure; initialize_window();

load_pieces();

running = true;

% 游戏循环开始

generate_a_piece();

while running

move();

pause(0.5);

game_over();

end

clear_memory();

disp("Game Over!");

%_________________

%% 初始化窗体

function initialize_window()

global plane interface

set(interface,'NumberTitle','off',...

'Name','Tetris',...

'MenuBar','none',...

'KeyPressFcn',@direction,...

'CloseRequestFcn',@game_exit,...

'position',[200 200 360 520],...

'CurrentObject',imagesc(plane));

axis off

end

%% 绘制

function render()

global plane interface

set(interface,'CurrentObject',imagesc(plane));

axis off

end

%% 加载一个方块

function load_pieces()

global pieces_types all_pieces

pieces_types = struct('long_flat',[2,2,2,2,2],...

'left_l',[0,2; 0,2; 2,2],...

'right_l',[2,0; 2,0; 2,2],...

'left_zig',[0,2,2; 2,2,0],...

'right_zig',[2,2,0; 0,2,2],...

'shooter',[0,2,0; 2,2,2],...

'square',[2,2; 2,2],...

'left_corner',[0,2; 2,2],...

'right_corner',[2,0; 2,2]);

all_pieces = {'long_flat','left_l','right_l','left_zig',...

'right_zig','square','shooter','left_corner','right_corner'};

end

%% 游戏结束

function game_exit(~,evt)

global running

running = false;

delete(gcf);

return;

end

%% 清空工作空间

function clear_memory()

clear

clc

end

function y =member(a,b)

y = find(ismember(a,b));

end

function y = empty(a,b)

y = isempty(member(a,b));

end

%% 产生一个方块

function generate_a_piece()

global plane piece pieces_types all_pieces max_column

piece = pieces_types.(string(all_pieces(randi(9))));

centre = floor(floor(max_column/2)-size(piece,2)/2)+1;

for a = 1:1:size(piece,1)

for b = 1:1:size(piece,2)

plane(a,b+centre) = piece(a,b);

if plane(a,b+centre) > 2

plane(a,b+centre) = 1;

end

end

end

render();

end

%% 向下移动方块

function move()

global plane max_column max_row

full_row();

initial = member(plane,2);

final = initial+1;

border = [max_row:max_row:max_column*max_row];

if ismember(initial,border) == 0

if ~empty(plane(final),1)

plane(member(plane,2)) = 1;

generate_a_piece();

else

plane(initial) = 0;

plane(final) = 2;

end

else

plane(member(plane,2)) = 1;

generate_a_piece();

end

render();

end

%% 方向键移动旋转方块

function direction(~,evt)

global piece plane max_column max_row

k = evt.Key;

switch k

case 'uparrow'

piece = rot90(piece);

halt = false;

topl = member(plane,2);

shift_h = 0;

shift_v = 0;

if ~empty(size(piece),5)

[topl_x,topl_y] = ind2sub([max_row,max_column],topl(3));

if topl(2)-topl(1) == 1

shift_h =-2;

shift_v =-1;

else

shift_h = 0;

end

else

[topl_x,topl_y] = ind2sub([max_row,max_column],topl(1));

end

for a = topl_x:1:size(piece,1)+topl_x-1

for b = topl_y:1:size(piece,2)+topl_y-1

if a > size(plane,1) || b > size(plane,2)

halt = true;

break

elseif plane(a+shift_v,b+shift_h) == 1

halt = true;

end

end

end

if ~halt

plane(ismember(plane,2)) = 0;

for a = topl_x:1:size(piece,1)+topl_x-1

for b = topl_y:1:size(piece,2)+topl_y-1

plane(a+shift_v,b+shift_h) = piece(a-topl_x+1,b-topl_y+1);

end

end

end

case 'leftarrow'

arrow_key(-1);

case 'rightarrow'

arrow_key(1);

case 'downarrow'

move();

end

render();

end

%% 左右移动方块

function arrow_key(k)

global max_row max_column plane

if k > 0

border = [max_row*(max_column-1)+1:1:max_column*max_row];

else

border = [1:1:max_row];

end

initial = member(plane,2);

final = initial+k*max_row;

if ismember(initial,border) == 0 & empty(plane(final),1) ~= 0

plane(initial) = 0;

plane(final) = 2;

end

end

%% 一行满了消掉

function full_row()

global plane max_column max_row

for n = 1:1:max_row

if plane(n,:) == ones(1,max_column)

plane(1:n,:) = [zeros(1,max_column); plane(1:n-1,:)];

pause(0.1);

end

end

render();

end

%% 游戏失败

function game_over()

global plane

if empty(plane(2,:),1) ~= 1

game_exit();

end

本文分享自微信公众号 - 帮你学MatLab(MatLab_helper)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • 远程办公经验为0,如何将日常工作平滑过度到线上?

    我是一名创业者,我的公司(深圳市友浩达科技有限公司)在2018年8月8日开始运营,现在还属于微型公司。这个春节假期,我一直十分关注疫情动向,也非常关心其对公司带来的影响。

    TVP官方团队
    TAPD 敏捷项目管理腾讯乐享企业邮箱企业编程算法
  • 数据中台,概念炒作还是另有奇效? | TVP思享

    作者简介:史凯,花名凯哥,腾讯云最具价值专家TVP,ThoughtWorks数据智能业务总经理。投身于企业数字化转型工作近20年。2000年初,在IBM 研发企业级中间件,接着加入埃森哲,为大型企业提供信息化架构规划,设计,ERP,云平台,数据仓库构建等技术咨询实施服务,随后在EMC负责企业应用转型业务,为企业提供云迁移,应用现代化服务。现在专注于企业智能化转型领域,是数据驱动的数字化转型的行业布道者,数据中台的推广者,精益数据创新体系的创始人,2019年荣获全球Data IQ 100人的数据赋能者称号,创业邦卓越生态聚合赋能官TOP 5。2019年度数字化转型专家奖。打造了行业第一个数据创新的数字化转型卡牌和工作坊。创建了精益数据创新方法论体系构建数据驱动的智能企业,并在多个企业验证成功,正在向国内外推广。

    TVP官方团队
    大数据数据分析企业
  • 扩展 Kubernetes 之 CRI

    使用 cri-containerd 的调用流程更为简洁, 省去了上面的调用流程的 1,2 两步

    王磊-AI基础
    Kubernetes
  • 扩展 Kubernetes 之 Kubectl Plugin

    kubectl 功能非常强大, 常见的命令使用方式可以参考 kubectl --help,或者这篇文章

    王磊-AI基础
    Kubernetes
  • 多种登录方式定量性能测试方案

    最近接到到一个测试任务,某服务提供了两种登录方式:1、账号密码登录;2、手机号+验证码登录。要对这两种登录按照一定的比例进行压测。

    八音弦
    测试服务 WeTest
  • 线程安全类在性能测试中应用

    首先验证接口参数签名是否正确,然后加锁去判断订单信息和状态,处理用户增添VIP时间事务,成功之后释放锁。锁是针对用户和订单的分布式锁,使用方案是用的redis。

    八音弦
    安全编程算法
  • 使用CDN(jsdelivr) 优化博客访问速度

    PS: 此篇文章适用于 使用 Github pages 或者 coding pages 的朋友,其他博客也类似.

    IFONLY@CUIT
    CDNGitGitHub开源
  • 扩展 Kubernetes 之 CNI

    Network Configuration 是 CNI 输入参数中最重要当部分, 可以存储在磁盘上

    王磊-AI基础
    Kubernetes
  • 聚焦【技术应变力】云加社区沙龙online重磅上线!

    云加社区结合特殊时期热点,挑选备受关注的音视频流量暴增、线下业务快速转线上、紧急上线防疫IoT应用等话题,邀请众多业界专家,为大家提供连续十一天的干货分享。从视野、预判、应对等多角度,帮助大家全面提升「技术应变力」!

    腾小云
  • 京东购物小程序购物车性能优化实践

    它是小程序开发工具内置的一个可视化监控工具,能够在 OS 级别上实时记录系统资源的使用情况。

    WecTeam
    渲染JavaScripthttps网络安全缓存

扫码关注云+社区

领取腾讯云代金券