找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10286|回复: 0

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:

4 |# \* k/ C# J: Q) f! I  i% v 1' W5 \6 X5 X. P; h5 p- L% Y
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
6 l) E" h( W# c/ Y
% H7 S! ~* x/ {6 z* l: `, ~/ \

$ d/ \4 m( o" JFactorycode如下:
) y0 I4 S8 C9 S   p- T/ G4 L+ s7 J4 J$ z
/*************************************
6 A( C5 m$ W  i3 r
8 n" ?3 C% h3 O- |* author:hgf_starlovecpp@hotmail.com
; \+ p+ T' l9 p  Z% ^9 E& I* T; h
( G; s& f# g' n# M8 L, M3 K, j4 L/ _
* version:1.0
( U' a2 P8 y: e4 P) O

2 [; ?% {  x% Q* description: just for fun

4 S0 s6 @9 o, U4 P, e/ o& C9 g+ T6 n) N% h( y2 \
* todo: hard code exists need to fixed

* s5 X. j$ Z+ K% x+ D) P
; T0 q( w9 C  t6 y8 C**************************************/
, @! [, v: K/ A6 U

# T8 x/ v  U* i4 S#pragma once" r  c6 K/ @$ O" p
#include <map>
& s8 f) C# x, h% A* b2 y% A#include "Tetris.h"
0 I( e+ r' S; h( T3 o0 J; `9 k#include "OneTetris.h"
' T! r3 R3 ]/ D! w" u% l; m, O( ]- W#include "TwoTetris.h"
& Q( @5 H9 Q4 E" P- {' c#include "ThreeTetris.h"
- a- t8 E. ~' Z8 h: }#include "FourTetris.h"
0 ]; U, V8 f/ ?. K! y#include "FiveTetris.h"! L- {- P: f3 i. A% m! v
#include "SixTetris.h") s6 d3 ^& N& S2 M
#include "SevenTetris.h"
+ U, H8 S" `; n! Y5 x, B
+ b+ M1 l) u, i8 G0 p; }9 o  @class TetrisFactory
& ]( d4 g. ^" u' V( \2 \{
$ @6 ~# f. z  N6 p  L1 Epublic:
& ]3 v' Q2 ^3 t0 o1 ^6 ~2 o 1 L7 S0 n8 s  D) G; H* P' w
, G# ^' W1 R& o" D- B# a  }
TetrisFactory(
void)
# f  R0 h, h' _0 [" [" i/ d

* V6 D6 E5 ^: l2 C{
5 h+ ?% z/ ?8 i. {
: _. o7 Y! R& P9 J6 f
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

9 r! o5 ^3 p" f" `( E$ {' w' A( T* ^2 P
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
$ s9 Q4 e+ `& M8 G9 n! C

$ Q+ |8 H5 y: M5 Z4 o# K; jm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

9 X1 v# |) b9 x1 I  a1 |  {; ]6 p2 k, \8 _0 x
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

1 K  X2 A8 N8 v, ], `
! Q. ^$ h, s  {4 u& M- Um_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

7 m# d( G9 s+ |+ J; h" e) T) |1 T+ R& y6 f# ?; |8 M7 s5 f7 q
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
8 w( u' A% T5 i$ q
/ q5 u2 Y8 o% _9 X! ?# B
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
1 z% b$ I  o$ n7 c$ c/ P8 z% v, i
2 A9 E4 Q+ V/ e
}
9 T; }, f5 J0 [  a# t9 _$ H
public:
0 U& ]# X5 q8 O/ y
2 b( E+ Z9 ?; X9 \
  c: J. x: P% I; U( Q$ z0 I: F5 N~TetrisFactory(
void)
" \+ W4 q& f4 {2 O# a- @; c( y
. l0 B4 T* M3 z) E3 D7 J
{
' ]4 g( p( R) I; A7 I9 m7 I

' B% y  O6 D# D7 b8 b) {; C! G}
% e+ n  S* r- x, Q' V

" k+ n3 J9 o; [; J/ Q4 x' y$ KTetris* CreateTetris(
char sel)

0 k% Q: U  y2 C( N* K) q, X. j/ }6 E' i& G
{
3 N3 @0 v& X8 c( A+ A5 _! d
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();7 z$ ]" g& b& {+ @
8 d3 E8 L4 q: r9 I- u
}
! T2 l+ R/ |+ J6 H
private:1 y$ F3 y0 m. |0 t

& a2 i0 N' N! P; Q: K+ g6 f

" e: H; A" L7 v3 P
" e2 r' M1 O$ i- }7 q5 wTetris* CreateOneTetris()
( G; M: a4 x1 r5 E+ H

7 B0 I0 n/ h- H5 k5 C{
. Q7 u# {! }6 s; D
                        static OneTetris tetris;# V  k0 q" {& ~  a1 L% C

, v- g' D7 B$ O$ mtetris.InitPos();

+ l& D4 ?, U$ N: L) I' w' ~) U                        return & tetris;
( i; s& y  R- \/ R' R$ M( R8 E9 \! x9 p+ |2 X+ k( U( r
}

- l+ j8 ~  n; X! E6 p9 \/ u8 S4 N8 a- z/ Z3 |

* F# l9 N- _$ M4 z% `9 n. @  w) {0 V) _" n! Z
Tetris* CreateTwoTetris()

8 B' y# O# k$ {# T* e
( q  \: x' Q5 L3 e& Y6 j' {6 Y{
( r5 `; a- G: Q6 Q: `2 L
                        static TwoTetris tetris;
9 H! d2 F$ F0 |5 |: r" U, V, `4 y! f/ o: e  {/ v
tetris.InitPos();
- s, s6 n9 G4 `* \: K3 }
                        return & tetris;
+ B. B7 l7 U% n; ^. F% H* S/ V' ?* Y- v2 u" M6 s
}

( q* V) M' y0 m! e  ]" P: r8 z; n4 S# I  A) G7 p7 @: d: G. `  ~
' \$ [; ^- [4 v% Y3 J% r6 N5 v

8 c0 k& B$ Q. B% V5 VTetris* CreateThreeTetris()
/ N) P; }3 p; i6 R  M* K# h) Z
$ S; d" K3 T$ i& v) G5 h
{

* C5 W' u5 ?# b5 G                        static ThreeTetris tetris;' D5 q( J# O2 u/ q. N3 _

7 V0 Q& Q8 L9 ]! C% |  Otetris.InitPos();

, l! L6 P6 h6 ^6 k+ U
, D, ~, p9 t( _3 n* ^
# D/ y$ }" q6 ~! _( l% Y
return & tetris;

' y/ X& d4 [; a( O( D8 E4 ?2 c) X. q& c$ h2 r* W* @
}

8 h5 w7 _! L; w9 S6 l) ^! n  [: E0 J2 {
2 O6 p! P) p3 W7 U5 Y

  i$ M. ~) Q' d7 O6 ZTetris* CreateFourTetris()

# {: x/ `5 T! K# g# r7 x. y6 f
8 u7 c0 W+ Z! J0 w# V, i. ]{

6 G9 l& u! n+ D% Z, L$ j8 i; {- R+ T                        static FourTetris tetris;
+ d: \( G  n: }8 J7 \" o4 O7 Z) R
tetris.InitPos();

& S9 U! v/ I" @: y: ^# T  H& Q( V1 g                        return & tetris;
+ r& k# l" r+ I1 D" E% @' o
2 r, H- Y8 i2 y6 L}
  ^' m  u" A5 T* ~' y2 f

1 a1 k/ r8 A0 e" }5 f$ x; u
3 w+ R0 C1 W7 a

8 i6 u1 @* O' r0 K1 Z) G! iTetris* CreateFiveTetris()

' T7 X, b/ m$ A/ e1 b" r& V" @7 c2 h4 r! m$ t& q% k! I
{
/ G" T; Q  |! Z
                        static FiveTetris tetris;
7 d6 m7 ]; o7 [$ o( N9 |2 k$ V$ Y$ _& Z' S8 G# c, [
tetris.InitPos();

7 ]* v( {4 ?- j9 x5 ]5 ]2 S                        return & tetris;( ~8 \0 {" K- ^2 A3 e( S' i/ Y; b/ A

9 w0 g3 w- r# ^}

# M* r/ i) \7 D  D/ T- q 3 ^' R4 K# h% S6 [

. N" O* a; t+ v; UTetris* CreateSixTetris()

  h* W% s9 X4 O7 x0 G2 r4 ~1 y, v2 \3 a
{

! Y% W# J0 y, W  X                        static SixTetris tetris;" M+ H! h$ S2 a( {' Z
3 Z5 i  n7 @) ]0 W
tetris.InitPos();
2 v& N& X8 Y; |7 ?
                        return & tetris;5 K5 b' J" `$ t! O( ?$ g5 s3 l

- W3 U* d* B5 e9 f* h6 V}

; F- e0 J) [3 k/ I
6 Y( W0 R, q: d+ a, b& j
% I# N3 W$ a2 _9 x+ a/ i
+ J: P! v8 F7 M/ v9 e7 A

; y3 P: v) o0 \& n  u' E6 @Tetris* CreateSevenTetris()

7 C9 r. h# V- L+ A, e0 P' W( E& q
{
9 Q. q! g' L: K
                        static SevenTetris tetris;  j4 ^8 Q6 _# J' p% B

8 F% l3 k( t& T4 n3 ]tetris.InitPos();
! I" F+ {: U' B# ?/ @& C7 X- l9 ]
                        return & tetris;
; Q+ i5 U- c8 x& ^" m" l! h6 F: J' }* W( x! w' ~# i4 z. g
}
. L  D) V$ n" i: ~! g/ Y

& O" h) j. n2 V* z* cprivate:: w  Q3 I+ T0 H3 v7 U
/ n) o( F% `; ^! P/ c
            typedef Tetris*(TetrisFactory::*PMA)();1 m/ \: y% y0 v) e& F( H

$ j/ S5 o  _7 g% @" D! d" Ostd::map<
char,PMA> m_sel2TetrisMap;

& }8 u' ~" ?( `1 _) s# Y1 c7 ?# N3 _, W8 i. d0 E, w* t, z( k

4 x0 _, N- k# p) J4 |0 J};
/ b4 O2 M8 ~) k3 E, `5 I
8 c6 o$ n4 n: J& w3 w4 Q# u有兴趣的朋友可以下下来改改玩玩。2 T3 g" \# K) \3 o

. j/ u" `) Z; r0 b5 @; b7 P0 wThat’s all!$ }2 V5 ^  n6 K! ^
- ~. G" T, b2 q. M0 c
Peter , U! J( Q" M  Z6 ?+ N

- V0 D" k& s* f1 z+ H[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-7-19 12:17 , Processed in 3.257658 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表