|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
0 j* f4 C) G' t" }图 1
, e- l, `- x; v) a完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
( z" A) _6 i" W( h) b. I" P% I4 s! f- Q
7 ?- _& l; M- D2 T' a. m2 M& z
Factory的code如下:6 X, {0 b/ \5 \! J
! e, V. `% r- t: C. W
/*************************************
' u' ?/ C+ X8 U: n0 z# \
: p0 L' A# h0 M% @8 f8 ^% o* author:hgf_starlovecpp@hotmail.com
6 c v: I) C t0 ~3 Z$ s6 y; m' R Y
* version:1.04 f4 O. g! N8 @: C8 b, |, T; }- F" n
" \+ A* U9 w2 ^9 y# Z* description: just for fun
4 o/ C7 }- F' g; A0 c
: B$ o6 S6 u0 M/ ^% S! \* todo: hard code exists need to fixed5 f) Z0 R/ Y/ s- C' b
# N6 F. @ g7 L' u8 l**************************************/
7 v, }6 ~( r5 M: ?
1 a9 i0 D: a! j0 H#pragma once
$ O; K5 [8 C, `- j#include <map>3 S" q" x" Z; s. X: ?- Q
#include "Tetris.h"4 c5 t+ i) u- @5 i- ]
#include "OneTetris.h"% Y% e q3 d. u
#include "TwoTetris.h"4 L* k+ Q! a/ T- q5 C3 F
#include "ThreeTetris.h"
2 T4 D/ j& g# Y4 ?#include "FourTetris.h"
. o1 U) A& m u: K/ r#include "FiveTetris.h"0 d% o9 ~4 L! ^7 R
#include "SixTetris.h"$ h6 C3 }' v) }! P
#include "SevenTetris.h"1 f1 h9 P1 s8 ^, Z
3 ?4 @+ Q0 d) c
class TetrisFactory
( k& o2 w- H" v+ W: M{
) u/ w) m! m" t9 dpublic:
+ X$ D3 l% X/ z+ a: l8 W
% B/ X2 G% k6 S) Z* b) Q: }. P
& V- z0 t+ f3 T) Q: G9 hTetrisFactory(void)6 N, U) O' F, ~& T: C
8 a8 |. @2 n% D' K4 d# r, ^: f
{
4 Q3 K9 R% }& l0 w+ t+ O: y& U4 ~0 z2 p8 x- G) i" ]
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;% h) ^ j! J$ a
- [4 F. K- d3 _) Qm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;: \# L* m0 S7 y' m! S7 w2 Y J
8 m4 G& |* z% T8 H, i: Q
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
2 B) u% H8 T9 w5 S$ c* C/ ?% s2 h/ A% M1 |; `% Q* M# |! ]( Y1 A; B
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;3 Z2 e8 A# Y* r
( v C: {9 L1 v- S$ z# L7 q7 Y" F) e
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;8 f+ Z. F" |7 L. }/ e' i, h0 u
" K( y# n% U( M- i; \6 C# D
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;/ U4 v0 {4 N! H7 U
6 R/ z, {" b5 gm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;. q; e i0 L- t5 Q
; b% a P6 d% l- N% t3 f/ Y
}5 W$ @# T- H! f9 T$ Y
public:* T8 N8 c! u. _
" Q; u. `( f3 D& ` O, y' o, t6 m6 ?( [: d+ e: X9 b" J
~TetrisFactory(void)$ T& n) } @, v! W3 n
3 B4 h% y4 l/ n+ ^: x- B{: ?$ ^* W. L/ w x
1 Q7 \4 S2 C3 z2 {1 o$ f( D5 U
} V( v8 T l& m( f
y# q3 Z- l! e4 p
Tetris* CreateTetris(char sel)/ O( A1 o! K* H! H
0 G. S3 ]' D* L/ v1 c* T6 `{2 H9 i! m- z# I* w6 ]0 Q E* X
return (this->*(m_sel2TetrisMap.find(sel)->second))();
2 J3 r# i! r3 V! u A$ {: V" ^% ]3 K7 [; G. W; Y F) K* l
}, j" {; ^6 z) u3 l
private:# u) |$ a$ @$ G, X
# o9 b0 t! K S9 g% v
7 z% u3 }4 p; G4 B# f
' Y0 A! o; x8 u& ]Tetris* CreateOneTetris()
# r) |3 T& V$ z$ J& g
7 S0 h( |; ~# ~$ y{, s. [; P8 u( {: S: f% e
static OneTetris tetris;: A$ ^; o% q- Z$ V4 l2 {' \# r
1 N3 Y V2 o4 _" t; C) ^/ v0 U2 z
tetris.InitPos();
/ [, V! h, z E. \" Y5 Y9 A return & tetris;
" l8 r8 `9 {5 y4 T. z, v) x4 ]& n U9 T
}( i/ Q+ [3 t8 G7 i
* X4 {2 H& I5 q3 m
! }5 h# M2 |9 Q/ H
) b! ]4 J' I1 E1 H; I# N% Q2 e/ H
Tetris* CreateTwoTetris()
1 x. {/ B- o6 S3 e/ l# x/ W5 v
: }3 ?3 f) g ~4 e; K4 F; B{
9 ?% n; q+ X& h& p4 Q2 q- L static TwoTetris tetris;
7 R5 E, i% w' D' K: Q
- L8 Z2 d+ v; Mtetris.InitPos();) ]7 D5 r3 |% ^
return & tetris;' E2 i |$ D) A% r/ t# w+ l
9 y* [' U% L& ?; _6 ]0 ^}
. d, j4 {- ]. ^( _' }0 Z! m
1 C9 S9 z1 O7 y
8 P7 R- [/ Y. Z. g9 M0 u
4 G1 N1 D- Z. i% ?! U5 HTetris* CreateThreeTetris()7 q) x( d5 q6 G d2 m: D
3 r/ S0 H. @$ T
{
( S/ c0 b" q4 F* V/ y$ [. G& g static ThreeTetris tetris;/ S, p! ]% m! H/ P) h
5 A8 \! z- c1 s4 N* Xtetris.InitPos();
" \! g5 L% m) c) S& f" E' g
; `* o1 \! W9 v9 _, S! i3 a$ @: L7 k$ h% a$ u& r; ]- |
return & tetris;
9 }4 r2 s; m3 {' Y7 Q h
. O* x, q# O1 `$ M6 l$ s s' }, D+ m} R2 C6 Q. R" n a; p& q
$ n+ A' }) F- p n- ^7 ]! N7 Z4 ]2 ]5 ]( Z8 f2 P
7 H$ O( U- k. y) b% z0 |0 bTetris* CreateFourTetris()) C1 x% i9 {& P$ r
' e5 R$ k) r, y% M. O{" h, y2 D1 q3 c! O6 c( v. V+ p$ g5 _& ~
static FourTetris tetris;
3 v/ T2 F2 Q a9 Q% |: w1 M- j8 T `/ V1 E
tetris.InitPos();& b* g/ _2 S+ J3 l
return & tetris;
0 U6 _, G- P, [ S# c
' p+ _: g. F7 a* [+ e- w}1 g- O h$ J3 e3 g% q' O: a; x
& \! r9 D, @% h, e, m, k; P" U% Q) ]
, i/ u& q- Q. B9 E" k0 e
Tetris* CreateFiveTetris()
. p4 D3 F8 |- _5 V1 S" e1 C+ s* u3 w0 M/ ~- _ O2 J/ T' |1 S s' s# e
{# {: g% O( D( W$ u
static FiveTetris tetris;
) l; g' x5 v6 F9 f3 \; D, J- c' r, j
tetris.InitPos();! I+ V& m) O4 s1 ]% v& G/ I3 L
return & tetris;4 A% g: A+ V) C+ g
$ P; C* g4 C7 [* J* ]. R9 Q
}
8 F9 c0 c0 y7 N( i1 C- d
7 X' V$ b( \2 F8 M5 C+ R: D1 `7 `' Y, T) V. B
Tetris* CreateSixTetris()( ^, `4 Q7 R: d3 R; f
2 M/ h8 J9 R$ ^0 q
{( |! Z% B4 j" c& i2 W
static SixTetris tetris;
8 [; e* R( I: D% @5 `% a6 O
. P# ~; J% r. ?: b) K0 _tetris.InitPos();
5 ?& q& W/ B" F. k, d return & tetris;
5 E$ C' n4 L! w( W' p! Y% }
& t0 X' e! k) t( q( I3 B1 k}* G8 c5 i' `5 ~$ r8 x
/ X6 l+ A6 n5 }# C3 h E/ ^; W
2 @8 o3 V7 w6 P8 U8 Y6 Y/ U" P% u; g( d4 C2 V+ G! D
& N. U3 J" z5 l1 d3 `
Tetris* CreateSevenTetris()
8 A z! w# ]: O+ w6 [0 L# u4 @( w
$ |, |7 O1 M/ ?/ j% u& E{2 a( ?; K6 u0 g% U
static SevenTetris tetris;/ \: M' l% @7 q) @- S- z9 a
- g4 N6 {( q! t2 {( K; g
tetris.InitPos();
' F2 m" N! E% l* Y. `: ?0 p5 \: u4 w) D return & tetris;
: q+ X9 H) [+ y, ]) _7 N2 M
' f8 f8 r7 Q7 I}
1 R9 e* Y/ S; F5 p9 j ( D& K, I+ Q8 F- |8 p* I
private:, K+ A+ C! t) A* }0 R
( s" |) Z* q& N0 ]0 D" ]. q- G4 O typedef Tetris*(TetrisFactory::*PMA)();9 l* u X# H- g/ e' I
( J" y* K" W* mstd::map<char,PMA> m_sel2TetrisMap;7 l9 z6 P! R; D" W
6 m( y2 y& q9 K9 D. u6 }9 S: Z% t, F- F) H
};
" t. ^& }5 y( |4 x! L - C9 b8 y) |- n; B' M; L8 d6 T
有兴趣的朋友可以下下来改改玩玩。
1 y2 t% w/ v! a M
9 e1 {0 v; P; I$ ^; uThat’s all!9 e: f" h" I6 L& `
: A: I7 s P* P- D2 W6 `6 s
Peter $ J+ r# Z) g* d' h. p9 ]* P
n6 @( C' F: R! r! Y7 X
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|