|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: 4 c7 z8 Z) V& e
图 1% ~: ~4 M4 \. v4 O3 K
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:1 J( o3 x: ^/ C0 F K2 t; B
) W4 C% Y) _" d' @3 n4 Q
& P' n8 n _/ a6 f2 bFactory的code如下:4 h4 x" i6 q8 A2 C$ @
* ?# r9 k& o C" G/*************************************) ^* s( N8 S9 x( a
, o$ ~9 w' J/ _. M3 G* y* author:hgf_starlovecpp@hotmail.com
( D% a* @- y2 [* r' i+ v
5 H: U4 w: C6 i1 E- v$ ?- c" U6 i* version:1.0. @' ?* ^9 b7 k# ]
4 j- Y1 W! {" X
* description: just for fun
% s# w0 b' y" x. Q8 G2 V. i, C' n* R( X* ^# j) M/ k8 X3 u
* todo: hard code exists need to fixed
! c; T+ ^2 _1 D( K% Q' E7 Y" h6 G
* |: Q1 L- ?* k0 f. E9 X; F( B b**************************************/ M/ b) j+ t4 g9 ]
" K. b/ c2 q3 ?# o& n#pragma once8 B; r4 N N, ^9 `: a V
#include <map>
$ N+ M# j4 E* a- t9 Q$ G' ?# L#include "Tetris.h"
9 L' X3 A, z1 G/ l7 s" i" Z' K#include "OneTetris.h"
b- [" f- q9 N. e/ [#include "TwoTetris.h", T9 H; \- X$ k& Q. S5 }
#include "ThreeTetris.h"
/ ~3 f" W8 ^) z' W$ n#include "FourTetris.h"
; z7 b% Q P) G#include "FiveTetris.h"& g0 E/ g; H6 I. j7 G: R. I9 ?3 ^
#include "SixTetris.h"
9 A6 P2 p1 t5 ^2 t: E8 y5 i/ h( K9 Q#include "SevenTetris.h"
4 ]0 m- }& B& u; [
( {/ r- g& F/ i- v; u6 Pclass TetrisFactory6 |! M" n6 ]8 i) J9 B
{9 x# d7 @: _8 ^( ^' x, }9 D
public: F% \& Y- h) N9 v: B+ U7 H' J+ G! X
0 Z6 B8 i0 z& F5 t& X8 F
' H- D) n0 \7 y# ?) f3 Z1 s$ }* F9 rTetrisFactory(void)
, c( c# [ F; D! |. R7 a- c. R8 d
) E' V: k# E) U3 x+ I$ y{* g- d) @" }# i) ^$ F1 { f: x$ E+ c) N
- ^- V. s4 Q7 ?$ F6 P5 N9 F
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;9 \+ H" N( ~: ?( q& p! s, x& o
9 c4 s. I7 c5 w. F: q* Z, F
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris; q& O) [: W- ]6 A6 v
/ e: N! o2 ]3 }: U% Y
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;0 ^/ K: }" s( c
* Z7 r) `9 |1 T0 d, |- Pm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;# r- S3 r9 n/ U" I# n8 W5 Q
: D; p1 Z5 X: Q2 w
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
2 M I: q! K3 j7 r# k$ h. X& F6 i5 q4 [0 U
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;* j. x3 U) k7 a; @
9 w. h3 H% Q# T8 H3 tm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;- W8 L/ r' \ k5 a7 R& u% _
6 K8 k1 L* ]2 I0 m. ?}
- C1 s0 j- t4 m6 O+ m& V# ^! dpublic:/ ?8 g0 R/ y+ A. g
+ b! j9 L' K, n- c
1 K; w# T' j) H0 f' {! E~TetrisFactory(void)/ a2 \3 P1 B }% ~1 h# c
9 @- B. K: a* B6 u& o$ m6 T
{
+ o. ^9 b9 |! f& M" }$ K b
) v; w6 u" w! l. Y. o}
8 \# |/ z' x4 ?7 E' g C+ Z6 Z* I# E3 G& \
Tetris* CreateTetris(char sel)
9 _- U( l1 h+ y( a' T
- P2 h0 I% O5 W2 T; c{
; T6 `& [$ |/ L% K! m% \/ v* a return (this->*(m_sel2TetrisMap.find(sel)->second))();# a5 y0 _& l9 U) @, I- S
) o" n: B0 p! Z}/ q% D5 l9 O! O; P! H% p1 L
private:0 E5 {4 |" l" g' m9 G8 e( M
5 K/ _2 O# e) r0 [
. K6 D. s3 Q3 ^& C# J% Z# A& D# s9 q+ W A2 P. Q
Tetris* CreateOneTetris() s( z0 @+ H3 _8 W/ }
, x( h8 f F2 K# T7 r{
2 f7 Z C* e3 R; p3 X9 G static OneTetris tetris;* r U% D" T$ S3 J4 S. D u
4 y2 _/ |( m- g2 W" Utetris.InitPos();
( @) E) F. C6 J& K! L' k k return & tetris;
m |2 L0 n# S6 @( F3 H) x: c3 e5 V# }6 l
}) w& l% F4 ~% C+ p a
7 }. S: Q1 g2 }) D
0 y1 B( C' ^( W3 e. I1 U g' ]4 W9 ^* B2 y$ v# E
Tetris* CreateTwoTetris()
) N/ D" h& w O( h3 E% }+ O, X" g
{/ y9 s& p) O- n6 [8 J
static TwoTetris tetris;
; c) T' A4 p$ e) b/ E; w8 q9 E _. T+ E& ]9 a+ j. A
tetris.InitPos();
1 }! k) f Q+ m0 c return & tetris;0 O" O1 k9 a6 N
! j/ h' @& y% H/ O}
$ ~2 \: X: P v
! ]% R5 I7 b& }+ J( O
3 n9 B7 F( W3 ]
5 b! t% w9 v W) N6 S/ ETetris* CreateThreeTetris()& {" J, r4 J3 W2 [; e6 }( `3 _
4 ~5 q, S8 X8 W$ }2 X' E
{7 |& @8 X) L$ O/ V: d, I8 F
static ThreeTetris tetris;& F! H! }2 J4 K
& O* A9 c1 W2 b% \
tetris.InitPos();6 a* s" w4 {3 K, Z _; S/ ?
% b! a8 Z3 e) }, h) }
* m s5 P6 Q0 P' }) m3 r$ q
return & tetris;
$ K0 j+ k4 \+ n# j- o
/ `6 K& N( T! z4 Y1 u* m}% g' W6 ~: o) m, M
; F1 G; {6 N5 l( e3 E; t
' k; E! W, }% }; l* v: s: S
$ X; _2 h8 X% bTetris* CreateFourTetris()
- r5 T+ j! a! B* e- ? _0 S+ v' Y( ~( @
{
- k( t2 e1 t5 b static FourTetris tetris;
% u; u$ x) F; v9 J
0 y6 ]. R7 |% `1 h. D/ G( f- Rtetris.InitPos();
+ v1 }% P# U& V- l' t: M return & tetris;
0 Z2 a) a, ^& |; [* |. k' ^! @; @4 h9 O* h ?
}, b# y9 X7 P5 k* D8 F
/ l1 O" Y, b) k0 \$ M" d& R, @ x7 Q$ O7 B+ l7 Q: z3 j. p; r
$ v; \% A" I R2 c6 @Tetris* CreateFiveTetris()+ w" ]* q% \8 V& w& ~
1 ^% W9 q6 ?. Q, }# A8 b, `{
( b' L, R8 U y+ r# c, p static FiveTetris tetris;! }7 @5 m- X5 w$ L) E9 t" K* U8 X* }
6 L) }# Z3 Y/ [% Itetris.InitPos();: ?6 M7 z/ @& t0 [ f; ]
return & tetris;
9 W9 f/ @- |0 S" x3 q1 J) t t; P% {6 X1 V" }
}
# P" O* r: p% R ~% l% i- W! T 4 M& b" T2 A) a6 B9 X
# T4 Y7 X$ _' M# ^' z3 q
Tetris* CreateSixTetris()) Y. e1 l( V/ w: {9 L( d+ r
$ q+ S7 b* ]6 Y e' r{
* q/ V5 r* K$ a' b2 Z' m# v static SixTetris tetris;* x) u6 v4 R$ X3 s
* o8 r) Z2 L3 Q9 W9 D: ]
tetris.InitPos();
3 l3 V6 m7 y5 v& `9 x; n return & tetris;
1 }" Q+ C1 ]' U+ ?4 L
8 ~9 A; T4 N( N0 Q4 \. H5 {8 x}. N5 r# c4 c2 `- Z
# |/ x t% D8 c; M
# d7 W( L. D) w' ~" b- @( Z# T& l$ H) Q3 c1 W# Y" s( j0 M6 r
# K' _# E- K( ETetris* CreateSevenTetris()
( ] F$ ?! t0 i) b$ J' G
2 V5 u' ?0 K: v5 M{" C) ?8 m! Z; i. E' d; C
static SevenTetris tetris;
* a5 y' ]& e3 t; s- t. j8 o
/ H1 M3 T% I; S+ I, k/ Z5 Ltetris.InitPos();5 Z9 [( M C [$ \0 V6 x: m- h
return & tetris;
3 G5 V* }3 ]: T8 Q" v3 o* Z |1 o
' C# s0 d0 s$ Q& j+ C n% z}: t( a* C/ N) {9 E9 h
9 o3 H5 d7 s) k1 m$ ~9 K7 _private:3 s/ Z2 B; g4 G' x
0 b# S" o6 I7 d Z6 r# P# P/ A' u3 e
typedef Tetris*(TetrisFactory::*PMA)();0 y8 t# b/ a7 ?8 ?8 e. |) V' J4 J' w
; H0 L6 {+ o- c# n+ K3 R. g8 V0 ?; w
std::map<char,PMA> m_sel2TetrisMap;' \# U; ?( m$ y- I4 c- R8 ?: o
) i9 d) Z9 ~0 r3 g( E$ s
/ N: R7 e8 m7 o0 g6 K/ F0 g. ^ Z2 K};
8 I. x1 C& v8 o- f 5 C& `) a" A4 Q3 ?: M) ]5 I
有兴趣的朋友可以下下来改改玩玩。) C. J7 X- e2 }6 i' e6 o
|1 Z. b( `" Y
That’s all!
2 D! r. {7 e' t. }9 X ; a/ {6 L) }+ \& z9 Q T6 o+ x
Peter
2 k# N& L! G4 t* ^5 t7 h( x" A
& d/ w3 V8 N, ^0 M; w" M# r, w[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|