|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: : I- R4 ^* T. V% ?8 q8 r; h
图 1
8 a0 ]- [* p f6 k& N; p完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
+ H& m7 J! I3 i. a# s7 N) g) {) e! X7 C0 w
* _- B- q& G {
Factory的code如下:+ z3 w: W5 R2 t: |5 p
) ^6 I$ s& X2 m6 q' l& Z( a, l! Z/*************************************& |# c" Q% N( G; H( i( r: f- `
' Z. E, U$ [/ V5 n
* author:hgf_starlovecpp@hotmail.com
4 _% ?9 \! z+ `6 }8 O/ y9 o7 ]4 l. w! p
* version:1.00 p5 M& c1 X; l! k- }+ G$ r
6 z9 ]6 {* I/ ]7 ~2 I6 P* description: just for fun* ~5 H- ^0 ^7 G/ \6 h
# q; a9 a" ~- R8 o t* s# V* todo: hard code exists need to fixed6 R2 ~$ F! p' s- F: l/ l
7 K6 B# J1 G' s3 N, r**************************************/
/ |. m7 ^2 _3 d2 X, S& X3 v2 ?; r8 z 7 i- Y5 c( X# ]2 d9 |4 Y7 z4 N% Q
#pragma once4 b7 t3 Q: _: s( s2 d
#include <map>
# c0 ~5 \# Q/ L4 v$ p#include "Tetris.h"# s1 t+ Q/ \3 t/ ] g
#include "OneTetris.h"
! W, @+ O& Z: Z1 N0 j#include "TwoTetris.h"" k4 d: Z+ q# b+ b
#include "ThreeTetris.h"
& m- k+ w" B5 r6 P I#include "FourTetris.h"5 H) F; t1 T$ f0 t6 ~9 o2 J
#include "FiveTetris.h"0 N: s \" W! A) S% t0 f0 o/ x
#include "SixTetris.h"
& i8 f2 ]( Y1 `4 `, X' M# z#include "SevenTetris.h"
2 g8 B; v* t. P. H+ j2 X
0 j" O2 \" T9 Q9 V) ~" Zclass TetrisFactory, j3 E' x, Q9 Z; p* a1 {
{
, Q3 h* i3 k0 K9 o V7 E- X- V upublic:
7 s% \7 q5 n, [" U- j# h; u
& J; j: a) t6 \$ ~ u& ^
( m! J) J" f OTetrisFactory(void)) Y8 L1 u2 N% R
8 f2 a8 G! f* Y
{- [- _ n0 ?3 J+ m) I: ?& p
! r a9 T( ^$ D R" h
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
. l& u l9 p# m
% r6 `; D/ \3 Z9 @9 {m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
6 ]' } \# r) G, d- W! _( A& W8 c8 a% T
) U) u4 v1 I! {1 `% Qm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
- v0 [5 t) F4 D- B0 a, r
+ d1 M l' q$ V$ {m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;" T: M* U t% R4 t
% H( F& W8 o4 |* h. O$ ?2 Ym_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;4 u- U- y. R2 h! Q
- h/ @" m# w7 a* ]) Xm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
' g! K' Z# W7 U9 z' D1 K) j/ d5 X: d* j* r& S4 e
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;4 P) R* I3 d" P" [3 X
" B% o' @( z! Q L; k* N8 Q
}
! \5 Q: H4 [6 l4 d) hpublic:% Y/ ]+ w) H! d: |
9 {. m; }& R% F Y% M
* c- }1 ~8 y, j, P- y
~TetrisFactory(void)" C( A8 B( f& _# h8 V' J; n
, M* N6 |& @3 k1 L5 `* P
{# s3 \! M5 ^! x9 X+ F" W) W Y6 L! G+ ^
4 j/ p6 p1 ?, W
}
. [. p% y- ?8 k' H L+ _: r" I7 L1 Z& c
Tetris* CreateTetris(char sel)
0 f5 X% J- W6 O; h1 T8 h% y; Y1 v8 p& ^; D
{
8 y& J1 ~# \& |7 F- j2 v" s return (this->*(m_sel2TetrisMap.find(sel)->second))();
( g& c2 z9 _, e
; G+ r* `- y+ F}
% j# l; h6 x( Z9 Sprivate:
$ N3 I" ~$ f! P4 ?+ T8 W' F8 x& ~3 ^, I9 \& ^. s8 n% Z. f
' j7 `2 \* w/ t" S
3 G$ i2 E" |: m- LTetris* CreateOneTetris()2 v T9 a1 \/ ^" b2 V) D0 V
0 V! A2 M4 b( b- ~) s
{- R; a7 o, F; o( s
static OneTetris tetris;& f' b# U% g4 a D" u
9 X9 h" r6 H- e
tetris.InitPos();
* e% Y: U! a n' d- | return & tetris;! ?" S; l$ [. l7 S
4 Y% R7 A# I# B- P" R}* H5 t; _2 B9 N
3 i$ { N- Z+ Z( Q3 M6 q7 O* A7 L0 |6 S. X! F6 {- w- I `5 D
* x' i* u. l" R0 ~! g
Tetris* CreateTwoTetris()8 w+ K E, K4 q; f" Y1 P/ s
# p$ s* I0 K' L l+ s8 a3 o7 B9 a. Q{
1 U: q! ~" e7 W% _% {& c static TwoTetris tetris;: ~" w4 |- {. ~' Z* ^
( Z8 Y1 W8 Z/ c; N# U& Utetris.InitPos();
y8 l+ c; I# D! s* L return & tetris;/ {& t& N% F% u. {8 a
- F: n( }; O2 _, d6 O! G2 k
}$ c& U# T4 h' R
1 s* E: S: D4 I! U+ U% |# n
& b, r8 F/ Q) w9 W" f4 @6 R8 v% d5 ]* ?# M# v4 b; E
Tetris* CreateThreeTetris()
2 a0 D0 ?4 S; {) j+ m9 J- p' y$ O) D/ `) a5 R0 k0 T
{
5 W! I+ Z9 ~. S6 z1 i% [ static ThreeTetris tetris;& \, P* X5 z: H8 U
, l& Z, d, T5 e2 i* [, Ntetris.InitPos();
- M& ` q: p |( ~( U) y% R3 J/ ]5 y/ ^: P! _ n
+ l3 ?' `+ G1 E+ g! P# f
return & tetris;" o+ u, T$ E" |( {! Y2 @6 i% O
5 k+ W4 H. R9 P8 s5 @. n$ a}
6 `+ l$ X" c* }% b4 ]; U' G' ~ L$ d s( ^; Q6 g9 ^
6 L2 u; W0 Q6 B7 L6 y7 N3 } T$ [7 C7 V! h
Tetris* CreateFourTetris()' X3 b' x; Q) T% i
6 W2 U- f& p+ a* {9 Z7 r+ w# r- M{
& v4 u i1 b' m) L/ @ static FourTetris tetris;
# K+ H$ X, a+ N+ ~9 G( S0 X- F7 r% G1 w& x' q$ s
tetris.InitPos();
# `% w% Y8 O- Y, | d% ]4 x2 Z# J return & tetris;
# O& h) ]' z4 W6 K& S
2 u/ V: q0 O' @. w/ f) d}1 y* f; _4 O- M) B; a3 e
7 V$ u$ Y! E9 o- n! S
]- l6 ^, A% D% ^& B, h( [, N) V
Tetris* CreateFiveTetris()
' f, q9 L3 g6 a5 `3 ` I+ D
' d+ J% s3 X6 j+ T6 S- m# D{
; w6 v- V% k6 }$ Z static FiveTetris tetris;" A T$ n! w- r4 w
# ?9 v* d: W* ltetris.InitPos();* n B& Z. v4 f3 _ O
return & tetris;
+ a8 n- m" h- M2 W+ T: r, |0 O
: T5 e( `# |& ], z4 `: ^9 X}
3 q0 w4 b) h9 x# o4 U
: P6 |7 k) A2 {( W
5 T5 h+ f! b$ G" qTetris* CreateSixTetris()% C2 u8 L1 D% W" x5 m
, G R& o ?) \5 V
{1 f. V) a/ a8 a4 Q5 R6 m
static SixTetris tetris; c8 ^+ P. F! ^6 G+ j
% R( Y) | T4 L: }' P7 h
tetris.InitPos();
5 Y1 O) G1 L3 o* |% Z3 b return & tetris;% G/ K9 b0 m$ j. k7 s
8 t$ w# f4 O% \ L: I! c( f
}: H2 P0 l- B( b- K, Y7 E
7 h: A3 N |2 Q" y
: k" |: f% Z$ G
@4 M. C1 @" \& f$ @
5 _: n. L8 O# O' o6 g. r" UTetris* CreateSevenTetris()
1 f& w/ O, h0 L* a6 ]/ G) N4 {1 m) y& ~: e6 e9 f+ l' u
{' {( \9 p. ?! U' F" [* u* X
static SevenTetris tetris;
" h& S; Q! z O& i9 Q# L0 } s8 n& K/ m
tetris.InitPos();
4 |3 H1 J# T% F3 D) C return & tetris;5 n2 `& S) `2 F6 g" O6 l
' S& `3 N! V/ `# [}7 n1 f' W, h+ t" ^" ` [
) z2 c, ^: a, w+ \# Y9 Wprivate:
/ { Y) d) z; `7 i5 {/ a
, S7 ~- V; q2 x3 E W+ @ typedef Tetris*(TetrisFactory::*PMA)();
; k$ d; H& h5 i" s% X* a8 ?; B x! e2 N3 P) i9 W
std::map<char,PMA> m_sel2TetrisMap; n4 M& S$ K8 ?* ], W8 R
$ i! f" C) h* ]
$ _9 N2 z" m. F9 V8 r
};
! l1 T; ?" ~! S4 l, g3 k% W/ j 8 }; A" a/ ], H. l
有兴趣的朋友可以下下来改改玩玩。1 n: t* A: n; f& i) m! d% g( {
, l( i' i9 M* }' MThat’s all!
6 b" r, X8 V9 q; H5 L/ @
, Q# O! j$ t) D( U% }9 i+ |Peter
8 ?3 d% V' I) T, L3 j! i$ ]" I b/ h. b6 p% @ p
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|