|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: , z& R# t' `' j% I5 \* p" A0 U# J
图 1
) b( C0 `6 H5 j0 X$ ], k% u$ e完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
; x- \4 V0 H% e# I- U3 S* j3 C; D) c
9 T4 ~% ~) @2 ?, n+ cFactory的code如下:" C/ ~' |( k+ e u; [4 F5 i, ^
" m+ b# F% J$ ^' {8 K3 H/*************************************, @' s2 x7 |8 X+ i
: ^8 L! v: G! Y1 [* author:hgf_starlovecpp@hotmail.com+ d+ U! z I/ D
3 F; v9 y* R* i6 F6 w3 {* version:1.0: m5 a( I, {. \0 ?! j2 Q* {
- d7 g2 O9 D" { `" x9 S* description: just for fun# z% I) }/ o$ v4 y9 O: O3 F
! v6 b- i5 m2 [+ A' F# K C* todo: hard code exists need to fixed+ ^/ C: \. Q: A3 z3 m
8 f! [( r& o. u**************************************// _# n3 Q( u+ H W h4 a
" L- o1 Z8 z+ i, t
#pragma once
4 v7 j* q- R* R3 E+ c2 s6 l#include <map>
6 ~+ [- |7 L! @3 |+ D. O#include "Tetris.h"
0 h6 y" y3 E& U) {/ w) W#include "OneTetris.h"& E2 f/ K+ e# ~* n
#include "TwoTetris.h"
g& o/ e% G* ~ R4 j! `#include "ThreeTetris.h": ?- ~) `' {5 w5 Z; f4 C5 n
#include "FourTetris.h"
. r! Y' x4 _6 r. E/ {9 I#include "FiveTetris.h"
2 c4 m7 I- w5 r3 S#include "SixTetris.h"9 p9 y6 e/ q/ {& d8 R3 p% I' |
#include "SevenTetris.h"% y1 C+ T% K A' D8 W* k# U
: O9 l1 q# l7 R1 i8 i
class TetrisFactory
" f3 n' _. Z; Q% j3 Q" E, ~2 r6 c{
- M8 H6 h$ k3 u/ e: epublic:9 s, D$ F5 d% g& @8 U
( g+ U, s# v+ B2 Y" x. k* o( a
, D6 | j/ B. J! d1 B* ]TetrisFactory(void)# f& V' \5 q& B& C7 W7 q
( J, k3 C$ A w{% I& i% \9 m( g& ^
" D4 T7 u/ H) e" h& u; hm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
9 _% @9 |+ e( n9 i+ l( _
" E# d9 y9 r; l: O5 Qm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
2 z( Z& F. e' @9 j, V! d
' h& S$ z+ `" q5 qm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
5 I, X! g" s7 S6 k3 u9 u! j+ i' C* f! m$ Z
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
6 g; D; n7 w# p2 W' U& l! S3 k+ w& S: ]! V
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;) I+ R* M4 ^6 }) \
6 _( w! U+ g. Y* D( G; }: p
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;6 p# ?# d, Y9 \* a/ r$ J" \/ z
& k( ]; e' H3 N3 o3 D! C6 um_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
3 T. g; g+ i' [7 V' B& y& a' ?" [- ?% d, W8 A! A/ j: @
}/ S i& ~$ ^! P, V5 F, z
public:' q, ~( x- }7 N- c* O1 I/ F
/ b2 ^; Z- o& ^+ K r/ {- a' b
1 b8 B; W6 u: v. h4 X
~TetrisFactory(void)( S9 B' n# Z5 F7 ~
+ w. ?' ]- V' @$ s& d{5 s* g x9 {1 R
0 W2 N; w8 e% Y! A2 F- @7 N u
}
9 M1 }) k9 Y0 j. ?# K- _% B( l
Y j$ R' ]8 c9 QTetris* CreateTetris(char sel)
; R: a' ~6 Q5 s: u. |8 M$ `) r8 u: n8 [
{' d, ?1 Q+ o7 B `5 x
return (this->*(m_sel2TetrisMap.find(sel)->second))();
) n E: ~9 Z: g; A! g" ]! Y6 h+ P* v0 d0 D* U9 Q, y8 @; f
}6 s4 p7 Q @; N0 Z( @7 w+ P4 ~. s
private:
' @- m8 [+ `6 Q" m8 |0 x* b( H+ C$ \' W, t H% z
: E( G' l( B" m! S* ] R8 @9 \3 F
X. Q3 j2 `$ Z( L+ S( A5 H5 eTetris* CreateOneTetris()
3 f* S& Q8 g& B! R+ z6 \+ o6 |! z5 M' o$ Y! Z
{
3 [) Y. l4 w5 Z, L! V! t" ] static OneTetris tetris;- v( n Z" R9 @) G+ K0 ^& A, [
) B" a* |1 Y* R4 dtetris.InitPos();
; m& I, m5 f S1 g+ o return & tetris;# I( p& z9 i% m4 l0 b
& X( _; r2 A) s: j) _4 ?! j& W7 t}
8 b r Q% c! o0 ~; ^+ {+ l+ J: t) J8 K
7 {% m( D& v% l8 d
; X$ c, d) z, ~. w
Tetris* CreateTwoTetris()% D, }# }3 w& ^& w" W2 R
, {1 F' b5 F5 z4 E8 P |2 a
{: D' i) T/ I/ I' m, k: A
static TwoTetris tetris;! }$ m* d( |% ]' R k1 p' @
" X7 O2 q% J" a5 Y7 a; j$ g1 o
tetris.InitPos();
& P8 O3 I* g: @ return & tetris;
9 y" X* n# I+ j' b, e6 P/ P
% L4 P( j2 s/ B9 Y}0 q8 T* Q9 n3 `/ y( V6 y
1 z" O# k/ ?! y$ M: l" q
9 i, E$ A, l- s8 V
; E) D K, ` |% G0 n, q5 ETetris* CreateThreeTetris()
) a0 y" o* t" H2 l; g3 L" d: x3 W( B$ P/ u& }8 L+ b9 p: E2 z
{8 T9 q2 S+ x! O( O' i9 q1 S* ^
static ThreeTetris tetris;2 T" |& [( w; f- E
6 K7 W) H1 D( S# g( A' X5 }tetris.InitPos();2 F6 B9 M" A2 q! a5 J1 e
" ]8 u" e9 G7 D. C0 G
0 {/ E* P6 T; ^1 m+ v! X4 m9 ]return & tetris;, {/ l' J/ D; B. H& U2 a
& |1 ?5 E( X9 X: n9 I1 I# c
}
6 s- C! ]5 J% E: q, V3 a. I# z# ]2 o0 }
( _ l2 y9 B |% B! w
1 L% T c! k l' }Tetris* CreateFourTetris()* b' h0 I- U* i: B( X1 c
3 x: }3 X4 D* a; M
{; U1 i0 [: c+ e! {2 ~
static FourTetris tetris;
# N. j: R# p5 W' ^8 L, d2 s7 C) r8 |- U! U8 X6 k$ n
tetris.InitPos();
, T7 m$ L2 {( S1 i/ N" `2 Z return & tetris;
! A( [, b( |7 i" w( `( k o5 }7 J1 l$ A2 A0 C1 g7 r! Z; Y7 b+ J I- R1 t4 ?9 W
}+ @) t% u% K5 a9 ^. Z5 F
, O- c5 a- k7 ~5 J2 o) i8 P: C% K- v1 X3 u5 A6 B- F
$ S; n7 H: v! l( E6 q4 i5 A1 V
Tetris* CreateFiveTetris(); T2 z( Y& A6 D7 f
6 ]( B) m$ J5 R H3 ~' K{
t6 G/ ^! }8 |. ]( L( l/ N static FiveTetris tetris;2 h) F) ?; R7 _( G3 l
* {& x( K# r/ A4 I6 w3 u9 Etetris.InitPos();) ?3 R9 H9 P, |% H7 V. \( q
return & tetris;
& ^& q5 f$ {, O( J9 J, B
( [# m7 K h& m}
8 H H( N% n: Y# ?( Z" i7 d& A
) L6 N/ h3 u( W; Y2 p; ~) P# I K& T) j. |
Tetris* CreateSixTetris()2 ?. B4 g, R0 A3 G5 M% z+ ]8 @. g& ~
W$ P# O1 L" B" M0 t{6 s$ U+ o% p5 R- L8 c
static SixTetris tetris;
4 S' f9 b; ?7 ?1 |. R. F3 j. h$ x2 H$ ~
tetris.InitPos();
. j* G* |) Z! ^( e9 L return & tetris;
, d) S+ E* P: W. s0 B' [
( o3 N9 l1 R1 K& J* d9 f6 y}
( }9 ^2 x* I5 n! L' |: }
7 B2 \) L3 O N0 W
2 K- {7 e' J# `. i" }& A6 P* T8 w+ S+ h" Y, l* ^3 c
: ?: k( s8 ?5 i! |+ F
Tetris* CreateSevenTetris()
1 e* P1 v: N2 f" r, _( x$ t* f, B7 z2 c2 M1 K4 ]% o: ^
{( e/ B4 C4 T& N, P e
static SevenTetris tetris;. e3 B: \. l* d) s! Z: u+ g/ T
$ k) `( p f- R8 rtetris.InitPos();. G# n! K1 D- M4 b$ s/ ~
return & tetris;( c9 {$ o% B6 g+ i7 d
9 v5 | w" s5 {1 j}
& B& A; W @" |# K
, l: E4 v2 i/ K7 dprivate:
5 P, ?7 P1 }" Z" D, S) O
}7 K. y' h+ g1 w3 \" ^, n typedef Tetris*(TetrisFactory::*PMA)();
- P( A. w* {0 C* k. t! @" U
! I# T% c+ r- P/ d: q- Istd::map<char,PMA> m_sel2TetrisMap;1 [ ?. v, [' p. w
5 C0 d3 s7 ~" T* ~! b- z: K. G" I: r! {
};
2 \$ E3 }& n7 W. J! ]
# W/ I4 i8 \! U Z- L有兴趣的朋友可以下下来改改玩玩。1 ]$ b0 o) X. I1 D8 c3 S8 ^
1 X. v5 q/ c9 i" C" Z
That’s all!
! a" Q% o9 F& |4 J $ D% r# ]7 i; d
Peter
' T, h, n3 H/ ?. p0 T$ w' X
- ?# X: J% w' v# N[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|