哟嗬...这不是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
[解决办法]
[解决办法]
太厉害
[解决办法]
最近流行小代码啊
[解决办法]
学习了,真是不错,谢谢楼主的分享,正在学习这个呢
[解决办法]
最近流行XX行的XX
[解决办法]
niubi a
[解决办法]
若每行只写一条语句你数下有几行?
[解决办法]
厉害,学习
[解决办法]
牛,唉 看不懂。。
[解决办法]
学习了,楼主威武
[解决办法]
关于这个 - -我已经精简到145行了 而且是一行一句
[解决办法]
[解决办法]
很牛B的代码耶,正在学习
[解决办法]
学习了,哎。。什么时候自己也能写成这样
[解决办法]
参考了
[解决办法]
好头晕,好头晕
[解决办法]
呵呵。。不错,挺有趣的。。
[解决办法]
呵呵。。不错,挺有趣的。。
[解决办法]
厉害,学习
[解决办法]
厉害厉害。。。。好好研究下
[解决办法]
貌似最近俄罗斯方块很火。
[解决办法]
很不错
[解决办法]
代码真多,看来我与计算机无缘了
[解决办法]
厉害厉害。。。。好好研究下
[解决办法]
再肖B的牛邦,也谈不出如此精简的良方。
[解决办法]
看得我天旋地转的~~~
[解决办法]
有没有java小游戏啊!
[解决办法]
能帮我写个通讯录管理系统吗?
[解决办法]
不错。vb的
不错。vb的
[解决办法]
不错啊。。
[解决办法]
俄罗斯方块太经典了
------解决方案--------------------
我用DELPHI的先问下有钱没???
[解决办法]
恭喜楼主
[解决办法]
最近流行方块
[解决办法]
很不错,学习学习
[解决办法]
这里牛人就是多,膜拜一下!
[解决办法]
可以直接运行吗?
[解决办法]
看得我天旋地转的~~~
[解决办法]
楼主强人 膜拜~
[解决办法]
楼主好猛,学习了,膜拜下。
[解决办法]
lz确实够v5.。。。。。。。。。。。。。。。。
[解决办法]
不赖!
[解决办法]
我靠,这是谁啊,这么调
[解决办法]
看来方块游戏都是159行
[解决办法]
你平时写代码 IF THEN 都是放在一行里的?
程序是给人看的,不要过分地去追求代码行数
[解决办法]
厉害啊!!
[解决办法]
争取用C++自带类库写一个
[解决办法]
厉害啊!!!学习中...
[解决办法]
没明白额
[解决办法]
vb.net,
[解决办法]
then后面只有比较短的一句代码我都是写在一行的
换行加个End If难看死了
[解决办法]
楼主厉害!! 学习ing~~
[解决办法]
代码全挤在一起很爽吗?