|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
& d% [) l) j' {2 w: L( q* V4 |图 1
! j2 u8 _0 u1 _" `! \完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
9 v# K/ @# Y. m4 \$ N$ a; s1 T) S% m1 u5 [/ B* N5 E
1 D$ O$ _, ]/ n7 S+ wFactory的code如下:+ j; P, v( ~) _5 a: K7 v
; \0 R' Q* i3 g3 D# \- `% j/*************************************# G6 L. U5 |( C. ~0 ^
, d! o) O- x8 N0 r+ H+ z6 h9 x
* author:hgf_starlovecpp@hotmail.com
2 P' ?8 ^" X( m2 o+ O& V$ _0 \+ [( }+ ?: J1 u2 @
* version:1.0, ]+ I' C" m' k3 J2 p5 v, ^
% z) S% l0 x+ p) L
* description: just for fun
) H% _) @, \+ D" _4 _( u
2 O3 y; A4 O0 O3 }7 v* todo: hard code exists need to fixed) W: w, K. h9 X$ w5 ~9 X5 d
\* j6 F0 P6 n) {
**************************************/9 u% ?* d8 i4 W z, Q6 u
& r$ t% S( R6 t#pragma once8 F0 R& g9 t1 ]6 {# M. ~. o
#include <map>
2 ~" w3 w* T( ?#include "Tetris.h"8 y f7 _+ G" s/ }; Z" g
#include "OneTetris.h"
8 X& ]6 d* H) L# s |#include "TwoTetris.h"7 x6 P; M. k4 L8 @
#include "ThreeTetris.h"! \' |6 r% }2 Y o# {, l# n9 r
#include "FourTetris.h"
2 `2 s% t. p1 J/ p( J#include "FiveTetris.h"
$ V9 [. E0 ?' ~, V" S4 I- m1 J#include "SixTetris.h"" b: ~6 e- Q( l' n! }/ m- y$ k& W
#include "SevenTetris.h"5 V t8 A8 V( K- L
/ B7 @5 O- E2 B0 C) E) hclass TetrisFactory
+ o- F S: {& z, |1 `* s{. H/ h! [2 V* b8 Y7 l$ R
public:
4 @4 I& j3 q! J, I( \' Y" \ " `% m- N& X+ ], N1 c1 m
' X3 Z3 |4 `$ v! q; vTetrisFactory(void)
) }1 @ N! }- A+ Q5 `+ D% Y" Y1 R) B$ M8 g( a4 F
{' i" Q( O) z2 o- c
% m3 o" D2 U! X& e# `9 Q8 hm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;4 S' e) w/ c4 R( O
3 [" M& P: l; Qm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;# G. |3 H7 j6 I) P: l
+ h1 a" t$ P* b8 J. Dm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
) j, c) o8 U8 e1 N/ _- _% |6 R3 }- F! P0 D u
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;& M9 O+ T! n$ l1 e0 l' ?8 L5 @$ u$ H
) E9 u( r. _. T- t
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
+ N9 V) p1 D+ P+ X4 }4 M1 T
4 Z' P7 c5 P5 B6 n9 a1 Sm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;& e% V) W- s2 Y" E; Y2 G
0 s- C8 b3 @ m4 o8 s" _
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
* @& Q) B) }) |% @/ l2 _1 c' P" z3 j) u3 p u- n$ d
}
3 z( K4 p, F/ `1 i5 G# m" u9 Wpublic:
7 l( t+ a2 D; ]6 o& e
* K" t: Y, T* X6 S6 W" \4 c& V) b% Q
U# ?% J/ R: \1 U8 Z~TetrisFactory(void)8 y2 ^5 \, j) ]
3 o6 ]* o- i9 o4 n E{. x( e2 M! C/ [# y/ z+ B+ p- Q! m
! p5 k/ J5 l" v* A) f
}0 x; {+ o4 c/ v
# u7 n0 l, Y+ N) g& m
Tetris* CreateTetris(char sel)
4 k9 q% c! i5 Y8 ~$ f# Y5 B1 h6 u# O0 p' U* t! i. K+ _$ R0 a
{+ H! U' p6 k" ]% @
return (this->*(m_sel2TetrisMap.find(sel)->second))();& E2 j1 I9 C/ T5 @4 ^8 @; D) H! g
" ^3 ^7 ~* G3 w3 g6 f6 T' v" W& C}5 z1 x/ i6 ]5 s, e* E) N
private:( m6 A7 x0 q5 D8 [) z X" b0 }
1 C s) S6 Z7 S& B5 d# g, Q
) R9 s0 s( \3 k7 \% w" Y" H& A2 }
' u M: c) H; ^* ?. Y+ P }. ~
Tetris* CreateOneTetris()! c7 M8 T' U( \3 S
( h* W4 M" [# F
{# p" j- W/ w0 G+ P
static OneTetris tetris;# f! @4 J# u$ r$ y |- K- D
$ V- u( r7 g1 y
tetris.InitPos();
# z/ I( D1 `+ V return & tetris;& j* r, R. H/ X0 ^9 G+ O; ^5 ^! N
/ r+ s7 i, f+ H' g- b: N+ } P}
! w4 q; N) W" U z8 N; R3 C" q+ \: n& X4 m
2 c3 z( b. L% B0 ~9 J2 W! y( L
! w/ Y$ F/ f. \% }# j( x
Tetris* CreateTwoTetris()
2 t$ N" {6 a. A6 B T- F
4 O# Q0 w, Z8 J$ [: w{( k, I- H" B5 u0 P0 l; h; V# s
static TwoTetris tetris;
; [. c& N: i4 y0 e# ?9 }3 z, \1 S+ J8 j/ W! F/ w
tetris.InitPos();
! U9 ` A) [3 t6 R$ _% z" k z return & tetris;
) C z, U: k d' F3 V
/ a; @+ x3 e8 Y# ^$ Y) s: j! y}+ W9 A5 S* P; T, ]
% ~& Y$ A1 i$ f$ G
2 ^ z5 S, A2 Z0 I6 S: S ]" R2 v `0 g
Tetris* CreateThreeTetris()
7 B" u4 g% v9 q3 J& E
9 h @4 ]( ?1 `( }' }5 H{
3 b7 Q( m6 k: F static ThreeTetris tetris;
+ P# n0 {* E1 v$ P
5 N; i8 c9 Y0 W" N. T+ qtetris.InitPos();& c R# R* N6 g! }3 X% ?/ h5 j
, t1 j/ `" [1 }+ Q! G' i' n( G0 [' i6 r- l2 Z/ r) ~
return & tetris;
8 U2 }7 ?8 B$ E/ \% X$ ~& v% L3 F
}
6 Q% v' [7 j! |
* N( W+ i5 u g6 b B
( ~: I& z+ e4 ]$ S4 {
- v6 ? k& g0 [9 dTetris* CreateFourTetris()
" M6 }7 l y6 c$ L; Z3 ?: H
4 O$ r1 n' Z" |' G{# _9 z2 X% D% k1 N: C2 k
static FourTetris tetris;
# [+ w' S3 B4 t
7 H5 x3 R9 W$ W/ N" T" Ntetris.InitPos();& j0 u; d3 U3 U# c) I5 n
return & tetris;
$ J- X( }3 L, }' `$ I/ _+ O$ l( j$ }
}
8 D$ b' Q l* }/ s8 ^
L* [' z1 ]8 t, s6 ^6 }# X) _
$ \* y$ x: V9 ~+ H! z/ P3 E1 Q, p- f8 M- l
Tetris* CreateFiveTetris()
) @9 D6 d! ?' o" l9 [7 N
) Z# d- B3 G( g" w/ I{6 T+ U/ }% R9 q# A4 l6 g
static FiveTetris tetris;
& G& ]: R% j: ~: d1 n+ U0 `6 p
tetris.InitPos();
, D) o, w! Y% V8 @+ G4 ]. p return & tetris;: Y: e# k9 ] v i0 d7 e$ C
/ |$ v2 ~' o- ^/ S. T( \7 A
} @( P$ J0 s6 I' X/ W% F# V
) |- j S& D9 `- S" X6 m
) {' K8 Z6 R% BTetris* CreateSixTetris() _2 J; y7 Y& l1 g
2 Y0 O0 q5 e- _3 Q: S
{8 K2 L4 _$ G! F# o* w' q
static SixTetris tetris;
* L+ |" b) y: t5 j. K
! u: B+ f! z7 \0 B( t9 i% @tetris.InitPos();- o1 ]2 T+ _1 r/ f
return & tetris;% ]5 S/ n' M. }* ]7 Y
4 Y3 u$ _1 E8 V' v8 s5 A}
- P W, y( V6 g* l / h. f% B7 `; ]/ I8 ]
3 `0 T: d' @# Y F& K! F! F
9 Y. u8 b' k J B; }+ f, b& g9 h9 `% X, E
Tetris* CreateSevenTetris()
. h8 j0 A- }& O* X
( h9 {6 z; ~6 D) z; P) V2 R( Z{, t" h0 ~7 ~6 ?5 t" ?+ \& E, ~! V
static SevenTetris tetris;
: m: Y) W5 H; j+ g# L! l4 N9 ?' x1 s8 E# t
tetris.InitPos();" z3 k3 a: p3 z
return & tetris;
: |$ {3 S6 {' F& y) i. r3 h1 M. M' D
}
) V$ z* n% d6 P9 @# Z( q% E9 C
4 q4 b5 ]# E, F6 H5 A& t1 sprivate:
. A8 L2 b9 a B6 g" E/ u7 {: t
: m: @: [. ~2 H/ w+ f% L) t" a, o typedef Tetris*(TetrisFactory::*PMA)();
# v; X; b6 d* e6 M* g6 h
4 z* V7 D F2 n8 T" }std::map<char,PMA> m_sel2TetrisMap;- z; h8 A; b0 c
/ b/ Q) h0 C6 S1 I- [5 A( g2 F- D) m- L4 z. T8 M9 C
};
1 _" B0 r" F) h7 r9 M1 [8 H . | F- J, S1 y# c6 B% Y
有兴趣的朋友可以下下来改改玩玩。: n# [7 B( g2 X: p, x' g
) m8 W- A( {+ a% l; k
That’s all!; P# M z! J7 A" H! e& J3 F6 v* W9 I
4 S) `/ |1 k" X- h# p4 C0 B
Peter + L* r i' [0 e. H
, p! g- t) W5 m- V, C- M; W3 B[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|