|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
/ h) _, e! I0 W& t; Y/ @! A! S图 10 j4 k& q; d0 o( w( m8 `+ C, K
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示: M6 E3 u' B8 v& h' r! _
& h* z, u6 ~7 e8 b8 K: M5 m, p7 H" I) h( t2 |' e
Factory的code如下:
5 S% [. U8 B- J6 k
5 q5 n- x& A: M2 |/*************************************
7 G/ X" Y3 `* ]; S) b4 K4 l1 D9 X( B6 W' |7 a: c9 h' S
* author:hgf_starlovecpp@hotmail.com+ N3 E9 L9 ^# f$ R
; [6 s# A# T: R4 D% C+ Q4 `
* version:1.0
. `2 g0 Z: j9 M% H: U5 m T
9 u( Z, a3 u$ W! ?2 ^6 Q, ?* description: just for fun
* P$ `% O) q6 z% o5 K1 R% X2 e% G1 U. T* y
* todo: hard code exists need to fixed
0 P7 [7 {. X! }( G6 L* ]2 s; ]/ u8 \0 b
**************************************/8 A8 k+ ~% d; A" K+ ~# U m: i+ [- q! Y
3 z; A1 q1 M8 ?/ O( o' H1 y#pragma once6 O+ q8 ?2 u& K! q. G
#include <map>8 d7 V0 l. h- e
#include "Tetris.h"
- w+ S5 K7 z7 |% F0 j) _6 }#include "OneTetris.h"# O# W X$ `( S, _$ R/ L" P. _0 X
#include "TwoTetris.h"
/ p E' I' q- L2 u7 e" v#include "ThreeTetris.h"
$ `4 F4 {& i: f) X#include "FourTetris.h"
+ F, K4 @4 z! c& o, u#include "FiveTetris.h"+ c: T& b/ ]$ D2 L- @
#include "SixTetris.h"
7 L3 @8 K' ~! A9 d7 ~8 [3 y' y7 E#include "SevenTetris.h"
% L% X# H# o/ z% v- r
* O8 w6 H c- L9 ~( S. J# Z8 {class TetrisFactory! b1 z, b3 n6 [! W
{
+ K& e5 [6 J- g& xpublic:
F% g1 d% Y6 L M: T/ w : e. i5 w, Z! ^5 y
X- ^1 L: K' i5 @8 G+ k) d
TetrisFactory(void); d& y- B0 C5 o+ _% B. O$ X( Z
" S2 v8 f/ n, y+ q* q3 o3 O$ v0 S
{
& w: f! a/ V1 O: t2 K6 m& R# A1 N Q+ S, e( }
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
3 H2 H: x# [3 L" ^8 A+ n3 c; \& ~5 j t2 C9 I# O
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
" V4 i$ c5 n9 P0 v6 ]# I- n& J1 W: B, {$ G2 Q! L ]. d( U
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
- {& L+ h; T3 b9 S( `7 a' h; Q! B: V2 d9 I7 Z
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
% E, }6 L+ v0 n+ I* p
9 G, i+ F- c3 P4 S( _m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
" i# j3 v2 u4 l& p
5 y6 I5 L0 x; c% l. a8 @6 Ym_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
0 ?% m( n# G1 a/ N# Z/ g8 X0 m9 P1 z- ~$ K( u+ a8 q
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;+ M' l, }4 j( k; a' k
7 z/ p4 @6 t2 Q9 ]5 T" X# v
}8 a% ?6 Q. m# C" ?6 P; Y
public:/ ^2 |( e8 O9 ~# g
& F( _) @% V) h8 V
: S! }9 t5 K# @~TetrisFactory(void)
" P+ G0 q5 P$ e9 D9 m8 H- W0 \* A, s" a3 P" @# n
{! }& [1 R6 v3 A+ ]: C
7 |$ a [4 _% t9 ~- Y}/ B' P6 b: D, \/ i
! \; E' Q6 j8 s
Tetris* CreateTetris(char sel)) I. f, t4 P1 D5 @+ M- |& w$ r$ D
0 k9 C+ y3 V+ z/ T6 O: H+ L! F{# _* W; V+ L9 S$ i7 h; h
return (this->*(m_sel2TetrisMap.find(sel)->second))();( u( C8 l( a1 i: y( I: X4 t
: K2 i: U3 I: v2 N/ g5 `% e5 @! ]
}. }% i9 q8 Z- H. w3 {$ @( c2 G
private:6 |6 C; g" s6 }* l+ m2 x% n) l
2 r4 {+ Z/ i4 ~; k0 a/ J
/ D4 x+ \+ S3 k% T g* ^' i- @
3 m4 w7 T7 B- g3 ETetris* CreateOneTetris()
+ ~5 n4 Q" d1 O* G' |3 v& t" D1 V; g, c, a. B3 S/ M* k) d' I
{
, [ ^$ |* L: j- Q' y; | static OneTetris tetris;
/ c% k# J9 ~7 C. x6 }& H4 ~) M2 o1 ]5 p- y
tetris.InitPos();6 h! u: ~) [$ O( z1 b& X+ \/ S. ]1 I
return & tetris;/ |: R0 E# T4 ]* ?& ]
: N3 R: c/ m1 I" O, O+ p; M}
9 ?0 ?6 u: v0 b0 I4 S! t2 X1 u+ q. M0 K4 J5 ^
2 C0 ~8 t! Y& b4 ?( D [
1 ^; P- [6 I1 B' \# f" ]( G+ e: LTetris* CreateTwoTetris()" o! D# g+ Y3 M2 a8 X j
1 a8 T3 x" _; x) e{
3 V) I, q: V, Y+ p static TwoTetris tetris;8 O/ b, s: F% n w6 J/ t
M. P' k% o7 T. J F
tetris.InitPos();
; E* }6 r- |4 u6 O return & tetris;2 A/ }9 d! I! O8 n5 t4 P( N9 W
8 C0 @" q4 [/ L0 K1 ~$ v
}
9 N8 ?# ^# A6 s) }3 i+ k5 p
# u# A+ K- ]0 b0 d
0 R, x6 s; B) Y/ ~7 x K: i. e n+ d5 Q# C2 p; s- A
Tetris* CreateThreeTetris()- R6 e) Q, R& X o5 R/ M
4 M$ |% R6 n3 s' {
{
/ W! B; v0 i- {. Z& U2 v' Q static ThreeTetris tetris;
v8 ]7 U( O! @; M% P0 j6 k$ {9 E
" A5 a1 u+ `5 E1 t( Y1 @tetris.InitPos();
3 q r7 i' I6 G
/ H+ h0 C. N; u- d' |
* L7 J6 Z. W- g& S+ Vreturn & tetris;) d7 q: g p% Y8 X0 m
( }2 g, p* y; X$ s
}
2 L& n7 @; y& s7 @/ N! u! Z; ~
- s* Z# W$ G: |" r" d2 T8 z C* m/ ^: _; N- u- W x% f, i
2 E6 Q' M( x" F. pTetris* CreateFourTetris()1 U1 n0 V4 A4 w
" B4 Z8 @& y3 {" e' P& c{
U! o' ]' I, |8 s) B static FourTetris tetris;* m) ^7 w/ `# Z/ l9 S
0 F7 \$ t3 ?+ i! b* s
tetris.InitPos();. }* R1 ~+ P' [% b) k6 F$ V- D2 b2 Z. P
return & tetris;
4 h0 K) N: C0 t( l9 f6 H- z5 ?" `$ n1 L8 E: f4 C5 _
}
9 ]) I( R% e6 v( s7 M4 t- q# F% @/ C; w6 m3 z$ \4 F9 }
: L# y. i6 d1 {5 T1 Q- h- C
1 G$ I8 W! c1 f5 k' u- Z' O7 Y0 ETetris* CreateFiveTetris()& [6 X: e2 s W
( w; y/ Y) \: ?" @! o/ R
{+ p( h; u7 h% E9 \3 k# }( Y7 _; Y
static FiveTetris tetris;5 t4 W& _8 q$ y9 H& k
) O. Y2 ~5 g! U; o* O) ?4 _+ O
tetris.InitPos();
& V' i1 w7 c0 R# y* c; v5 U return & tetris;5 w. f X R4 @
3 N+ M0 Z* q G( M: ^& M& r+ w}
$ O% E# n% F) S( s$ ?" P( I& p, r
0 h3 l6 Y- [/ y' a, T0 y; ^2 S
7 a: n x, x( K5 lTetris* CreateSixTetris()
" S* n3 Y( O3 ?0 R3 S6 B
8 e: Y# i6 Y1 e+ g{6 q' n8 @- |5 N+ K
static SixTetris tetris;
: ?7 j! f/ @- T4 W
# `: D) R H' r3 G0 r& mtetris.InitPos();
" c% E; v P' b9 t4 ] return & tetris;
0 u# ]' _9 F# I& _
# r* N+ G% G5 B8 Y; f}# R) u' ^9 f! J. M! B% h
! v& P4 @) Z+ n9 l
' C, K" y5 P, ^* u _
+ `$ f+ A5 i8 k
! m2 k, L# b& F9 b
Tetris* CreateSevenTetris()
; j, A+ V2 z7 [- a6 \& h" z+ ~4 p8 o& D3 j. p& I/ M; m6 e8 g
{
) n( {6 G, ^3 x static SevenTetris tetris;( X' w/ w+ N* ~& @( y% }, x; a
0 t* k$ L& ?: P. p% y& ~
tetris.InitPos();
: Q; s, d- _# |) a6 B* a return & tetris;
( v; H- ]; g4 V) {0 f
+ b7 v9 F" M8 \+ |+ C1 e* J}
, z9 T: T5 V4 \2 \: t
1 b6 h6 s: D' X8 e6 T: R# Bprivate:
- G" ]: v0 z7 o, y
: A- d- p+ X6 [+ T% F4 G0 \! Q typedef Tetris*(TetrisFactory::*PMA)();& k% |) R8 C7 o: L; O6 s6 S4 X
- i. ` P+ ?6 u Z, v, U* Mstd::map<char,PMA> m_sel2TetrisMap;! {! ~( {: o) q: y5 f7 P
* |" C- C/ V2 Y3 o3 u- r9 ^. |
9 z; k1 i8 p& y, k};3 ?8 _# _8 Z5 C! Y3 B1 K; I( b
# ~' ]" u; l& e: _" \: k8 n
有兴趣的朋友可以下下来改改玩玩。
* s* C$ m Z1 Y* g8 M + a/ s/ B& E8 t8 S6 S: e3 ]# }
That’s all!$ K N+ i& B1 y' B+ X' [
% N. N8 V$ u7 R, P; S) |, X
Peter
9 W a$ Z! x( `* X( u
0 f0 m5 E8 i: s f! w$ h1 J) L4 a6 v" F[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|