|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: " o5 z6 P0 A9 b8 H' r+ k
图 1% U& R) {' N* X6 q# P4 m$ D) {; E
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
2 K* L: f9 N% u& j1 l9 j5 r- e# P) r' h2 _) o
* o2 z7 P: g }5 v) \9 L
Factory的code如下:4 i. T$ S, Q) |) h
5 K0 Y( t) e$ x% W# r
/*************************************
5 }3 X6 H0 d, M2 O$ s
4 R! G; X" r- j" d( u* author:hgf_starlovecpp@hotmail.com
5 N+ H- f: @2 |6 o% v* s2 v
: o' T) I; L0 N* U' R* version:1.0* x! ~2 Y9 M/ Q7 U. f" x
: I8 l/ ?' y! @* description: just for fun% q6 c% t! M: z0 S
# _" C% F; l1 E3 Q1 W f: y" g* todo: hard code exists need to fixed% g5 U1 _, L% a- g8 ^, Y
0 T7 h. V" }" Z' h# w% q**************************************/
6 N6 J* ^" \; `: e: b& c% ^
& e; \' e% O5 f) L+ j- P" l# A+ b#pragma once ]( N# b# n2 q7 v: R5 |
#include <map>
& E8 {0 l7 @$ \/ l' q Y) q0 Z#include "Tetris.h"
: n! o* x& }- h2 F; B5 `# z) V! ?#include "OneTetris.h") h: ~ ?9 g- r4 }6 N! R
#include "TwoTetris.h"* {1 U" q* ?' }. q+ u
#include "ThreeTetris.h"
, f4 M9 J7 Z( `6 F, C#include "FourTetris.h"
! L9 y0 X* F, r; R2 _1 g#include "FiveTetris.h"
& p6 t6 }. b# y) b#include "SixTetris.h". c6 y4 [$ I* A8 _
#include "SevenTetris.h"
% N2 x' @0 M! H" w' J
( F) n) b5 v4 L& U/ S& z: L {class TetrisFactory
4 k& i4 @, ]/ y) e{
; U z _, N; Z: I7 R+ \- Jpublic:
4 X/ h* b' o6 l1 H. a. t
( B8 z8 m# n+ D) J7 S( `' m( }9 }, ?' _0 m9 Y
TetrisFactory(void)6 ^& j! J( v x$ b& J
. o0 n) d `5 Z, O- G4 k: N
{
" n( o5 a l: q5 f
6 b6 F. c6 \0 ]3 ?4 E) f5 K$ O/ Qm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;6 U- b: _7 u/ ?2 }( ~6 a3 z
, a" U/ X% s1 T j+ V# _
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;9 C1 M# f. }* ^( U$ h/ T) ^1 J7 f
& M% ]& ]3 {( ~- ]
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;9 ^6 W' F4 {( y
7 w' @0 e5 [+ t0 Mm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;' r$ b; s+ P! ]3 e1 `* [
3 i, r u- R: ]. S$ I$ fm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;- t! N8 q9 h2 D( X [7 _9 b
) y5 ^: [1 | [+ q) j
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
) f& W$ Z2 t9 U8 V J, M! Y7 f' H
7 Z( ?1 d1 J! Y/ x& |m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
, x' B* o5 f) r0 O! U: [. w) S5 M+ k$ P7 e
}% _* z$ |* H: O/ I$ V% i& _6 S/ D
public:
/ w: L' P8 G; Y w1 R+ b) p' ]
5 ^' K1 _: v5 T# Y~TetrisFactory(void), j9 _" e8 o) L. c& E( U% q; ?
1 B! W; a! D4 |5 X* G, g* u, z
{
8 `: f6 {# S: {: l6 \
$ ]4 y; C" Z$ \* o# F* m. ^9 H0 [ Z}- p) v3 `5 J6 d% r4 q9 ]
( w% C4 K. u; _7 aTetris* CreateTetris(char sel)+ t3 e4 \# J; R. I
' h) R: b* k7 \0 ]/ V
{! A" k: e& t9 {. z& V3 j" _
return (this->*(m_sel2TetrisMap.find(sel)->second))();8 j4 m' e: N4 R4 p4 P3 {5 n
/ r+ u4 V$ L; M+ v3 t3 w' [" ~+ T}9 K% X: b# A4 k4 _ q
private:
5 \4 c3 ~* ^" O# u! A8 m) y! x8 a: p0 P8 `, |8 \
! k0 d# U8 y3 u$ m' [2 I) I
6 }; M/ o3 U0 {2 |Tetris* CreateOneTetris()
/ @7 i7 h; t! E+ h6 B' ]9 R% S! `/ v$ i& [
{" @ f2 V. D1 z* I
static OneTetris tetris;
" }/ v1 V2 d0 w( p8 q+ L i! a' k# n1 D- ?& T
tetris.InitPos();
6 f: u- _8 u% W' K: Y0 d5 L9 c4 z return & tetris;5 E/ X+ F) L' j+ c& x: H% F# L$ m8 |
P/ L0 |8 G7 D7 ~$ k}% c6 K Z6 v/ T& q6 S
& U# a4 C4 a- w+ x7 c, o3 M- g) K% n6 |: B
5 ]. k2 U( M( U* UTetris* CreateTwoTetris()3 Q& }9 W4 {& H( G' ?
& R! z( y& |4 \1 P0 _$ U0 M* O3 K/ f
{3 V- g( L# T) T
static TwoTetris tetris;$ j4 j3 W( N: f. X* c$ X6 D0 X! G
9 K# W t5 T. f" ~4 c6 Ltetris.InitPos();
, b/ w5 D4 M- U3 ?) X return & tetris;) p0 z3 F6 Z+ M) r u
' ~" a+ ~, S! C}
4 `! S2 _& }5 F
1 O2 o& J+ z3 C: m- ~' ~# q
0 c, q* D3 a( T, h+ A
1 Q# t( d2 v6 `7 [2 {7 J4 rTetris* CreateThreeTetris(): V! F4 O5 J; s% F6 e8 N
* p+ p2 ]- O- I1 l" N
{
4 ~' r% {/ o+ d0 J, G static ThreeTetris tetris;
) R4 @ Y4 r1 L) ]6 z% T \. p9 o1 j* W" P7 }; x0 u0 V1 M
tetris.InitPos();
# T3 h1 }) l: z( n. V0 I2 K0 O3 C; v9 |7 K d+ k
& t" ]% H$ c8 u+ H& Y. R/ a Y
return & tetris;
) t1 c" P0 `% ?' q
3 U0 F* |) Y! O8 _. ~9 i}
, t( z% }% x; r6 Y! K( d+ e6 U$ V0 E- s @4 D1 b+ Y7 \
" q- t. L {- a' z
! W) O# }) @7 C2 z9 C1 y. A g% F, X
Tetris* CreateFourTetris()5 C) Q- r3 I5 m3 r( K! B3 G
; ]' s9 V7 u9 I f1 D{
" I1 y' I8 I( _' x) L* l( U static FourTetris tetris;
, v! Y% |) P9 T) l* m# L7 n! Q, i6 }! }
tetris.InitPos();- K' [# @' W# N* O1 \- D) E3 M
return & tetris;
6 {" _( H! j C% L
" K& U: M* ]# ]' _+ j}
) m6 {. J$ ] t* A* ]. @8 n8 j5 x" `: H$ i
7 a$ u* \1 `' s5 T. w Y
# ~4 m4 V' A% |) t. d1 N5 pTetris* CreateFiveTetris()3 [% ^# f$ K" _" s$ p7 L3 f; E3 g. b
' J/ F3 H- N; r' d4 ^4 O0 D& D
{
& e6 m/ i9 R( R! w7 @ static FiveTetris tetris;
' m$ p% t5 d0 v/ h( `4 u7 E p3 x: q0 O
tetris.InitPos();
, _# p* ^ Q/ q! i: @+ Q return & tetris;
/ X* |8 \9 l; Q2 h1 W9 b) s& m
' t; p. N1 ?# R6 R$ [- e}
" t1 K4 p2 v! M# N4 O( o$ ?. I 8 G5 D3 B7 U7 B6 f2 \# O% Q
( m. ?" e6 ^) \. e
Tetris* CreateSixTetris()
& J8 [$ S, M& z6 f, r8 |
) j0 r, D0 L& w{; l! X4 F2 G& u$ R- C
static SixTetris tetris;" V, f8 ^ E+ N4 w0 i/ v( F
' j# z" R) e. [) H6 T
tetris.InitPos();
4 A l& w0 m& d% q3 m return & tetris;
/ J+ J$ b6 n* m7 O, q6 p9 o/ J! x* t! E! i4 D- \+ T" ^
}, j6 L# m1 e, ?
. c2 }4 i! V+ J6 i5 _, i3 a$ j+ I5 U
. z, {8 Y/ U9 h; F; m8 ~$ y: j5 C( R" @
; W9 H+ Q5 ^9 T9 f3 ]7 z, T, U/ t3 ]; A; D, o
Tetris* CreateSevenTetris(). a1 m; l" J$ w" A: @8 c
1 s$ G+ V" w1 G! ?+ N4 n6 s{: s( d& I! x5 W4 t
static SevenTetris tetris;
% G* G7 D* v* t" \
B. W/ p0 J. W8 otetris.InitPos();
9 j% H* ~8 A2 d: m; _ return & tetris;) Q. s' X' C2 h* Q: e( T1 F
# r9 V' H0 Z$ K! f
}
9 P: [" M, `3 u: o
8 C8 Q; \5 a( n# z/ |private:+ D u" P; a6 L. y' U* o
3 z+ R7 ^. m7 r. u8 R typedef Tetris*(TetrisFactory::*PMA)();
3 H7 F% ]# \- f0 T
# i1 y& H$ a2 s7 e- X+ _std::map<char,PMA> m_sel2TetrisMap;0 U7 d* u6 f- W
" h- Y* [# |9 M: E+ @6 ?. S. i0 t8 {; c
& U6 \" r0 n% \9 ^: Q% o};" _2 l p( J% {1 L% h/ s" _- o
! W2 w }% m4 m$ t$ D! M# C( d有兴趣的朋友可以下下来改改玩玩。
) y& r+ L& Z. N- m( G: Y) {
1 |9 F4 L Q2 Q# lThat’s all!9 I" m7 G0 m0 l% J3 K) J |- K
; N. l2 W3 h$ U( l3 r3 j C& s
Peter ' U6 P- ~, N6 q7 E: @2 R3 z
6 Q: a! r! N h' ^3 |. |. s1 q[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|