⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tetris2008.aspx.htm

📁 有是一个用VB写的俄罗斯方块啊!!是2005的! 相信也很好的!
💻 HTM
📖 第 1 页 / 共 5 页
字号:

<p>As you can tell, the code is fairly straight forward, if the shape
moves left you subtract 1 from the x value of every point, if the shape
moves right you add 1 to the x value of every point, and lastly if the
shape moves down you subtract 1 from the y value of every point. Keep
in mind that this code is still in the logical layer where x is any
value between 0 and 10 and the y value is any value between 0 and 20.
The code gets a bit more difficult with the ToggleOrientation direction.</p>

<div class="SmallText" id="premain1" style="width: 100%; cursor: pointer;"><img preid="1" src="Tetris2008.aspx_files/minus.gif" id="preimg1" height="9" width="9"><span preid="1" style="margin-bottom: 0pt;" id="precollapse1"> Collapse</span></div><div style="margin-top: 0pt;" id="pre1" class="no-vmads"><pre lang="vb.net"><span class="code-keyword">Select</span> <span class="code-keyword">Case</span> direction
...
        <span class="code-keyword">Case</span> NewDirection.toggleOrientation
            <span class="code-keyword">Select</span> <span class="code-keyword">Case</span> shapeType
...
                    <span class="code-keyword">Case</span> Tetris.ShapeType.lshapeLeft
                        <span class="code-comment">'</span><span class="code-comment">toggle point is 3rd cube</span>
                        <span class="code-keyword">Dim</span> x, y <span class="code-keyword">As</span> <span class="code-keyword">Integer</span>
                        x = Points(<span class="code-digit">2</span>).X
                        y = Points(<span class="code-digit">2</span>).Y
                        <span class="code-comment">'</span><span class="code-comment">find the farrest point from center</span>
                        <span class="code-keyword">If</span> (Points(<span class="code-digit">0</span>).X = Points(<span class="code-digit">3</span>).X - <span class="code-digit">2</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing left </span>
                            <span class="code-comment">'</span><span class="code-comment">switch to up</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x, y + <span class="code-digit">2</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y + <span class="code-digit">1</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x - 1, y))
                        <span class="code-keyword">ElseIf</span> (Points(<span class="code-digit">0</span>).Y = Points(<span class="code-digit">3</span>).Y + <span class="code-digit">2</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing up </span>
                                 <span class="code-comment">'</span><span class="code-comment">switch to right</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x + 2, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x + 1, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y + <span class="code-digit">1</span>))
                        <span class="code-keyword">ElseIf</span> (Points(<span class="code-digit">0</span>).X = Points(<span class="code-digit">3</span>).X + <span class="code-digit">2</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing </span>
                                 <span class="code-comment">'</span><span class="code-comment">right switch to down</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x, y - <span class="code-digit">2</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y - <span class="code-digit">1</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x + 1, y))
                        <span class="code-keyword">ElseIf</span> (Points(<span class="code-digit">0</span>).Y = Points(<span class="code-digit">3</span>).Y - <span class="code-digit">2</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing down </span>
                                 <span class="code-comment">'</span><span class="code-comment">switch to left</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x - 2, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x - 1, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y - <span class="code-digit">1</span>))
                        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
...
                    <span class="code-keyword">Case</span> Tetris.ShapeType.pyramid
                        <span class="code-comment">'</span><span class="code-comment">toggle point is 3rd cube</span>
                        <span class="code-keyword">Dim</span> x, y <span class="code-keyword">As</span> <span class="code-keyword">Integer</span>
                        x = Points(<span class="code-digit">2</span>).X
                        y = Points(<span class="code-digit">2</span>).Y
                        <span class="code-keyword">If</span> (Points(<span class="code-digit">0</span>).X = x - <span class="code-digit">1</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing left switch to up</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x, y + <span class="code-digit">1</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x - 1, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x + 1, y))
                        <span class="code-keyword">ElseIf</span> (Points(<span class="code-digit">0</span>).Y = y + <span class="code-digit">1</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing up switch to right</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x + 1, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y + <span class="code-digit">1</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y - <span class="code-digit">1</span>))
                        <span class="code-keyword">ElseIf</span> (Points(<span class="code-digit">0</span>).X = x + <span class="code-digit">1</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing right switch to down</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x, y - <span class="code-digit">1</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x - 1, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x + 1, y))
                        <span class="code-keyword">ElseIf</span> (Points(<span class="code-digit">0</span>).Y = y - <span class="code-digit">1</span>) <span class="code-keyword">Then</span> <span class="code-comment">'</span><span class="code-comment">pointing down switch to left</span>
                            rval.Add(<span class="code-keyword">New</span> Point(x - 1, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y - <span class="code-digit">1</span>))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y))
                            rval.Add(<span class="code-keyword">New</span> Point(x, y + <span class="code-digit">1</span>))
                        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
...
</pre></div>

<p>As you can tell by this code statement, it does get a bit more complicated. I chose two code excerpts for toggling the <code>pyramid </code>and <code>lshapeleft</code>.
For both of these, each point is manipulated based on a focal point
which (at least with how the code is wrote) is always the third point
in the Points collection. I compiled this code through trial and error,
so their may be more efficient ways to accomplish this same code. To
sum up this code though, you find the focal point, the direction that
the shape is currently pointing, and then you manipulate the other
points to change the direction that the shape points.</p>

<h3>Collision Detection</h3>

<p>The collision system for the shape class only handles the collisions
between two shape controls at one time, this is accomplished through
the overloaded <code>WillCollide</code>(..) functions. Quite simply
the two functions are just nested for loops that check for similar
points amongst two controls or points that go outside of the logical
grid. The two functions make use of the <code>GetNewPoints</code>(...)
method to check the Shape control movement before it actually moves.
These collision detection methods must be called before the piece is
actually moved to make sure the move is legal.</p>

<div class="no-vmads"><pre lang="vb.net"><span class="code-keyword">Public</span> <span class="code-keyword">Function</span> WillCollide(<span class="code-keyword">ByVal</span> shape <span class="code-keyword">As</span> Shape, <span class="code-keyword">ByVal</span> direction <span class="code-keyword">As</span> NewDirection)_ 
    <span class="code-keyword">As</span> <span class="code-keyword">Boolean</span>

    <span class="code-keyword">Dim</span> pntsToCheck <span class="code-keyword">As</span> Collection(<span class="code-keyword">Of</span> Point) = GetNewPoints(direction)
    <span class="code-keyword">For</span> <span class="code-keyword">Each</span> pnt <span class="code-keyword">As</span> Point <span class="code-keyword">In</span> shape.Points
        <span class="code-keyword">For</span> <span class="code-keyword">Each</span> pnts <span class="code-keyword">As</span> Point <span class="code-keyword">In</span> pntsToCheck
            <span class="code-keyword">If</span> (pnt.Equals(pnts)) <span class="code-keyword">Then</span>
                <span class="code-keyword">Return</span> <span class="code-keyword">True</span>
            <span class="code-keyword">End</span> <span class="code-keyword">If</span>
        <span class="code-keyword">Next</span>
    <span class="code-keyword">Next</span>
<span class="code-keyword">End</span> <span class="code-keyword">Function</span>
<span class="code-keyword">Public</span> <span class="code-keyword">Function</span> WillCollide(<span class="code-keyword">ByVal</span> direction <span class="code-keyword">As</span> NewDirection) <span class="code-keyword">As</span> <span class="code-keyword">Boolean</span>
    <span class="code-keyword">Dim</span> pntsToCheck <span class="code-keyword">As</span> Collection(<span class="code-keyword">Of</span> Point) = GetNewPoints(direction)
    <span class="code-keyword">For</span> <span class="code-keyword">Each</span> pnt <span class="code-keyword">As</span> Point <span class="code-keyword">In</span> pntsToCheck
        <span class="code-keyword">If</span> (pnt.X &lt; <span class="code-digit">0</span> <span class="code-keyword">Or</span> pnt.X &gt; <span class="code-digit">9</span> <span class="code-keyword">Or</span> pnt.Y &gt; <span class="code-digit">19</span> <span class="code-keyword">Or</span> pnt.Y &lt; <span class="code-digit">0</span>) <span class="code-keyword">Then</span>
            <span class="code-keyword">Return</span> <span class="code-keyword">True</span>
        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
    <span class="code-keyword">Next</span>
<span class="code-keyword">End</span> <span class="code-keyword">Function</span>
</pre></div>

<h2>The Game Board</h2>

<p>As of right now we can answer 3 of 7 questions stated at the
beginning of the article. Through the Board user control we can now
answer the last four: 'How do you store pieces on the board?', 'How do
you draw the different pieces on to the board?', 'How do you animate
the pieces?', 'How do you manage completed lines?'. First off 'How do
you store pieces on the board?'. This is a very similar question to how
to store the logical points of the shape class. The main thinking
should be arrays, but the Collection(Of type) adds better functionality
with regards to adding/removing/manipulating of the objects store in
it. For the Board control I have added a private variable aptly named <code>boardPieces</code> which is of type Collection(Of Shape). </p>

<p>The second question 'How do you draw the different pieces on the
board?' is basically the entire graphical layer. For this Board object,
the paint event has been handled with the following code:</p>

<div class="no-vmads"><pre lang="vb.net"><span class="code-keyword">Private</span> <span class="code-keyword">Sub</span> Board_Paint(<span class="code-keyword">ByVal</span> sender <span class="code-keyword">As</span> Object,_ 
            <span class="code-keyword">ByVal</span> e <span class="code-keyword">As</span> System.Windows.Forms.PaintEventArgs)_ 
            <span class="code-keyword">Handles</span> <span class="code-keyword">Me</span>.Paint

    <span class="code-keyword">For</span> x <span class="code-keyword">As</span> <span class="code-keyword">Integer</span> = <span class="code-digit">0</span> <span class="code-keyword">To</span> <span class="code-digit">9</span>
        <span class="code-keyword">For</span> y <span class="code-keyword">As</span> <span class="code-keyword">Integer</span> = <span class="code-digit">0</span> <span class="code-keyword">To</span> <span class="code-digit">19</span>
            e.Graphics.DrawRectangle(Pens.Black, x * 20, y * 20, 20, <span class="code-digit">20</span>)
        <span class="code-keyword">Next</span>
    <span class="code-keyword">Next</span>
    <span class="code-keyword">For</span> <span class="code-keyword">Each</span> shp <span class="code-keyword">As</span> Shape <span class="code-keyword">In</span> boardPieces
        <span class="code-keyword">For</span> <span class="code-keyword">Each</span> pnt <span class="code-keyword">As</span> Point <span class="code-keyword">In</span> shp.Points
            e.Graphics.FillRectangle(<span class="code-keyword">New</span> LinearGradientBrush(_
         <span class="code-keyword">New</span> Rectangle(0, 0, 19, <span class="code-digit">19</span>),_
         shp.Color,_ControlPaint.Light(shp.Color), _
         LinearGradientMode.BackwardDiagonal), _
                   (<span class="code-digit">9</span> - (<span class="code-digit">9</span> - pnt.X)) * <span class="code-digit">20</span> + 1, (<span class="code-digit">19</span> - pnt.Y) * <span class="code-digit">20</span> + 1, 19, <span class="code-digit">19</span>)
        <span class="code-keyword">Next</span>
    <span class="code-keyword">Next</span>
<span class="code-keyword">End</span> <span class="code-keyword">Sub</span>
</pre></div>

<p>This code very simply loops through each point of each shape and
draws a rectangle based on the logical grid location of the shapes'
points onto the Board control. This is the only segment of code that
deals with the pixel coordinates in this Tetris program and this one
segment of code is all that would have to be replaced if it was
transferred to another graphical framework. </p>

<h3>Animation of the Game Board Pieces</h3>

<p>The second to the last question is a very simple question, 'How do
you animate the pieces?'. At the moment this program does not use the
Windows Presentation Foundation of the .NET 3.0 framework, so one of
the few ways to accomplish such animation is through the use of timers.
For this game board, two timers have been added: <code>tmrMove </code>and <code>tmrIncreaseTmr</code>. <code>tmrMove </code>as you may have guessed is the timer that drops all the pieces down from the top of the tetris board. <code>tmrIncreaseTmr </code>is just used with each level to increase the speed of the tmrMove timer.</p>

<p><code>tmrMove_Tick</code> is the only method in the Board control that creates new shapes and manages collision detection for the down movement. </p>

<div class="SmallText" id="premain4" style="width: 100%; cursor: pointer;"><img preid="4" src="Tetris2008.aspx_files/minus.gif" id="preimg4" height="9" width="9"><span preid="4" style="margin-bottom: 0pt;" id="precollapse4"> Collapse</span></div><div style="margin-top: 0pt;" id="pre4" class="no-vmads"><pre lang="vb.net"><span class="code-keyword">Private</span> <span class="code-keyword">Sub</span> tmrMove_Tick(<span class="code-keyword">ByVal</span> sender <span class="code-keyword">As</span> System.Object, <span class="code-keyword">ByVal</span> e <span class="code-keyword">As</span> System.EventArgs)_
     <span class="code-keyword">Handles</span> tmrMove.Tick

    <span class="code-keyword">If</span> (paused) <span class="code-keyword">Then</span>
        <span class="code-keyword">Return</span>
    <span class="code-keyword">End</span> <span class="code-keyword">If</span>
    <span class="code-keyword">If</span> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -