|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
7 K- g& c8 H1 \: o" X Q/ n* [* }" }图 1
8 h( n4 U) A5 P3 n: X完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
) F) W( D X% C" m5 D) h$ e- U' h- x n/ K$ l
! X+ X4 A- U# T$ k. P5 b7 U: WFactory的code如下:
! K' o* L4 d; I+ z* X
" g, `" I/ m2 v2 e' R' p* I5 \/*************************************2 j8 d6 Y+ L# C3 X+ ~- A
/ `+ F" p; u, |/ p2 Q
* author:hgf_starlovecpp@hotmail.com
5 x( x- H. r- D
0 N; k" g4 w7 n7 y' R# [. `* version:1.0) [. {& C# K6 ^* j6 p
" t( j" L* w: M1 ^; }5 |
* description: just for fun1 G. F a6 u- [2 x
: z- b# N& L( w( ^7 k* todo: hard code exists need to fixed
: {' X9 B3 I, S4 X
9 } k4 b& q0 V; x, X& H1 P! s" s**************************************/0 ?, k9 O+ K. v3 a% E
& q$ F3 }+ d& Z- t, k2 _ e& z8 y
#pragma once
9 o% X( ` y4 y' |7 I8 b#include <map>
$ ]8 Y6 L) |, w0 k( e4 l& c#include "Tetris.h"
4 A2 \9 I- k# Z#include "OneTetris.h"5 x0 Z3 I& J& X& Y; o7 R
#include "TwoTetris.h"( [. F1 v* c/ a5 i2 V' \
#include "ThreeTetris.h"
" _* P' T- j5 T9 [/ j& L#include "FourTetris.h"2 t3 H8 A$ P! g R( k
#include "FiveTetris.h" J* h) N' X3 \
#include "SixTetris.h"
" f2 q6 C/ _8 C6 J* G/ X#include "SevenTetris.h". w* _- b7 X# }
; r; @7 j9 W: m( a, u8 C2 Bclass TetrisFactory& K) {. E) _$ z# [; ^
{
* a! C4 ]) H' |* o% h$ ~& @public:
1 |; }- u4 k* \! g6 c- p# \- H/ _" ~- ? % J3 c/ Z& M8 z$ ]/ L/ i8 l0 t8 `
2 o3 F. y& ~+ }. v
TetrisFactory(void)! d3 B/ q6 W( y2 L' y. X
0 g$ `! |, y# F- c7 r
{7 i0 |4 U# Y" P% b$ [
& P% g0 k* w. V# p6 ^' [m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
' p# K. U# G. D% ?# q; B8 N/ g: S6 u
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
! H; {# W) ^: t3 o
- v1 H& k ]4 bm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
" z7 Q0 `$ l0 c# N# f
" J" |+ C, K- t. V _" }) Fm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;/ k k8 x1 ^4 o7 Z# |
# R% w7 c' j. }" Y7 M( t" `8 im_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;! B2 j' Q" W5 Z6 I- V
' T" k1 j& X2 F0 j/ O8 k# |
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
. d1 j5 c7 g$ ]) p& h0 U. D, o2 m, k4 ?* N f: W
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
8 |. r: `% K6 P7 X
?$ b# D" z" ~0 H3 x. y}& E1 Z5 w0 {; R' r/ H F
public: T4 J! `7 j* h. ?6 w$ a
5 g3 C, q# R [% Q
" G! U* x+ y0 I1 a) l2 Y+ R8 I
~TetrisFactory(void)0 h5 G' ?9 D& R6 |# H( ]
* X/ c& N3 M0 h, Z( g: V
{% N- I, P. i3 ]6 d: R
) L1 _! H# {6 w; u- V- l
}. X4 Q0 r8 T5 q- S& ?4 p1 K
* q. J6 Y' A# m @1 A- ATetris* CreateTetris(char sel)3 s8 F- e+ ?- @, A/ E
$ q/ ~' U! `5 |# ^1 B" Z
{) P$ A) x3 X# Z, Z9 N) l* q5 y, N
return (this->*(m_sel2TetrisMap.find(sel)->second))();
/ p& [1 k2 t3 E1 h$ V, ?' R
1 _0 M" {* Y# Z# N1 j" \2 o- H: c( J [. S}
" ]4 P) M8 N% Q* Sprivate:% K- }$ b/ ^6 c1 A0 i
7 w/ t7 g( ~) M9 N4 B; ?. x
" R t+ u$ o1 W b* X" l
& J7 L. T0 I( q4 W6 w5 g9 g; S8 B
Tetris* CreateOneTetris()
) H* L9 ~; E, c8 E
( x0 b, `6 i4 E- l; e4 n2 h{# q, m; ?6 F1 x1 d' c, s' { p
static OneTetris tetris;
7 {/ a! \" e, f( U2 E' g: M" M0 A/ j
" n9 f5 l% ?0 f6 atetris.InitPos();
% d2 v* f$ ^; @1 ^3 g return & tetris;0 z: r* p. {( v0 |: ?. B' _7 P
9 b f# c3 H7 Q1 q( U, u3 W}
$ B4 e; C5 a4 N! x2 i3 T) X, p# y% c6 u
& ]/ E. a7 x# V8 Y! s0 h2 A; H8 r/ M
: f+ y# K) ^/ ?+ F! x3 P2 MTetris* CreateTwoTetris()
2 ]. s6 o' c2 Z0 k. h# o$ |' n' l" s, x! j: l2 r7 u; X
{* k& o- z, t7 ^. w. o8 K
static TwoTetris tetris;
- Z0 b9 Z$ y; y# t# w9 T) }' D" V% U* q5 L* N r
tetris.InitPos();
1 u2 m0 |8 `% h) D, W% F return & tetris;* A" R. H4 O9 _% X
" I9 j; }& O2 X- v
}
+ ^$ x0 ?1 N5 j2 @: R
8 T! J! v, W0 [2 ^" A ?5 M9 r; y0 F! y6 Y l4 I) K
1 ^$ \6 b% u4 {( q' G5 {2 P0 BTetris* CreateThreeTetris()
& I5 G; c& x$ Z: ~8 a& \) c
+ w1 ], t8 L2 I: m2 y{
u8 _0 b' m1 g9 t: o. q; v static ThreeTetris tetris;& E; H" M* Q! @8 T6 j3 n
8 P5 Z' D6 q$ [
tetris.InitPos();
1 F k$ k) ?: a% x- B8 V) } y) Q- W
' p1 F! v+ |: v/ E/ c; n U
. ?% Y3 r. _2 Ureturn & tetris;1 y9 M+ [# v& e" _
" X b/ ?. u0 u: n. U0 z
}
1 C2 W4 ]" G7 N. K" |! P# c: ?' ^- g
$ I5 U+ ?: o8 D* i/ _" T" g. f- S
; b/ V3 v0 `& B& n( t; i2 M" H
Tetris* CreateFourTetris()+ ?6 q6 _* h8 m* S& T8 Y- e% Z9 o
8 r5 \. i4 T% ]+ p; v
{
, ?/ V% u3 P! ?) P6 q static FourTetris tetris;
4 i; S/ ~3 s4 s# z& X! M
5 \/ n3 h, r' y1 Gtetris.InitPos(); }" U& ?* n; K6 R5 E d, a# c b% I
return & tetris;' _: ]+ C/ }$ @. P2 D
+ o. q1 I! F3 K9 d6 N) C; |" [$ j}$ H @! Y P/ H7 ^
2 K) Q1 K- k3 S4 B0 m# F5 t [0 @/ r; |$ g! P" g0 G
1 ?2 O3 d0 y; m8 \& v
Tetris* CreateFiveTetris()8 L; d% _5 n. i0 i5 M! } z; s5 C' t Y% C
/ q }# z1 h2 T) G$ p: ^{) b6 [4 u. f' \1 A$ S
static FiveTetris tetris;
% q5 n4 O7 j! b8 Y5 ?9 ~4 U3 P
3 k5 F5 _: w" K& J. l. {tetris.InitPos();
) Q: E W' J; Q. b& a1 F return & tetris;
) q% j+ w+ K" T' J5 P, Q6 S* U
/ `) ~2 m) L7 x( n' ^" w, s( t}, t; N" _6 x/ w+ ^& H
& {# j0 g8 ?' J, x3 i ^7 `' r
; D8 W3 }; y4 b$ ]! ?Tetris* CreateSixTetris(): x( `" b. y3 } ^) w, a9 _8 @
8 \6 v( T/ k2 g% h# l! g9 w* V: A
{! t. r, s3 I% ]1 G
static SixTetris tetris;% u' ?0 @! G# h) T F
+ ]. [1 G1 d% X' F# vtetris.InitPos();8 p0 I# |$ u a! K0 n: N1 Q
return & tetris;) P E# T- @5 Q& }5 Z
. T1 ^9 t9 T+ M& w0 u' g
}
9 C. d: ?, g1 @' b& z: p
- |( D6 Z1 t% K* G1 v( n
n: G% r: d* j: S. s/ C1 W' R
) F* I' G, U, G. J# ^& o( `" `% `1 q- U6 I0 ?! b+ O$ p
Tetris* CreateSevenTetris()
1 S1 ]# T( M, j- n" y x3 C( G L6 x& j3 K x9 n+ M" @% q) q
{2 h8 ^: P' I3 s5 G0 W% r8 I% b
static SevenTetris tetris;
% |* Z+ a. V) ^: [& Y
. s" y# I) l9 F! Ptetris.InitPos();7 n, X U4 K2 V+ b6 B, A' U! J
return & tetris;& @* }; s7 K; d, c% f5 |& U9 z
R# ~& f' v4 ?+ c+ A* Y0 h}
0 u4 g+ g+ G7 g( B7 V8 F* G 6 v, y8 `$ j' ~
private:' n/ ~5 T5 u/ x7 c0 K4 M5 x* d
4 e2 H' F; D0 W
typedef Tetris*(TetrisFactory::*PMA)();0 \& t" Z9 {$ [! H7 p$ _2 }
: b) g. j4 p1 q
std::map<char,PMA> m_sel2TetrisMap;7 B5 K* r! B4 F( i( D$ u8 k% ^( z
# w% q1 I9 s2 v- V- B2 l' [ J7 s* i3 z. z
};
+ n7 l, i! o1 m O4 s - z5 ^/ f5 x+ y5 b, M' k3 {4 v
有兴趣的朋友可以下下来改改玩玩。
" j$ P" J; _; [2 p+ L
. |" u5 x! [$ B; [ H$ R% @That’s all!! j& G) G# w6 Q
/ M: U$ F( V" H4 P5 oPeter
w' Q4 q- k7 i. d6 y( V$ H+ a7 G9 n3 \, N2 C1 ~/ L
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|