|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: 1 M) j% c( C5 |4 K5 @+ l B
图 1
$ h! }( F& a7 r. G8 ]# f完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
/ l8 I; C9 c. Z9 R3 v9 W. t) O
3 I( V$ q$ o/ a' \" A: t" r
% |8 D8 k3 o. G2 t* a! ^Factory的code如下:- @+ o) N1 ~6 r. q+ o
' b, ^- A$ u0 a- `5 \
/*************************************9 f+ c* j2 D% G: z6 j* k
' j: n2 P7 z+ y5 d/ |, f
* author:hgf_starlovecpp@hotmail.com# }; `# U5 j) ~! J
; g K! Q/ s: y3 V% o7 E4 O* version:1.0
9 D% ?9 d$ h$ I. y6 m
& f& }( D4 K, I) T* L* description: just for fun
" I6 M; s9 D# y. V2 z$ f8 \: e4 `8 a
* todo: hard code exists need to fixed$ ]; U3 h' H. o+ {9 q s
+ K' i; {, S ?" l; m**************************************/
2 e3 _0 P x1 ~$ q* }' O5 B! R) @1 T" i ' x, y9 w. p# w+ O3 s/ ?& o" u L% h
#pragma once M$ w* O# S6 _3 V6 M0 E# g
#include <map>
% t( m8 T; u7 J: ]1 ?#include "Tetris.h"
) n; C; [/ t1 T) E$ A$ m#include "OneTetris.h"8 Y( R% Q' m0 z7 \, g4 E
#include "TwoTetris.h"
% J( w T9 \5 X#include "ThreeTetris.h"
" S- C9 u- |/ ]* S2 v* A* _#include "FourTetris.h": X; I( S- B; Z" W( Q
#include "FiveTetris.h"# E7 R9 i0 N) Z1 _, [$ D
#include "SixTetris.h"- s( F% w8 G; x, s
#include "SevenTetris.h"
+ q6 A a. I3 z$ e 0 _) s/ a" A# U3 ^; V. U
class TetrisFactory
8 Y" k5 w7 M3 k) T6 e6 q{. I! j: u& j! A7 z% h/ C
public:
/ E2 K$ K1 s" j/ t$ l2 \, o 5 s& ]. V. D5 h& b5 m* ~
. ]* L, ^6 a7 E% J" Y
TetrisFactory(void)/ y6 a$ V F0 w @% ~1 n/ E
4 k, d5 t3 z9 K7 }* S{' S7 n/ H. b: E* p6 I a
; x2 K) Z! z# \9 T nm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
! G8 g/ C# o$ d% u. L
0 d+ H$ ]( u, r" Q; E6 Em_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
+ W. H3 c2 }: F0 y* t
& t* P/ B0 Z! M4 ?m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
+ f x2 O0 Y b0 {3 ]0 S. G: e9 `6 B* |; |
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;2 e5 Z! c9 q' M/ ?: _
* r) b( x# ` U! Q' pm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;& F, @$ r5 p3 d, l. k
' h. a2 `8 [' |, z$ q
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;/ `( C8 s) D/ l! m0 M
5 \# q* |5 z, ^5 N$ p) u+ N6 Jm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
( \9 v8 L4 Q4 T8 }% |7 F# ^3 ]! G8 t: @& G0 v& Z
}( a# ^5 u! v8 T, ?$ R. N7 O
public:
. ]6 |' }/ r& ^3 y7 E & b0 R9 @& M/ o
2 e8 F* r0 t0 T( C
~TetrisFactory(void)
) ]' G9 ?. t( ~5 J$ m: f
) I. O8 V# w! B{
, c2 W0 @3 c" ?! Q) {2 w3 o7 X* b
9 O2 X3 \$ o6 M. Z8 q}3 P' x4 r% E( l6 x% R' W7 B- ^
2 G5 f5 g" ]# {1 s7 ^: XTetris* CreateTetris(char sel)5 v- L5 E& K% m
- c0 M' x6 q) S2 Q' Q/ |$ w{# T; ], e' v+ K* Y% |9 X
return (this->*(m_sel2TetrisMap.find(sel)->second))();
1 E8 u: n& a4 W; i( _4 F7 N$ e, S4 A! D
}
. }# Z g, y" B& L. }8 Vprivate:
7 n; B: q) b5 U b- Z2 a/ z! O9 U* R2 E
1 z: A! A/ {0 m% N# C' y
8 c8 b- P& k& `4 t) Q4 ^/ e. y" Y
Tetris* CreateOneTetris()" e Q( N6 W9 E& V. _& N( @. g
9 _4 P, h, t/ o; p! N" h
{- o4 a# P# \7 S E
static OneTetris tetris;, j5 F. z$ x! V% p3 W6 |% T
9 j: C. ~7 j& _3 l
tetris.InitPos();% c2 S: F% Z! [( ?
return & tetris;5 G; A/ k" b R
+ r0 v3 y2 L7 H* {, v, X}
: y: @+ Q" y( ^$ z) s; S$ s
; y& U! \1 P- h; q* s7 H
( x% i) p; F9 G# P8 M, y$ b7 B) G6 G' g( F7 ~$ |& O% f
Tetris* CreateTwoTetris()) I3 v% W/ H4 F+ T+ j# S, h
5 H! i8 @! N1 E! o
{* x3 S/ e% r4 d& O& B# T( ` w
static TwoTetris tetris;, Y9 y) R) K* g& k. K6 c
( R3 m$ u5 }7 s7 u! Htetris.InitPos();% h- l! Q6 m6 l5 X+ n
return & tetris;& K/ Q N2 x8 O/ }9 ]" j
" O: ?' ~7 M# v7 Z! N' n' ?7 O
}
{( Y9 H8 ]9 E! F$ f' G" p# M0 H) T
\$ V2 d" @# p: a% }- X7 q3 {: r! h; C
Tetris* CreateThreeTetris()
0 ^7 P% C" Q- t
) x: V/ `- J9 Z) B' t5 g- _5 N{
2 S) ?- z+ d. b; X static ThreeTetris tetris;& I# ], R2 o' m% H! Z7 `2 A9 ^
w" Q& s0 w. C& |5 S) a) D( ?
tetris.InitPos();$ X) z: D+ g& L$ _; K/ w( A$ C
/ Y5 R& [/ `# e( Z: I' |* J" M7 r$ F7 S3 \. b# c d; d
return & tetris;6 l6 @( { x3 ^# l1 f" |
; J9 E7 l M2 c) L}8 ]+ w% K# ?: A/ `6 `
0 \( V3 o4 y6 l7 H' n6 Z' x) A, y* X2 K/ ^1 }$ W% z2 N7 J
' e$ n+ s! I) G' F7 u. p% E8 N4 nTetris* CreateFourTetris()9 F6 i8 V5 O0 u. [
* |/ `' f% _& u! r' `. D5 @{, m- @5 d( l6 g) n
static FourTetris tetris;
2 O. o5 z, R0 V7 J! _' H( G7 p- d- g+ F" u$ J3 s9 |
tetris.InitPos();
( Q& E' V7 s" f S+ e return & tetris;1 w3 u9 ~/ j1 X
! p7 s3 i. P' L( E}- T4 e5 x J; o3 ?; Z- _
5 H m( ^+ i P: X" b9 j: o& U/ `2 \( t8 r
5 q* f7 z- W1 P' H/ O
Tetris* CreateFiveTetris()
- c! r5 a5 D3 X( [ z Y7 L" d6 [9 v
. K, L* ]6 D" G) I3 i{
8 G4 H+ k# H* [9 P ? static FiveTetris tetris;$ _+ q# c% m: _8 w! z# V
2 D9 m" @/ o* K( b" |4 c, g7 z' k
tetris.InitPos();
4 X" P0 _8 y5 @# Y) J4 w return & tetris;
! b! {4 @* n1 P9 ?) J N9 a' c6 r' f( K- r( A3 ]
}
^6 [6 r% B% M4 H$ G/ _2 k
' c3 g* ?' W( h; f& k; _* l" l7 _) c) `- Y4 Y( h$ N5 h
Tetris* CreateSixTetris()9 x" M$ P' u |4 K1 A7 \4 |3 V$ {: N
* x& G8 U9 [( @& _6 F! ]% g' ~4 o
{
" F8 s+ J& D# Y7 ^! F static SixTetris tetris;
7 {$ u6 B2 W# P% q4 z, E9 ^# @# ^$ g
& q% f% D% e1 W% u* Ktetris.InitPos();
0 H- R' P5 N, l. ^6 I' q return & tetris;
3 [( h2 A; _6 [8 y
* j/ h1 p: G# r& M% |0 O2 D}
) T: J' i2 }) Z1 X1 r
" X+ I3 p3 F* z* V) @+ ]8 ~. p7 A" S0 V8 y
3 X: I6 m4 K: _3 c/ y) g
/ F; M2 e# N; P% U) ]4 i+ FTetris* CreateSevenTetris()
+ F4 X8 j# {- P# _3 f" s/ K2 E r
{
5 |* J% X: ]6 j) ~. ] static SevenTetris tetris;
: N9 w# @7 `4 G7 k% ]" W. P
5 N1 n9 V) {2 k+ W: F$ N0 o: Wtetris.InitPos();
3 u) X' @- J( h3 F- u return & tetris;
( s! V8 k3 e% T7 w5 |& { l3 i. `) l7 f1 h7 g
}
6 N7 O6 x, G5 E! W& B! A# s 2 j# \% Q/ ?( M
private:
! L8 ~" X2 ^9 L# [ ) d+ J5 t0 _: z; h. w
typedef Tetris*(TetrisFactory::*PMA)();
3 ?. T9 x3 j4 h8 A3 t. \6 j) V* |. a9 V. v" q4 j( G
std::map<char,PMA> m_sel2TetrisMap;* V' Z* y4 v0 d7 H: W0 _
% `6 M7 }% Z' ~4 J- j
& d* _- n0 B) r, n" Q. E};
# }* y! [0 G7 Z, B. A* ? ( _- z7 l' f3 g" X
有兴趣的朋友可以下下来改改玩玩。
5 x6 P" Y' x* X- R 4 F+ j# B, R9 g) I- \% Z6 ^
That’s all!" ^0 y$ Y3 ]: S1 [! t9 }' ?
. ^& ]/ t% `4 q8 u: x% z, q
Peter 6 }1 O0 X' H2 R
5 _ O7 |$ `% }[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|