首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

哟嗬.这不是159行的俄罗斯方块么.该如何处理

2012-03-24 
哟嗬...这不是159行的俄罗斯方块么....VB.NET codePublic Class Form1Private ShowBitMap As New Bitmap(2

哟嗬...这不是159行的俄罗斯方块么....

VB.NET code
Public Class Form1    Private ShowBitMap As New Bitmap(20, 20), BackBitMap As New Bitmap(20, 20), BlockType As Integer, BlockState As Integer, NextType As Integer = 3, Blocks(,) As Integer '0 隐藏,1显示,2 静止      Private DrawRectangle As Rectangle = New Rectangle(2, 2, 15, 25), DrawLocation As Point = New Point(5, 0), Score(1) As Long    Private WithEvents MyTimer As New Timer    Private Function GetPreviewPoints(ByVal nType As Integer, ByVal nState As Integer) As Point()        If nType = 1 Then            If nState Mod 4 = 0 Then Return New Point() {New Point(0, 1), New Point(1, 1), New Point(2, 1), New Point(2, 0)}            If nState Mod 4 = 1 Then Return New Point() {New Point(0, 0), New Point(0, 1), New Point(0, 2), New Point(1, 2)}            If nState Mod 4 = 2 Then Return New Point() {New Point(0, 0), New Point(0, 1), New Point(1, 0), New Point(2, 0)}            If nState Mod 4 = 3 Then Return New Point() {New Point(0, 0), New Point(1, 0), New Point(1, 1), New Point(1, 2)}        ElseIf nType = 2 Then            If nState Mod 4 = 0 Then Return New Point() {New Point(0, 0), New Point(1, 0), New Point(2, 0), New Point(2, 1)}            If nState Mod 4 = 1 Then Return New Point() {New Point(0, 0), New Point(0, 1), New Point(0, 2), New Point(1, 0)}            If nState Mod 4 = 2 Then Return New Point() {New Point(0, 0), New Point(0, 1), New Point(1, 1), New Point(2, 1)}            If nState Mod 4 = 3 Then Return New Point() {New Point(1, 0), New Point(1, 1), New Point(1, 2), New Point(0, 2)}        ElseIf nType = 3 Then            If nState Mod 2 = 0 Then Return New Point() {New Point(0, 0), New Point(1, 0), New Point(2, 0), New Point(3, 0)}            If nState Mod 2 = 1 Then Return New Point() {New Point(0, 0), New Point(0, 1), New Point(0, 2), New Point(0, 3)}        ElseIf nType = 4 Then            If nState Mod 2 = 0 Then Return New Point() {New Point(0, 0), New Point(0, 1), New Point(1, 1), New Point(1, 2)}            If nState Mod 2 = 1 Then Return New Point() {New Point(0, 1), New Point(1, 0), New Point(1, 1), New Point(2, 0)}        ElseIf nType = 5 Then            If nState Mod 2 = 0 Then Return New Point() {New Point(0, 1), New Point(0, 2), New Point(1, 0), New Point(1, 1)}            If nState Mod 2 = 1 Then Return New Point() {New Point(0, 0), New Point(1, 0), New Point(1, 1), New Point(2, 1)}        ElseIf nType = 6 Then            If nState Mod 4 = 0 Then Return New Point() {New Point(0, 1), New Point(1, 0), New Point(1, 1), New Point(1, 2)}            If nState Mod 4 = 1 Then Return New Point() {New Point(0, 0), New Point(1, 0), New Point(1, 1), New Point(2, 0)}            If nState Mod 4 = 2 Then Return New Point() {New Point(0, 0), New Point(0, 1), New Point(0, 2), New Point(1, 1)}            If nState Mod 4 = 3 Then Return New Point() {New Point(0, 1), New Point(1, 1), New Point(2, 1), New Point(1, 0)}        Else            Return New Point() {New Point(0, 0), New Point(0, 1), New Point(1, 0), New Point(1, 1)}        End If    End Function    Private Function NewBlock(ByVal nLocation As Point) As Boolean        Dim Left As Integer = 100, Right As Integer = -1, Bottom As Integer = -1, Top As Integer = 100, nPoints As Point() = GetPreviewPoints(BlockType, BlockState)        For Each n As Point In nPoints            If n.X < Left Then Left = n.X            If n.X > Right Then Right = n.X            If n.Y < Top Then Top = n.Y            If n.Y > Bottom Then Bottom = n.Y        Next        If nLocation.X + Left < 0 Then            nLocation.X = -Left        ElseIf nLocation.X + Right - Left > DrawRectangle.Width Then            nLocation.X = DrawRectangle.Width - (Right - Left)        End If        If nLocation.Y + Top < 0 Then            nLocation.Y = -Top        ElseIf nLocation.Y + (Bottom - Top) > DrawRectangle.Height Then            nLocation.Y = DrawRectangle.Height - (Bottom - Top)            Return True        End If        For Each p As Point In nPoints            If Blocks(p.X + nLocation.X, p.Y + nLocation.Y) > 1 Then Return True        Next        For y As Integer = 0 To DrawRectangle.Height            For x As Integer = 0 To DrawRectangle.Width                If Blocks(x, y) = 1 OrElse Blocks(x, y) > 5 Then Blocks(x, y) = 0            Next        Next        For Each p As Point In nPoints            Blocks(p.X + nLocation.X, p.Y + nLocation.Y) = 1        Next        DrawLocation = nLocation    End Function    Private Sub Key_Up(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp        If e.KeyCode = Keys.W OrElse e.KeyCode = Keys.Up Then            BlockState += 1            If NewBlock(DrawLocation) = False Then DrawBlock()        ElseIf e.KeyCode = Keys.D OrElse e.KeyCode = Keys.Right Then            If NewBlock(New Point(DrawLocation.X + 1, DrawLocation.Y)) = False Then DrawBlock()        ElseIf e.KeyCode = Keys.A OrElse e.KeyCode = Keys.Left Then            If NewBlock(New Point(DrawLocation.X - 1, DrawLocation.Y)) = False Then DrawBlock()        ElseIf e.KeyCode = Keys.S OrElse e.KeyCode = Keys.Down OrElse e.KeyCode = Keys.Space Then            For y As Integer = 0 To DrawRectangle.Height                If NewBlock(New Point(DrawLocation.X, DrawLocation.Y + 1)) Then Exit For            Next            DrawBlock()        ElseIf e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Escape Then            MyTimer.Enabled = Not MyTimer.Enabled            If MyTimer.Enabled Then                ReDim Blocks(DrawRectangle.Width, DrawRectangle.Height)                NewBlock(New Point(5, 0))                Score(1) = 0                Me.Text = "分数:" & Score(1)            End If        End If    End Sub    Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyTimer.Tick        If NewBlock(New Point(DrawLocation.X, DrawLocation.Y + 1)) = False Then            DrawBlock()        Else            For y As Integer = 0 To DrawRectangle.Height                For x As Integer = 0 To DrawRectangle.Width                    If Blocks(x, y) = 1 Then Blocks(x, y) = 2                Next            Next            Score(0) = ClearLine(0)            If Score(0) Then                Score(1) += (Score(0) ^ 2) * 10                Me.Text = "分数:" & Score(1)            Else                BlockType = NextType                NextType = Rnd() * 6                If NewBlock(New Point(5, 0)) Then                    MyTimer.Enabled = False                    MsgBox("游戏结束,按下 Enter 键重新开始。")                End If            End If        End If    End Sub    Private Function ClearLine(ByVal StartIndex As Integer) As Integer '消行        If StartIndex > DrawRectangle.Height Then Return 0        For x As Integer = 0 To DrawRectangle.Width            If Blocks(x, StartIndex) <> 2 Then Return ClearLine(StartIndex + 1)        Next        For x As Integer = 0 To DrawRectangle.Width            For y = StartIndex To 0 Step -1                If y = 0 Then                    Blocks(x, y) = 0                Else                    Blocks(x, y) = Blocks(x, y - 1)                End If            Next        Next        Return ClearLine(StartIndex + 1) + 1    End Function    Private Sub DrawBlock()        Dim i(4, 4) As Integer        For Each p As Point In GetPreviewPoints(NextType, 0)            i(p.X + 1, p.Y + 1) = 1        Next        DrawPicture(Blocks, DrawRectangle.Location, Me.CreateGraphics)        DrawPicture(i, New Point(DrawRectangle.Right + 2, DrawRectangle.Y), Me.CreateGraphics)    End Sub    Private Sub DrawPicture(ByVal Picture(,) As Integer, ByVal nDrawPoint As Point, ByVal DrawGraphics As Graphics)        For x As Integer = 0 To Picture.GetUpperBound(0)            For y As Integer = 0 To Picture.GetUpperBound(1)                If Picture(x, y) = 0 Then                    DrawGraphics.DrawImage(BackBitMap, New Point(nDrawPoint.X * 20 + x * 20, nDrawPoint.Y * 20 + y * 20))                ElseIf Picture(x, y) = 1 OrElse Picture(x, y) = 2 Then                    DrawGraphics.DrawImage(ShowBitMap, New Point(nDrawPoint.X * 20 + x * 20, nDrawPoint.Y * 20 + y * 20))                End If            Next        Next    End Sub    Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        Randomize()        Graphics.FromImage(ShowBitMap).FillRectangle(New System.Drawing.Drawing2D.HatchBrush(Rnd() * 52, Color.FromArgb(&HFF000000 Or &HFFFFFF * Rnd()), Color.FromArgb(&HFF000000 Or &HFFFFFF * Rnd())), New Rectangle(0, 0, 20, 20))        Graphics.FromImage(ShowBitMap).DrawRectangle(Pens.Black, New Rectangle(0, 0, 19, 19))        Graphics.FromImage(BackBitMap).FillRectangle(New System.Drawing.Drawing2D.HatchBrush(Rnd() * 52, Color.FromArgb(&HFF000000 Or &HFFFFFF * Rnd()), Color.FromArgb(&HFF000000 Or &HFFFFFF * Rnd())), New Rectangle(0, 0, 20, 20))        Graphics.FromImage(BackBitMap).DrawRectangle(Pens.Black, New Rectangle(0, 0, 19, 19))        MyTimer.Interval = 500        Me.Text = "按下 Enter 开始新游戏"        Me.SetBounds(Screen.PrimaryScreen.Bounds.X + (Screen.PrimaryScreen.Bounds.Width - (DrawRectangle.Right + 10) * 20) / 2, Screen.PrimaryScreen.Bounds.Y + (Screen.PrimaryScreen.Bounds.Height - (DrawRectangle.Bottom + 5) * 20) / 2, (DrawRectangle.Right + 10) * 20, (DrawRectangle.Bottom + 5) * 20)        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedToolWindow        Me.MaximizeBox = False    End SubEnd Class 



[解决办法]
探讨

上回看别人用C#写的方块,手痒也写了一个.....

交流一下吧..

[解决办法]
太厉害
[解决办法]
最近流行小代码啊
[解决办法]
学习了,真是不错,谢谢楼主的分享,正在学习这个呢
[解决办法]
最近流行XX行的XX
[解决办法]
niubi a
[解决办法]
若每行只写一条语句你数下有几行?
[解决办法]
厉害,学习
[解决办法]
牛,唉 看不懂。。
[解决办法]
学习了,楼主威武
[解决办法]
关于这个 - -我已经精简到145行了 而且是一行一句
[解决办法]
探讨

参考了一下那篇170行的C#俄罗斯方块,精简到158行......感觉这个世界"呼~"的一下...完美了...

VB.NET code

Public Class Form1
Private ShowBitMap As New Bitmap(20, 20), BackBitMap As New Bitmap(20, 20)
Private PreviewBitmap As……

[解决办法]
很牛B的代码耶,正在学习
[解决办法]
学习了,哎。。什么时候自己也能写成这样
[解决办法]
参考了
[解决办法]
好头晕,好头晕
[解决办法]
呵呵。。不错,挺有趣的。。
[解决办法]
呵呵。。不错,挺有趣的。。
[解决办法]
厉害,学习
[解决办法]
厉害厉害。。。。好好研究下
[解决办法]
貌似最近俄罗斯方块很火。

[解决办法]
很不错
[解决办法]
代码真多,看来我与计算机无缘了
[解决办法]
厉害厉害。。。。好好研究下
[解决办法]
再肖B的牛邦,也谈不出如此精简的良方。
[解决办法]
看得我天旋地转的~~~
[解决办法]
有没有java小游戏啊!
[解决办法]
能帮我写个通讯录管理系统吗?
[解决办法]
不错。vb的


不错。vb的
[解决办法]
不错啊。。
[解决办法]
俄罗斯方块太经典了
------解决方案--------------------


我用DELPHI的先问下有钱没???
[解决办法]
恭喜楼主
[解决办法]
最近流行方块
[解决办法]
很不错,学习学习 

[解决办法]
这里牛人就是多,膜拜一下!
[解决办法]
可以直接运行吗?

[解决办法]
看得我天旋地转的~~~
[解决办法]
楼主强人 膜拜~
[解决办法]
楼主好猛,学习了,膜拜下。
[解决办法]
lz确实够v5.。。。。。。。。。。。。。。。。
[解决办法]
不赖!











[解决办法]
我靠,这是谁啊,这么调
[解决办法]
看来方块游戏都是159行
[解决办法]
你平时写代码 IF THEN 都是放在一行里的?

程序是给人看的,不要过分地去追求代码行数
[解决办法]
厉害啊!!
[解决办法]
争取用C++自带类库写一个
[解决办法]
厉害啊!!!学习中...
[解决办法]
没明白额
[解决办法]
vb.net,
[解决办法]
then后面只有比较短的一句代码我都是写在一行的
换行加个End If难看死了

[解决办法]
楼主厉害!! 学习ing~~
[解决办法]
代码全挤在一起很爽吗?

热点排行