|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
+ Y7 K3 ]( g# G: |图 1
* P+ ?( J0 Y e& ?完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
3 o1 I/ X; \8 D/ f( G" h) j! j+ G9 O$ [) j7 C2 w5 s7 y
9 r- n; o4 T- } E2 ]9 ?1 t6 d3 J0 DFactory的code如下:2 S0 O+ c4 I2 Z: W) f' C) f: ~. F+ s
: H$ X# v/ e0 X5 L6 t2 ?- [2 q8 U/*************************************- t* m6 [! Y, ~* o# v3 \
9 w( V- a1 i B. Z5 y6 z
* author:hgf_starlovecpp@hotmail.com
4 |9 H) M% @9 L3 ?0 G! u* d2 l+ J0 P7 ?" T8 A6 i& i
* version:1.0" K8 O+ H0 Q4 M* d4 x
$ z3 A0 U3 \3 |$ @' \
* description: just for fun- K. r; |* k4 K8 H8 u
3 p2 L4 I {0 E
* todo: hard code exists need to fixed) ?# }0 M$ ]2 K+ ]3 ^
7 j {" P: h$ k7 ?, l**************************************/3 T; D- B. |( O+ f- B8 A# u0 J
, n) e, A/ X2 F9 \
#pragma once
: b1 Y* q" L$ k- {0 l#include <map>
Y" V4 n; Z; ~#include "Tetris.h"
) `8 C3 s8 O7 S* H, M3 ? F#include "OneTetris.h"9 R3 D7 v$ E* @7 C/ N* u: z
#include "TwoTetris.h"4 I. k7 ?) i5 t/ \4 r& V
#include "ThreeTetris.h"
y3 C8 |) c/ K6 ^#include "FourTetris.h"" y9 c$ L' ^; s' H8 I+ { F
#include "FiveTetris.h"
4 P1 x$ ]2 r% _% N#include "SixTetris.h"
4 |+ u, S* t# C) f#include "SevenTetris.h"% ^0 w5 ^' s) B
0 U/ y9 u2 u* f- @
class TetrisFactory! l* c7 v/ g- R9 U4 ^( ?: ]
{
) L5 k" R+ x9 hpublic:( ^0 z# G) G! j' P6 ^
% d9 z9 o! ?" [: M/ Z& n4 y! ~5 }* d: T9 i, k" X3 F! P+ f
TetrisFactory(void)% ]* O; }6 [. o& Q% T# M) B* f. E
) k. h5 M4 ]! \5 _
{
0 i/ O9 A0 l3 L+ v0 k( b( C5 g) w; U0 w
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;3 \/ v! k5 ]% n
5 ?% _3 B; }* i J$ d7 r- s# L) a
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;$ p' c# t1 ~5 ~0 d) {+ K; r
. f/ _5 z7 O% |( K/ o$ o4 n1 Pm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
]3 h. Q4 a# f p8 J* w7 V/ W, Q" c2 @6 b% ]5 c
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
+ Y$ C6 v% V- l- N, t* I( I- M; {4 D: K2 E* l3 |. \
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
, X% o. t, O D) n5 H
( d' |$ W- }0 Y4 k7 m5 L6 V5 k; um_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;, B X- A9 [: C" g2 m! Z
/ j N4 D. J$ b8 q+ k7 L$ P8 E
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
, C! c- A% H& r; o' H: S: J2 [' {3 t2 c- {3 ^
}
8 {- Q/ Q. g& Y. p- \( k o: Vpublic:7 w. K% [+ C( I0 `- Y& y
q# h# l& h1 j) g8 A: O
+ ~0 }7 }5 t" j9 c. |4 o+ E# e6 o
~TetrisFactory(void)
- W2 l+ c& o p+ m+ X6 |/ s' M% a, x. a! {1 w. K
{* V- u3 z/ ]# }+ r
3 {( c( A8 @9 P# q' S5 {
}2 g, m) S/ p5 O# y$ S3 {
Y8 v; z6 ~) A% C' x1 E& oTetris* CreateTetris(char sel)! z* T7 I" o* M7 A1 F5 F" X) l
0 O) p U2 D! Y. M% o) d{
. {* _, @2 {6 F/ C3 t return (this->*(m_sel2TetrisMap.find(sel)->second))();& k+ d% E0 A( T( x5 u1 d4 u
1 F/ |6 x: ^- v' |* T" |
}; h& f: V. q; ^
private:& ]( f0 h+ O- N, R1 s: Y: B
) ^$ Q4 D: S4 j |/ s t/ B2 U
$ s6 ~, I/ q0 N0 ]) D. w
" K: h _1 t& r2 d5 u, xTetris* CreateOneTetris()& \: K" X# ?5 t3 U* @+ x+ U
" O! X6 U; }4 }+ T6 S
{
B' c5 l8 {" Q, r+ s- c# w S static OneTetris tetris;+ U: G$ e1 N( ^1 T! M
: ?0 |9 r8 R9 B" b! r$ p; W. Gtetris.InitPos();
' e0 }1 P. ?3 P return & tetris;
& \$ B) G% L9 L; _0 x# C% o
7 U8 y0 d; W3 ~/ f' j! n}1 u8 i- R7 O/ r4 w, f- b& B" ?
# ~! P8 B) r: C1 s% N4 _, \2 n* q$ L: |; T% f
8 o% h# z1 @% t+ T. U) T$ WTetris* CreateTwoTetris()) I0 ^" y0 @1 n2 s* {6 }( J2 p0 Z
# w* z: r) z O& Z* g
{$ |8 t8 g- ?' G! A
static TwoTetris tetris;
5 \: `) M; d& f3 \6 c7 B% M, p
tetris.InitPos();
( Y& x k0 i# u* @ return & tetris;
6 }2 g5 A" K+ ?" F
, ~+ _6 f* z5 x5 E* m}% k+ } c+ x, n& V
; a2 n% d5 P: K' d8 L" A) t
& S1 `! q% n9 q9 ^4 S! u
" f$ R$ d( r3 LTetris* CreateThreeTetris()
: Z1 ]4 C( r+ l" O" X
5 U9 H. @0 n V* h{
% |# g) o! B! p0 W static ThreeTetris tetris;* i/ V# d" O$ j7 D, C
% H: S# F" H+ p0 @/ n" e
tetris.InitPos();7 l6 T1 u0 t8 n' W! c* G4 Q$ a
' p3 ?" ]& c) r7 s) y" V5 F& h; @. ]0 |8 b7 U2 P8 r
return & tetris;: R6 P$ W T9 r0 d" R
# L) [4 D' [: P' ?) `$ E! _}: i' C# l( A$ U& x
" v- Z: S! P9 l6 [9 d5 R
8 ~9 y+ p& b8 ?* |, i7 D' ^& T9 _) P# {8 L( H) r
Tetris* CreateFourTetris()9 N6 i+ x( S5 m6 j( _- w. s6 ~
: S9 r9 V1 v' s# u; \& Q5 P
{; q5 K$ J S3 Q0 n% Z% j' ?' A. `) T
static FourTetris tetris;
1 f7 ~' y l# ?; r+ _, ?$ o! k. i, Y: g, t+ l& |5 I P3 C
tetris.InitPos();
: Z7 a S/ u6 y: j return & tetris;" s% f2 K/ V$ _7 f+ m j. z
& y% Y, b9 [* D1 @) k
}! x* z! x' J: z& y: J
, {& m* b, [9 r2 L9 }2 q( U
8 @8 Y) \+ f' N/ |. B
4 y J1 ~) i9 O5 }4 s
Tetris* CreateFiveTetris()( N* f# w, h# m! @
; v& ~5 X& Q+ x, A
{4 ~, H# |7 ]# N6 D6 N$ c1 w
static FiveTetris tetris;% N1 e) S# }) }7 K. C5 X6 a
" s( j0 U. u% i9 q1 Q& ^5 b. Z
tetris.InitPos();+ @) s' h5 G& U* Q2 L& S5 `) w- x
return & tetris;- H) l& N4 A L3 Q7 F+ ~
$ k6 ?! ?# w# S3 _4 @7 [9 l( g1 s}0 M: v1 r3 ?: E5 J: n3 u& |
- b0 ^% ?) k o9 W/ u# S# b' ?' g) {
4 T, [& u4 }$ j k1 T0 H. TTetris* CreateSixTetris()
! M# W! U5 ?8 \) E
& A+ P* Z w3 B{/ X& S. z7 y2 [+ L1 G
static SixTetris tetris;
6 A2 w: \1 `3 W8 [* ]( w8 x8 n% F2 U% d3 v
tetris.InitPos();
: ]) x# b8 D. E) U. }7 H, j return & tetris;. K8 F. t; _3 L+ m. B/ h& S5 j
1 I7 m8 e( z) `' g! i1 T y}
$ y: ?# R5 ^9 R; b: N4 ?" t
! Z! A- o" D9 r: V- w& n+ o
' [0 f! H( h+ c4 u4 b3 l E5 N
0 b+ O- f, ?; U: H1 q3 @$ i+ _6 ?" d2 q- f
Tetris* CreateSevenTetris()
5 @+ I$ x) p* l9 T4 `+ T. H8 p0 X0 Y# w5 N) H+ W8 L
{; J3 ~; O7 s1 P! H1 s" h+ l( s" I
static SevenTetris tetris;
2 Q0 B8 }1 _: I( Y7 N# N0 g# n5 y, c; U1 G6 V4 y
tetris.InitPos();2 @& h) ?# z& p3 Y0 @5 N, E+ }4 O
return & tetris;! }5 F4 `1 X+ u2 F
; o" y2 i4 \9 w, C( A3 q* X
}8 M' M6 ?4 L% x' _, W
; P1 r" ]% Z/ v2 \2 P
private:
, ~7 I G5 B9 K, ` ' C& E2 {, ], ]: I1 n! z% ?
typedef Tetris*(TetrisFactory::*PMA)();
: B3 X# H/ u5 t: l2 c. f
7 p3 E; v* Q& Q5 ?& Mstd::map<char,PMA> m_sel2TetrisMap;
# F* T9 [2 S6 p* i# R; e) x
0 i2 X" @: r6 {9 y1 A O
* y! [4 i: m. x1 p: h};
6 p: o( G# [# q/ B- ~( X
2 ~ R/ ^* |! U5 w" H9 B有兴趣的朋友可以下下来改改玩玩。
' C7 p& L: {- U: _+ x/ a# ^; y + s) s( L6 V! k7 p) D0 c
That’s all!
* J- M7 N0 {5 ^0 M& r& a
9 c& B; @; H9 M1 G0 [0 o( [& OPeter 1 q/ {* L3 B& I T) Z) o5 p
z3 V6 E6 Z1 g% o! ?
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|