|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
) Q" r8 ~ W6 r/ G图 1
- i( B) K* ^+ @) U完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:7 L3 _1 r* i+ l1 _0 X
! s+ U, m& M. @6 m! K
# l; Q: l; N0 E3 N# c4 l6 AFactory的code如下:$ v" C* g! h3 Z- c# {+ |. F' x3 y
0 R. S" H. ^" @7 ?: s! Q6 C4 {+ H) m
/*************************************3 f s! f4 m) F; R3 |
8 k' n, @# P4 |2 Q' x* author:hgf_starlovecpp@hotmail.com5 z$ Q) [/ G4 n$ j; w5 g
8 }" b$ h4 n: x: `+ {/ a" u
* version:1.0
% x) k, T. d5 F3 B
1 n! q* D4 ~% T- n* description: just for fun
5 `0 p6 J( i C% [0 G! H
2 v; u# F4 X5 U/ C6 \* todo: hard code exists need to fixed
4 [. H. g8 F4 F3 q( m6 G1 `: _5 E) Y
$ d* _1 P# {; o+ E**************************************/
8 G0 h2 ? Z; r5 `9 Y; ? ' ^; ?* c9 \+ K- }
#pragma once
6 R/ s3 C* t. E; ]( \; Q; _#include <map>8 y4 S0 \( q! I" _& S( y
#include "Tetris.h"
( x8 X/ \; Q) [: z) u B#include "OneTetris.h"
- Q; N/ f3 V2 s3 r z#include "TwoTetris.h"2 `5 \- Z/ E- G& C6 a( P6 @
#include "ThreeTetris.h"
4 D7 C, o) d: `! S9 V. U# O#include "FourTetris.h"$ s) n/ X/ _& B; J: g
#include "FiveTetris.h"
( t+ }3 a( C7 r! E6 \- m#include "SixTetris.h"
9 ^! A) q3 t3 p#include "SevenTetris.h"5 t+ S& b+ V1 A* T4 K g6 K. k
1 S+ i; A' ?3 h- [
class TetrisFactory
% J$ L, {& n, |3 D6 X{' f6 S4 Y% x/ z+ {- Z: k
public:
1 j6 P$ O+ w6 m. E( }# b3 D 0 G% I* E- T4 q* l/ f2 V
5 p8 e) T& R1 g; H! l' x; T( w
TetrisFactory(void)
+ }, K, v# t, T0 ]7 [1 j8 U; B' M5 D1 R1 W8 v x
{% Y5 M3 K4 _$ \+ U1 L0 F) z
! d; M2 U6 f0 ?' @1 e" `
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
0 T( S( d, B- s! h |# i
$ U7 ?3 o4 n7 n k2 i% a; Lm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
+ @/ n- o, r) T2 i8 [# _
2 r( M: U b1 J: N7 O0 Cm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
5 y2 L9 l+ {: \' W5 `& |
/ M& B) l& i+ wm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
5 K& x8 z# |1 ~/ _% l3 [( U0 J k$ y0 v& V
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;" `5 S0 l+ H$ W# J
0 a d2 y/ g9 Y5 z0 A% o, ?2 V
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
7 e6 q9 c& g7 W+ l% F0 m1 T
% _9 S* p5 x: _1 w# ~m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
( o- _9 i% [0 i
0 [/ j5 i5 ]+ H+ S x}* ?1 X6 E; j/ b: Z2 K# a
public:
% C9 }. |0 Q/ d I f( L; @
( M# k1 `# b0 p/ o6 E$ _$ ]
( B6 `7 ^( k+ R9 q~TetrisFactory(void)
, ~& Z/ k" k0 e
3 h4 U9 u3 z7 p{, Z* v7 S ^- O5 ^' B3 r5 c0 @
9 V! ^& }; v. p; y8 D6 w' |}$ d0 p( O# @+ C3 w
$ r! l3 k0 E/ x7 i
Tetris* CreateTetris(char sel)5 p. j8 @* V: p0 c7 {
. l0 V; g3 b3 r$ R" v{
: [* J1 M* J9 v return (this->*(m_sel2TetrisMap.find(sel)->second))();7 e) |; Y) @) {( Q( Z- J
9 d- R4 z2 T. ?# U% V. _% [}
2 i, ~3 c, Q0 o& `" ?private:
/ b; }8 b( i/ |' S
8 F3 v1 Z/ y B1 D/ A5 t) @, c
; l# ^6 v# k* L5 N [+ Y) n) g/ ^0 S/ `. h: p! E
Tetris* CreateOneTetris()
1 y# E1 G2 ~4 [. h& E
) f' Z( `" y. k{
2 P3 v* \& W5 _3 ] static OneTetris tetris;' P/ m8 \2 v6 Y7 {1 h% k
3 n# B* {( Z- |5 C1 _8 Btetris.InitPos();9 I8 q7 s1 r. j, b* _1 z
return & tetris;
) X: \% N* w* f& L) R. }& z6 x* P
}$ x/ b0 a; L" ]+ c0 d5 n7 f6 K
' z3 A7 P! A* q+ n% i; {2 F. l
8 v. `* a& X7 ]4 ~% ^& N" z0 X/ X% K; B* |& e7 [3 _
Tetris* CreateTwoTetris()
( w* P( W3 {$ {( N! `! |7 M: h/ q B) r" o
{
. _6 ?) e& W$ ~! _, m static TwoTetris tetris;% ?0 F: m- q& C" k Y/ B; x
4 `$ ~9 F" `) q/ ~
tetris.InitPos();3 `& O- `9 G. _4 ~
return & tetris;. y8 [* @, a4 L1 ^ T
6 m* J+ K0 j2 m0 W I: Q+ O& A2 Y
}3 d! g" b9 ^5 w2 C8 ]0 O
& b. G5 B) x0 `5 l* Q
/ {" v! {) I0 p7 r4 }1 R3 [+ _+ ?0 y
Tetris* CreateThreeTetris()
f. Z- u) M* R9 }& n# C; f3 o o$ q( O% e" ~
{4 r* k8 B! X x1 l- I% R3 g
static ThreeTetris tetris;# e+ v$ h* D+ N' E% ?1 W; z. \
8 d3 {+ k$ m4 [) j7 Ltetris.InitPos();
4 a2 j8 I {" }( C3 L/ I: s5 q% `* }5 ~% t' m6 z! B" q! C
7 i" _; u' q5 Z8 ]+ F6 _+ ureturn & tetris;0 b/ ~2 ?3 l7 K0 ~# y) W$ G
! ?( B% n1 n4 h" R
}
. Y' K4 ]: ] d* P' R0 b+ A4 l! n1 \1 m3 | g
+ H- k7 j) ~2 h- d
; U: F+ T7 I0 i J, Q% H3 E
Tetris* CreateFourTetris()
; Q# R; y: N' E/ x( _; w
+ c4 x& S/ ^' t{
( z( `, |1 n4 ~7 j7 I, D7 H static FourTetris tetris;
1 L. u0 k& m" g# V- X8 ?8 P7 [: }
tetris.InitPos();
6 J U. [1 l: H# ]8 F w return & tetris;
1 l" x. g5 m1 K5 k6 l4 Y F; _7 v: W, z; |5 E& v6 Z9 L0 {6 ]$ p3 ?5 ]
}
9 V. V, G; [7 K b- U& F" E8 q7 d3 v& _
5 k) o: I$ H+ D
6 L' Z# T6 F | W
Tetris* CreateFiveTetris()0 c2 k8 K6 o9 b5 m
4 C! L* D) C \5 h; c, ?7 `( \{% B" F i1 O# l8 p4 I: e
static FiveTetris tetris;
" C$ C2 `7 u% k. Q9 f" j& f5 q2 x5 z" o2 s3 a" o
tetris.InitPos();) _+ J/ x# [$ C
return & tetris; K" d. X/ s# E* G7 K% `0 e6 u/ t
3 F! h# z. t1 n- |; v) C# J9 w! m
}
, D, e8 ?8 Q" E! O8 Q . o; b. K4 Q' }8 V$ h% x, _4 j) A
+ T# g# b( R( y! P8 P3 CTetris* CreateSixTetris()
) d# O! ?8 D u) ]% K5 @& w, D* }0 x5 @6 Q) h& @+ u/ z
{4 B9 ^7 R" u8 Z; U# b9 J
static SixTetris tetris;
. G0 h- ?4 p, X) v9 n" @1 r+ _$ J
5 p. P- v6 B* M# u7 stetris.InitPos();
0 U( z: w, A( r. R; r* m. t return & tetris;
5 [+ o) \- T6 c6 j3 f9 k4 d2 `" k" V W0 W
}' x, D+ u! ^6 `( ^
$ N* Q7 n, C. J. U! A$ m$ a3 x# `& Z
( \. z- z, w, _2 q" G) y2 C6 ^( S T0 Z) i! z: G5 Q% M0 i" a
: h+ g. L5 Z9 Y) O4 K t ZTetris* CreateSevenTetris()
$ Q& Z% a& Q+ a+ X+ W0 J# U: J$ k2 V* f: N" V3 q
{7 }5 Z4 w/ |5 x( q2 s; {, V
static SevenTetris tetris;
2 L- l* J- l, k: q1 h5 D0 W; L# s+ T7 S
tetris.InitPos();
* z1 d9 j4 y7 o6 | return & tetris;
0 ~' y+ N7 o0 M5 c2 K1 S6 j; l% e7 E( ~4 d- R4 x# a% K
}* S- V/ Z, Q# n ?9 m' @' a. k& F
5 a s; j* l5 m; K
private:! L3 h, }" H; M& D# x Q- L
: ?$ W% c9 k. u8 W2 T" Y! P
typedef Tetris*(TetrisFactory::*PMA)();
( j, X/ S9 e4 ?: N5 O
, e' ]& Q+ l! u0 g9 |* istd::map<char,PMA> m_sel2TetrisMap;
1 i8 F% w# ]% r" j0 ?' `" g# _* D F0 O/ G. |4 A
) B5 G$ I* n- j5 O; i$ D; S};5 }4 O# i8 j/ q: y |( R: G) [( ^
2 I: A) n/ @* c3 h K7 p7 C
有兴趣的朋友可以下下来改改玩玩。
2 b- W' r, {2 a" X# Y5 t
, N Z! N* C* }3 q+ H8 l/ O5 LThat’s all!
& o# Z% Q0 b; R" L8 ~+ ~
) P- u# x) M; N' |5 O* l/ u( n6 xPeter
, O; V1 f! J7 `8 J3 U% S, l7 G
. T8 N% o; H9 }, S/ k* X4 D2 f[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|