|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: 4 p- G" I# b; L0 r9 a @. J, Y( l
图 1
/ i& { R3 D* Z8 j: `完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:8 l, n, B8 G0 M0 U+ D
$ d# C2 l$ d1 P& l+ }$ e
9 p+ O5 Q2 g9 A& SFactory的code如下:
% j+ [" L+ ?' m s( D) H, [ * o# [. C4 ~- A: j
/*************************************
- K5 B* W" R+ u2 t+ h% q7 s6 {, E2 S
* author:hgf_starlovecpp@hotmail.com: q3 _2 B5 ^9 S
& b( i; ]( O. S5 d; F* version:1.0) ?) }4 L) X0 s& {0 V
- v$ S0 K& ^6 w; c" g) n% ^* description: just for fun; V$ e0 @/ T! e" s3 n- S- A9 z" o
+ U/ l+ N$ h% t9 R4 [- _2 H$ O
* todo: hard code exists need to fixed
( A+ D, e" X: L0 V8 `
& i4 e Y" ^# C1 s0 Y4 M8 i! H% L t**************************************/
, ], c* z* A( C7 Q, J/ I- C; M9 r+ I. e
# c) n2 {: b4 j# [" }& c6 G. z#pragma once
2 d1 V, V T) O# g) Z) I#include <map>
. d7 d/ F9 w& n% v$ m; {#include "Tetris.h"$ p7 t j# W, Z r4 r v, ^
#include "OneTetris.h"
/ o: _; x, H2 Z" u#include "TwoTetris.h"* w, i: `( R! b4 r S5 B# d
#include "ThreeTetris.h"; o s4 h" O2 r1 a F6 h2 g
#include "FourTetris.h"& P; |# G" K& C
#include "FiveTetris.h"& U% E m1 ~8 I+ I) e/ v
#include "SixTetris.h"
5 o' ~/ u: C' h/ o7 z#include "SevenTetris.h"9 G8 I- u/ F8 Q+ Y2 X
+ ]1 L% W! ]( l' t
class TetrisFactory3 j) |! x+ I0 _, ?. g
{
( @0 `) c4 v, A. k) r( Dpublic:* o/ O3 s! n8 v0 Y5 w
% a& d* U2 e6 `
* r0 z1 q' R, fTetrisFactory(void)
6 S+ s( Z$ B3 N0 H7 k( v' M* r- \1 i% d6 F% m; O5 T _! O- d
{+ e: N0 O- [1 I3 ]
- O$ x+ W+ }2 h. Vm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;6 J# u' n2 z$ f h. y E
7 O/ i% ?* U0 q9 u+ W7 M* ^5 Vm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;2 i/ n. m0 y( U( |: Z9 p5 @* |4 E
+ v8 U" L6 ^# k7 X" b0 qm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;8 I5 P+ { ?# [& Y( N. e0 V
( P2 _; ], N8 q& [5 K* m# |m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
6 _2 l( R) }+ o* r% @; V
" H7 B) h0 P! ym_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
* ]4 L8 g3 l4 R7 S, B( M" b7 x/ s: { H9 s( c9 Q0 y) }1 v5 a
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
* i" y; I* W- U; } t' D
2 U' P g. |' X7 F5 ~m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;/ J, y9 u6 H2 k
3 h) Y. i9 P1 H4 A}3 ~ J: O G% x7 N2 I. O2 L
public:
" n, x1 A1 e: H3 R5 Z
, p; s" W7 A n# o! N5 Q9 T. I5 O+ [1 @) H% V/ B' E0 O1 v
~TetrisFactory(void)' K/ m. ^6 }4 q, O$ ~' z$ L, j3 L8 u
' c I+ t: i% t2 |0 y9 H m
{
' K0 X( ?/ o6 L8 L( \
4 Q2 v1 J5 H" ]. D* l}( U7 S" F; n3 O( F( Q! D
7 c- t2 y' r+ }! B
Tetris* CreateTetris(char sel)" ?) D, @7 x* ]- H
" ~/ J5 Q' |5 L- K% a& T{8 T, n t% e; a8 `9 Z8 s0 K9 ]
return (this->*(m_sel2TetrisMap.find(sel)->second))();% z; [# N8 G* R% ?
! `! a' ?: P! `# {7 i4 @
}
- \" t2 H% j' D% O ~/ \. Xprivate:
6 W: P( F$ N0 b* a$ d, D4 G* ?! S
9 q! G. s- G$ \' X. d+ l: E; ` A1 b
Tetris* CreateOneTetris()
7 ]* ~2 F. \. u' h; Q) [# b
7 p, M! M' q; F$ d- r{0 v/ t, \( c- G8 k8 B
static OneTetris tetris;% K% v) V7 l- G0 A) a, k( {- r2 k
) p k- d0 F9 O0 ~; B2 E+ Ttetris.InitPos();
$ W3 P. D& t9 {& } return & tetris;' g. P9 w$ X; A, q$ C0 r& H4 w
. I1 @+ ]: t; Z( I8 o% C! r}
. F6 Q# _" R7 v' c2 M
/ v, M# S0 A) B/ H9 o+ ~% H9 X6 I! v3 x
3 q. z- K% V" [: W! l0 yTetris* CreateTwoTetris()7 G$ i$ P9 s3 u3 s' V8 U
% W0 `- `+ W+ v8 U ~5 O6 z
{' Z" m+ e$ L$ Q- K
static TwoTetris tetris;9 A" R4 ?, L- H+ u# X/ H' F
( [# q. w6 N, Y8 ?2 n- ttetris.InitPos();
% E. y' _, D( z- `3 E return & tetris;
5 } g0 t4 {4 s9 t* e7 @5 R0 Y( F8 N6 C9 P: K% F+ J
}
# o8 g# Y6 k2 l, Q3 i' K
- ]' [" p, q1 {
6 F) }! F) a1 {7 ^
! @* W* L% g) O3 F7 R7 v9 WTetris* CreateThreeTetris()
) d9 ?1 C* K! P; n. k q2 u$ _; [: E' {% T
{; J# j& a0 \* M
static ThreeTetris tetris;
. {8 q% a% C) m5 Z8 L
) m" g0 y$ G- P* I, Z3 mtetris.InitPos();- T' b$ H' R3 h: @
( o8 g& a: i) f0 F G' F. p( e# Y$ W+ |
return & tetris;' s9 ], r) e) A% s) l* g' {6 c
! u# q' w8 a$ s7 X+ j}
9 \ F* y0 e- A4 U$ X! m. V) ^: K6 o6 H$ \0 j4 M( z5 y
& p9 B( P5 ~3 ~) H5 P7 T
/ T5 p5 x$ Q1 ]Tetris* CreateFourTetris()$ P( B/ I% w" [9 l8 F. C! E
+ A" f: A3 X* {4 P7 g R$ `! |; h
{% W9 j$ x$ l5 L- e7 u! l
static FourTetris tetris;
5 ~+ j+ A8 C* B7 W' z `- H. @: a7 Q3 w1 B
tetris.InitPos();
/ H, m+ k/ S/ [2 Y5 W0 u return & tetris;- f+ _/ K# a# p8 k* S
2 C, A, e! M5 }2 l/ Z9 K/ X}- [9 j; U s% S
! e+ r ^1 _8 |9 D
5 ~& |$ a1 L+ X0 o5 N2 v* ]
2 W/ y4 c2 l+ \4 f3 x0 D/ s
Tetris* CreateFiveTetris()
- b5 z) s! G! M' Q# R: N
/ D6 F' R0 G0 j: I% \& I3 |{
$ S+ C! h/ j3 t. q1 ~3 r: `! c static FiveTetris tetris;
8 K4 ^8 ^: |- d! F/ t+ \4 `6 R Y0 [$ v# b
tetris.InitPos();2 K1 j) c& G9 r
return & tetris;/ | ?; {. u) l8 N
6 ^. k% u4 v! w8 l# T. S' _% X2 r}
) Q* ~: p6 ]4 r. m - m+ J0 q f+ v! Z2 F
3 o+ j' S6 i2 j# U ]9 [Tetris* CreateSixTetris()3 V1 H9 r( N |" x
* B, @9 W V: T- T
{
) w' \0 B( X" F static SixTetris tetris;
3 R# i5 v7 T* }" p, n9 c; J$ J0 _; p# d+ B3 z
tetris.InitPos();6 l. m2 | n+ x
return & tetris;
" ]. s' \4 q3 y0 r, ~: a+ P4 S+ B" g+ @7 l5 \
}2 t5 W4 i; c2 g' N) u4 A
- b9 ?* V( L% U( b1 V/ |
* M5 n) n K8 I4 s# [
- o" @" _8 Q- O2 V n7 A
K: |2 \3 G6 P1 d" h! B* Y( sTetris* CreateSevenTetris()
8 |! b Q# _) J G% z8 \* R7 x7 ~% m: B5 G. F2 [; z' B
{
* h- U) I) j9 ~* L static SevenTetris tetris;
% r" O; Y, n `. P5 d: ~$ o7 r }8 S3 _. U h
tetris.InitPos();4 Z! v' C1 y d. d
return & tetris;
, M. N' F3 `: c. h( g8 S% N- f0 S% w6 D$ H9 C
}! {; ^2 O9 E6 W; d x
$ G% @: L( W2 ?) Pprivate:, w ?( ~( p; ` i- k
: L% h4 @ k. M6 C1 S
typedef Tetris*(TetrisFactory::*PMA)();
9 E8 A" c. a4 r9 z6 N$ v4 ]2 r
0 F+ o }* O+ W3 W; c8 Bstd::map<char,PMA> m_sel2TetrisMap;9 |3 \! L" t6 _: Y; @' Z+ h/ h7 Q7 c7 J2 Z
; \7 a- u% b( C; H! n- t
% P8 w( h3 Y; B7 B};
- G. H4 J5 r! x# J. o) O$ R
; b% E' q& x3 p" D, i0 c/ F有兴趣的朋友可以下下来改改玩玩。, Z- t" T1 r& t
' V- @8 O6 B6 b8 S M z& aThat’s all!5 j; z7 J9 X6 ]* [% ~
. v. V3 Q8 q) v, Q( s5 G3 h8 J3 {
Peter
. \4 q- S4 L% \
0 a8 G% u) P3 I! w q' W7 `[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|