|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
$ T( H. w, O/ ^# V( Q( p% y! J" D图 1 w. Z7 M$ z# R, z" h
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
, g5 x$ k( s0 Y2 \3 h+ I% Y
! _- Q9 t1 ^+ t9 s
: `3 s5 n; O: C4 u, B! gFactory的code如下:. [3 z) a) Z. U1 H
* c7 F( m/ p; A- ^# j9 h
/*************************************
3 I9 l1 h. C; _8 F6 s" P( Y
1 v% K/ s* H+ g' j7 e7 Z, Q* author:hgf_starlovecpp@hotmail.com
3 P& i- L3 x0 S( h, _5 B, m" L+ [. x: ~! @$ `9 h. i( g
* version:1.0- p7 Z* H X8 A6 w6 H
) j6 ~& j$ @# G$ `( m3 U/ B- x+ C* description: just for fun7 R% q4 f; j( s4 g( u4 y9 C F0 z/ s" I
4 l! d( B) x% v
* todo: hard code exists need to fixed. r0 C* l3 z/ D% O
3 F+ ?) U# f! j5 A$ \3 o
**************************************/
4 Z" n. j, ]' B9 x q; Y
7 a3 j) W, p. K, {' k, a9 x2 P#pragma once9 ]- ?9 w% ~* w; i/ D( ?
#include <map>
( h+ t( b- K/ T) j$ T g#include "Tetris.h"
4 R `- v Z1 W8 O0 Q#include "OneTetris.h"
0 ` i) p( R$ [#include "TwoTetris.h"
& J; s7 i6 W# m/ ^- B/ S( F#include "ThreeTetris.h"
, |5 c4 ~5 }+ Q" V0 f#include "FourTetris.h"0 W0 r5 J0 a6 o6 M5 x0 {
#include "FiveTetris.h"
_1 V$ O) `* q a# a#include "SixTetris.h"
2 R, q9 O5 A0 ]5 C) k#include "SevenTetris.h"& X4 q- M. H" }3 x, ^, E
+ F6 g, ~4 q0 G$ q6 l& D" Q( z, d
class TetrisFactory
9 Z( ?7 u; q& y{% o1 q$ k" ?1 f8 x
public:
- H' d* O6 z0 B" ^
. B& d) [2 J) b6 C$ a* }
# |/ {# u& k1 I. N, eTetrisFactory(void)* z9 r" N0 u' }5 `
; k" g9 g3 @ I1 b; q( K. k
{) O, o, o2 d& G$ O% @
$ u+ f& [! e$ c& k/ y3 G
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
, {' x' M& z7 Z" d, q, Q+ j/ b4 F7 h1 o0 b
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;- W- c+ W6 _- a1 q1 b
% ?0 O/ m8 d+ |1 s3 W
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
6 Z" a' }) {- z1 Y+ L" \- P5 i4 X8 h) X8 Q
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
2 G) s, `+ X2 q T( \! u8 } K3 D, ?
" Y8 G( v/ C7 F# em_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
( J% v% P) E- I
1 e* u& j$ ?3 F# x1 b- h+ Am_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;( Y7 i. I; H. w
! \" I( v6 F! a* s: Ym_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
! K$ n3 O, y+ B
. G+ X3 I/ ~* |8 S}) b" p; }' q1 Z1 }
public: i8 v" ^" ?5 ]' f, T- u" o" @
" g3 d$ |- w0 \7 e3 B! ~# ^: t: k+ h2 t4 r M% @
~TetrisFactory(void)
' B0 R! }# C r6 n! s4 q0 P: ?. ?- h2 v, a
{
, T @( }) Q- q g, R: r/ m! R! W r& z) K
}0 S9 |( D& {. }' C4 u( Z8 s! {
7 D3 k: O c0 e/ A
Tetris* CreateTetris(char sel)
8 Y, `3 V, _/ ?1 i. m
6 h& V) T3 W( n# b4 U{
$ h) N# T7 [ u! S; V+ y# y return (this->*(m_sel2TetrisMap.find(sel)->second))();
/ e3 T# ~: s! |# e% L, `
; k8 d- A2 C0 ]: l/ F6 |}
* @/ K' c6 g8 f4 \private:
" b( u7 b/ D) }0 o; d j3 L- W" h7 Z% a, g8 a) u P* x; R
' @' V# D$ h* `! H( ^" N6 ?6 @: R# ?
Tetris* CreateOneTetris()
- l9 C, l, C- H1 Y- I5 M1 r2 c
" |& I& q: N. W# \+ L; ?: t3 Z{
2 c) a0 h9 y% Z5 o* _ static OneTetris tetris;2 x! w" ?* a0 h0 J' I
) _' V9 U9 k: itetris.InitPos();
* ]8 z1 i% g( p7 T1 b [) J return & tetris;
/ ~& Z2 ]' c1 ]* e# T
1 x+ E) I/ P7 {}
. f$ D! c; n( e& p5 q/ m
9 d# Q) J5 \3 J7 z0 l9 `
7 P9 J# K/ U: \5 a" e& y1 D
5 X: n0 @7 i( M8 ^1 \Tetris* CreateTwoTetris()
, w1 s6 ~, ]: m
+ r$ f3 q; h& {- ?' N' S- q{
* c( x4 O4 T9 ~# w" e/ t static TwoTetris tetris;- S: x& M3 j2 T0 q
( b1 p8 t8 D9 B- a9 a ]9 X
tetris.InitPos();! m5 Z2 T: h8 a- }; R
return & tetris;
/ c! u) S2 N S" z+ q$ b0 {! E3 V; _: F( n9 `8 G
}; H! r; w5 n/ h1 @% M a+ M' H
/ D. P v( h8 K( ], `5 ?2 j
4 P+ q; v9 q) u$ R. ~4 E3 m% ~- I7 `& V: @; B& r$ [
Tetris* CreateThreeTetris()
- k" e/ J- ^2 H: [+ ]
5 y( T- V/ P( U& d# x7 g{9 Z a: s9 ]. ?7 l
static ThreeTetris tetris;
5 h9 A+ P9 f" Z. n& z0 K1 \% a
# T% \. z* D% ^+ H: [tetris.InitPos();
[- k1 ~) X6 Q1 f/ t# g8 g1 a; p9 D: v& w& n; T# y' Q* o
5 H; k; v* N! e' I( `' k5 v
return & tetris;
; z' _9 g: M; o: K- s, ^8 R, f* S
$ O9 y& E* }% n, X}
* J6 s6 L |' I% N2 ^1 W) r. |
% p* F' F2 {! p( a, j1 G& z
$ c R: s6 y- @) f% E6 r' W# B- _1 B* w% A8 P# _
Tetris* CreateFourTetris()
0 Z, e0 ^2 k! U, p" k! E/ i+ e% ?: o' o0 a% |
{
0 z; D% a ?9 m$ y static FourTetris tetris;
$ d) f7 S4 ~: p
0 h7 I4 o% S* L6 ]& m! M7 z+ Wtetris.InitPos();: `( S% A4 e/ i r/ K
return & tetris;
, @4 ]- b5 J- {5 F, x6 ]8 U
1 P# H2 N( Z5 t+ C Q* c/ V}( C5 L9 j* o# ^$ ]4 u* c
& f+ O! h/ E& a( z4 W" K) ^) S$ s6 W E& y( } y
5 `8 a ~2 ^9 a8 }$ W- x' B" bTetris* CreateFiveTetris()
4 m7 c- A1 v' A5 B0 R6 g9 k2 _# R- x
{
1 o; A6 {, d2 o' k8 ^' e- r static FiveTetris tetris;! G/ \& k6 K" K9 m4 L$ {
1 g* E6 O" Q: j& [$ xtetris.InitPos();1 x% m; H/ A) ^- ~- `( m
return & tetris;
8 Z" f: m+ o9 |, u0 K y' u2 q' L* ]4 l* y/ O Z
}
" o) n2 N. \1 a8 x0 s' b. ?4 R
- Q6 a. _0 r' d9 i4 ^: h. J8 e+ h4 Q6 r8 q- O7 C4 q, a
Tetris* CreateSixTetris()1 |& |8 }& _! J' a+ T
5 f4 ~* m3 l8 Z9 y$ J7 O, Z; c& R
{
5 f- [* }" T+ r5 Q9 M, U; l `, e) J static SixTetris tetris;8 ?$ _! b+ @0 ?3 V
: R+ j* @. g& P4 i0 |) H- S6 O
tetris.InitPos();8 k9 M/ Q8 X V: H( f, g9 W
return & tetris;
3 M6 n- m0 F( T/ [! @9 _( R R. L% l" f9 X* d5 x7 d8 U0 D5 L4 `# G2 @
}
) ]4 ?: Q& H- [3 w; a
: ~& s7 a2 W% ~7 [0 a M6 ]- F6 ^5 l" N* A+ Y( Y
9 O3 f" ?: `4 ]0 Y/ d
6 ]. C& e% p2 f
Tetris* CreateSevenTetris()
. n" A6 ~0 f1 C
c: ^% r+ n7 h4 Z/ [' T- B{
' n5 x- V, H7 ~# } static SevenTetris tetris;! j, J/ K3 Y A1 Q" C
2 s* V, M* O3 ]+ U1 O9 Y9 C, Ttetris.InitPos();! d x( C$ |7 A
return & tetris;
p1 S+ F1 _" P! P3 o6 Z) Z9 @ u/ k2 s8 \% D `( e) n
}
q) \9 Q( ^" M
h2 I& t) N& _- G" n tprivate:8 Y% A% o$ p7 H' i. M7 Q ~
; g( {0 C' h( M, K2 k- f" V typedef Tetris*(TetrisFactory::*PMA)();3 V* \* y1 ]) S% e& u% c4 @% h$ s
f: O* Z5 ^! e5 j: |/ P# Fstd::map<char,PMA> m_sel2TetrisMap;
' _4 ?% w$ x5 R4 e" R
" j: W* O( L; ?2 h% j
`5 ?$ k% P( B" Y5 ]3 _};) ~. }4 K& t' R
# k4 a: t/ U8 \! {有兴趣的朋友可以下下来改改玩玩。
3 `/ b1 [) w6 l* A2 [ & A1 b O$ m) V6 b1 f' l) d
That’s all!
, B2 _6 \7 u# a+ R* ?2 \ " i: ]9 T$ Y# d1 B( F
Peter
% G2 K$ i$ t# d6 d$ W: U( T, g: x+ d, c9 A/ U+ V! y- e3 j3 y! J9 I
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|