俄罗斯方块雏形[完成了移动、反转、叠加]

rgame.jpg

 


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 俄罗斯方块 by Originality
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap : none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
Include 文件定义
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include rgame.inc
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
代码段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
定时器测试
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DwonTest proc _hWnd, _uMsg, _idEvent, _dwTime

pushad

mov eax, curState
.if eax
;下落结束

mov curState, 0
invoke InitControl1

.else

invoke Control1Down

.endif

popad
ret

DwonTest endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
窗口过程
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc uses ebx edi esi hWnd, uMsg, wParam, lParam
local @stPs : PAINTSTRUCT
local @stRect : RECT
local @hDc

mov eax, uMsg
;********************************************************************
.if eax == WM_PAINT

invoke BeginPaint, hWnd, addr @stPs
invoke InitContainer
invoke ShowControl,
1
invoke Control1Down
invoke EndPaint, hWnd, addr @stPs

.elseif eax == WM_CREATE

invoke GetDC, hWnd
mov hGame, eax
;【此处定时器为测试所用】
invoke SetTimer, NULL, NULL, 1000, offset DwonTest

.elseif eax == WM_CLOSE

invoke ReleaseDC, hWnd, hGame
invoke DestroyWindow, hWinMain
invoke PostQuitMessage, NULL

.elseif eax == WM_SIZE

invoke ValidateRect, hWnd, offset gameArea

.else

invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret

.endif
;********************************************************************
xor eax, eax
ret

_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass : WNDCLASSEX
local @stMsg : MSG

invoke GetModuleHandle, NULL
;获得应用程序实例
mov hInstance, eax ;实例保存在全局变量中
invoke RtlZeroMemory, addr @stWndClass, sizeof @stWndClass ;以0填充WNDCLASSEX结构体
Code
********************************************************************
; 注册窗口类
;
********************************************************************
invoke LoadCursor, 0, IDC_ARROW ;获取光标句柄
mov @stWndClass.hCursor, eax ;设置光标
push hInstance
pop @stWndClass.hInstance ;保存应用程序实例
mov @stWndClass.cbSize, sizeof WNDCLASSEX ;保存结构体大小
mov @stWndClass.style, CS_HREDRAW or CS_VREDRAW ;设置窗体样式
mov @stWndClass.lpfnWndProc, offset _ProcWinMain ;保存回调函数
mov @stWndClass.hbrBackground, COLOR_WINDOW + 3 ;设置窗体背景色
mov @stWndClass.lpszClassName, offset szClassName ;保存窗体类名
invoke RegisterClassEx, addr @stWndClass ;注册窗口类
;
********************************************************************
;
建立并显示窗口
;
********************************************************************
invoke CreateWindowEx, WS_EX_TOOLWINDOW, offset szClassName, offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
100, 100, 400, 456,\
NULL, NULL, hInstance, NULL
;建立窗口
mov hWinMain, eax ;保存窗口句柄
invoke ShowWindow, hWinMain, SW_SHOWNORMAL ;显示窗口
invoke UpdateWindow, hWinMain ;更新窗口
;
********************************************************************
;
消息循环
;
********************************************************************
.while TRUE ;消息循环

invoke GetMessage, addr @stMsg, NULL,
0, 0 ;获取消息并填充MSG结构体

.break .if eax ==
0 ;判断是否退出
invoke TranslateMessage, addr @stMsg ;消息装换
invoke DispatchMessage, addr @stMsg ;分发消息

.endw
ret

_WinMain endp

;********************************************************************
;
初始化游戏容器
;
********************************************************************
InitContainer proc
local @lpRect : RECT

pushad

;建立游戏容器边框
invoke CreatePen, PS_SOLID, 5, 8000FFh
push eax
invoke SelectObject, hGame, eax
invoke DeleteObject, eax
pop eax
invoke FrameRect, hGame, offset gameArea, eax

popad
ret

InitContainer endp

;********************************************************************
;
显示方块控件
;
type:控件类型1为4格横条,2为田字形,3..4..
;
********************************************************************
ShowControl proc cType : DWORD

pushad

.if cType ==
1 ;4格横条■■■■

invoke InitControl1

.endif

popad
ret

ShowControl endp

;********************************************************************
;
初始化■■■■图形
;
********************************************************************
InitControl1 proc

pushad

;设置方块颜色
invoke SetColor, 0FF80FFh, 400040h
;创建方块并排列方块
mov ecx, 60 ;左上角起始位置
mov edx, 90 ;右下角起始位置
xor esi, esi
lea ebx, curControl
@@:
cmp ecx, 180
jz @F ;4个方块都初始化完毕
push ebx
push ecx
push edx
invoke Rectangle, hGame, ecx,
5, edx, 30
pop edx
pop ecx
pop ebx
mov [ebx + esi], ecx
push topSpace
pop DWORD ptr [ebx + esi + 4]
add esi, 8
add ecx, 30
add edx, 30
jmp @B

@@:

popad
ret

InitControl1 endp

;********************************************************************
;
设置方块颜色
;
********************************************************************
SetColor proc color : DWORD, pColor : DWORD

pushad

invoke CreatePen, PS_SOLID,
1, pColor
invoke SelectObject, hGame, eax
invoke DeleteObject, eax
invoke CreateSolidBrush, color
invoke SelectObject, hGame, eax
invoke DeleteObject, eax

popad
ret

SetColor endp

;********************************************************************
;
■■■■图形向下走动
;
********************************************************************
Control1Down proc

pushad

invoke IsDownEnd
.if eax ==
1 ;下面有障碍,改变状态为创建新的方块并保存当前方块在容器中的位置

mov curState, 1
invoke ChangeAreaState
invoke RtlZeroMemory, offset curControl, sizeof curControl
popad
ret

.endif

;如果下面不是障碍,则■■■■向下走动
lea edx, curControl
xor ecx, ecx
@@:
cmp ecx, 4
jz @F
;覆盖原有的方块
push ecx
invoke SetColor, 0h, 0h
mov eax, [edx + ecx * 8 + 4]
mov ebx, 30
add ebx, eax ;ebx右下角y坐标
mov eax, [edx + ecx * 8]
add eax, 30 ;eax为右下角x坐标
push eax ;保存右下角坐标
push ebx
push edx
invoke Rectangle, hGame, [edx + ecx *
8], [edx + ecx * 8 + 4], eax, ebx
pop edx

;生成新的方块
invoke SetColor, 0FF80FFh, 400040h
pop ebx
pop eax
pop ecx
add DWORD ptr [edx + ecx * 8 + 4], 30
add ebx, 30
push ecx
push edx
invoke Rectangle, hGame, [edx + ecx *
8], [edx + ecx * 8 + 4], eax, ebx
pop edx
pop ecx
inc ecx
jmp @B
@@:

popad
ret

Control1Down endp

;********************************************************************
;
保存当前方块在容器中的状态
;
********************************************************************
ChangeAreaState proc

pushad

;计算区域单元坐标
lea ebx, curControl
xor ecx, ecx
@@:
cmp ecx, 4
jz @F

;计算二维x坐标
invoke CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 1
mov esi, eax

;计算二维y坐标
invoke CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 2
mov edi, eax

;设置区域更新,更新的坐标位置(eax + esi * 4 * 8 + edi * 4)
lea eax, area
push eax
xchg edi, eax
mov edi, 8
mul edi
add esi, eax
pop eax
mov DWORD ptr [eax + esi * 4], 1 ;设置当前位置已经被填充
inc ecx
jmp @B
@@:

popad
ret

ChangeAreaState endp

;********************************************************************
;
根据顶角计算二维坐标
;
left, top:顶角像素
;
posType:1表示计算x坐标,2表示计算y坐标
;
eax返回二维坐标
;
********************************************************************
CalculatePos proc left : DWORD, top :DWORD, posType : DWORD
local @ret : DWORD
pushad

mov edx, left
add edx, rectArea ;右下角x坐标

mov ecx, top
add ecx, rectArea ;右下角y坐标

.if posType ==
1

mov eax, edx
mov ebx, 30
xor edx, edx
div ebx

.elseif

mov eax, ecx
sub eax, topSpace
mov ecx, 30
xor edx, edx
div ecx

.endif
mov @ret, eax
popad
mov eax, @ret
dec eax
ret

CalculatePos endp

;********************************************************************
;
判断下面是否有障碍
;
返回值::eax为1表示下落完毕,为0表示未完毕
;
********************************************************************
IsDownEnd proc

pushad

lea ebx, curControl
xor ecx, ecx
@@:
cmp ecx, 4
jz @F

;计算二维x坐标
invoke CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 1
mov esi, eax

;计算二维y坐标
invoke CalculatePos, [ebx + ecx * 8 ], [ebx + ecx * 8 + 4], 2
mov edi, eax
inc edi

;设置区域更新,更新的坐标位置(eax + esi * 4 * 8 + edi * 4)
lea eax, area
push eax
xchg edi, eax
mov edi, 8
mul edi
add esi, eax
pop eax
mov edx, [eax + esi * 4]
.if edx ==
1

popad
mov eax, 1
ret

.endif
inc ecx
jmp @B
@@:

popad
xor eax, eax
ret

IsDownEnd endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess, NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

 

转载于:https://www.cnblogs.com/osoft1983/archive/2008/11/11/1331355.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值