|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
, d8 h6 e' L' C/ O1 V2 r图 1# x4 l7 c4 \/ j' v ?
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:4 M: X# k; |/ |& b6 T: N
( r: ?8 M! l& h2 G, @9 q6 |$ x
Q" F/ t, D2 k. F: f1 E
Factory的code如下:- t* Y. d. A% P2 f" n. q
3 F5 [( ]8 U. u. V9 y
/*************************************
3 K* \. f' J' j3 s1 K2 n
* @6 n7 }6 T; h! J- Z$ Q+ _* author:hgf_starlovecpp@hotmail.com# Y! b: ~2 x4 t2 }3 v
9 Z$ m/ f9 K4 a/ e) K3 I
* version:1.0
; Y% W% `! J! y9 I* ^! K- T& a' ]& @1 [! k Z3 j
* description: just for fun
& v/ r2 e& b& S4 {* T4 A$ i0 N' f# F8 s$ Y! r% A5 u# P- L! b# n
* todo: hard code exists need to fixed
- Q' `5 `, s5 D! Z: x
# ]5 g( X) |6 {4 _! ~**************************************/
& l7 r& T. {$ }" I- z* K) E & d v* U0 I# h. ~
#pragma once
7 J% V% z) T) c' u+ d9 E#include <map>
" [! y: ?$ U8 x1 }7 ^$ P; v#include "Tetris.h"% e* y/ R+ J: H) F
#include "OneTetris.h"
. |7 a+ G7 F5 X8 Z#include "TwoTetris.h"
+ m& q( T( A( n#include "ThreeTetris.h"6 K' D' P: a8 [$ q% M' s
#include "FourTetris.h"1 ?2 D! o) C3 L0 n6 v9 g2 j$ d' B
#include "FiveTetris.h"1 n1 K/ X% a8 v% e
#include "SixTetris.h"% d& q! v [6 m. @, c0 L. S) i* p
#include "SevenTetris.h"* I/ M( ], S* ?6 n& X8 R5 ?
5 w, k0 _ ?* B- V2 }+ H4 o. g/ s0 P4 T# b
class TetrisFactory
- I: V3 h% p% t, X U{, }" ^ Y7 ^. l1 `
public:
5 G) J5 | e3 V! h; q
- e6 b! g1 u+ a* t: t1 X$ F/ A- M$ e' Y7 v$ s! E- Q# u; k
TetrisFactory(void)
9 r4 M5 H* X; _5 J Y
4 D/ P- j- S0 L$ U( P2 `{% f0 r. E! O H3 J
8 x3 s1 U K1 e+ j! \m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;0 F1 y2 E* y. U% @
. X( A2 Q0 y0 F* U. [1 c" N* Zm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
5 S8 c. T# Z2 ^7 d( h% T% l
: P$ y( E6 h2 w& ]" H. @1 T7 u) nm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
+ \9 X2 `4 H4 L0 v4 n5 T- N9 y h8 n1 E. h8 ]0 L
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
2 _: J+ \# f9 |6 o8 T& G% a/ u1 W( S# N2 z
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
7 |, \+ C( Y; j5 C0 O4 V# D0 S+ S. x
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
6 X1 s: Q) L* x8 W- f$ H/ B. U) M0 _8 h q) p
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;5 I+ a$ y# p$ g; h+ h3 z/ Z
9 H3 E9 ?+ n; e% p0 u$ [/ m}# Y) y9 `1 G/ X$ T0 i% B+ ]7 C
public:2 F3 H1 x) c0 e* |; ]. U
4 U) o1 k6 s7 r
" E6 N; L8 m, b f* v* Y$ F~TetrisFactory(void)7 d; A! C' V9 U; E, J5 a' W( }& s; q
& J. Y3 v& W1 ?. a4 D# x, y0 Y{
4 r" c. O, N7 M; v' |; C
V0 `. s! V0 C}; v2 x2 d' v7 e. O' t+ O
5 C, ]9 f) H, ~1 c/ H6 p( X
Tetris* CreateTetris(char sel)
1 X. A7 ?$ H) S5 ?- X6 U5 ]
5 [6 _) l# k+ @: f{. E' _" S' X0 J% R
return (this->*(m_sel2TetrisMap.find(sel)->second))();
* M7 \- l4 |) U5 _: ^- B; K" b4 _/ R3 t2 D: N4 W) g7 ~
}
# l7 o% T' }3 u3 y. D# P$ Oprivate:, ?0 e% x8 ^9 v3 |: H) n8 H
! W0 |' A8 @& R3 _
- b5 p; f/ t, u4 S. ?! H2 D
5 \3 O! u/ t9 j+ q0 w _Tetris* CreateOneTetris()! l9 ?% a# a: h% [) S7 v; k- b F
" }$ U- n# y$ r/ r4 C{: x u" R# N9 J* p" \" g
static OneTetris tetris;
& h0 m7 X+ O3 e0 p. V% Z8 @, s- e
* m% `9 m, ~6 x; t' p. Mtetris.InitPos();
3 u8 W% u# R/ G& {& q7 {. ]3 |# p return & tetris;4 p6 e; @4 }( b! {1 n* t* U& Z
5 o! C. I' k0 V: O
}
' a& i6 b) w. S+ }8 w, ~. X6 S$ z F8 [9 @
2 Q/ O* T+ F/ M- U1 k% f L1 }
, c/ b; k) O+ p* U% kTetris* CreateTwoTetris()9 Z+ W7 \! f2 w4 [" ?8 j
9 b2 a8 V0 P* h5 [0 |/ H4 Q3 o
{
& R0 q! ^0 X% ?' O6 X) B0 |+ E4 l static TwoTetris tetris;( g& e6 w4 o' L
$ Q; q' D! l& Q6 t, v1 x5 L% F( O
tetris.InitPos();
$ G; f, h0 m" `, Z return & tetris;
5 A4 c2 x' N0 ?2 s# ?; m/ Z5 \" \$ `# y
}% Z0 V5 j8 L: d
" z k2 Y) }' Y8 h6 n2 ^
6 _; ^' f9 C+ G! A$ o9 C& V% D0 S" |9 @
Tetris* CreateThreeTetris()
& F ~+ X5 U9 M. g7 g) \# B& \! m7 L4 ]7 S
{
$ ?2 q! }% t. G static ThreeTetris tetris;3 Y4 {: @: @$ B" N( z( G, ]' Z$ u# {
. Y) `- d. f7 Q, \% Z+ `( L
tetris.InitPos();
4 I1 f; l7 v& J4 r7 `& \8 ~9 w$ ~/ R2 l& Y5 L: i" H- \) z5 D
) K3 ~9 T! R5 {& ?$ k0 [* treturn & tetris;3 D& c4 }( Y5 C) w2 Y. X* W
# g5 W/ u# B/ x3 j9 F0 n( u; V}! K# g( b( ^7 T) Y6 D4 k1 A9 j! U
/ D; j: c3 D `# `* ?
, z1 {: l f$ _7 {" T- z
( f7 x& n, @ G$ JTetris* CreateFourTetris()! v# q7 q0 ?* ^! h1 _$ T- ^' x8 E
G. B3 u' D( }/ ^8 I8 N{
! s$ a4 I. ]% B6 J4 r static FourTetris tetris;8 g# f0 w# D, j7 L
. o5 G' o( Q: S
tetris.InitPos();
1 S+ S3 M% ^/ \) I/ U8 G E return & tetris;
) q0 K6 ?* d7 h; l$ ~
2 ^) q# w; U% U! ^3 n( A}; `- \& {- A) w: `
) W+ ?8 G% I% @
' t' y3 M! u( o7 {1 n! R! r3 N+ H- d
3 ~/ E# d, V2 p) f1 ?0 X ?Tetris* CreateFiveTetris()
8 @" F) ?8 B% A* O5 J
4 r d5 ?; q& f; V; K{
1 n+ f9 H; y% S3 R) d static FiveTetris tetris;
; c% |2 g- q, }; f' P0 B
7 M5 L: ?# J+ \3 E! b! O; Otetris.InitPos();
( Q7 X2 Z; w5 B& Z4 z return & tetris;3 D% q" l! u; H
' q! K8 ^0 A5 @' A' k}
1 ]. l9 p: ^! i8 G
{/ U% {. @; }* C
% R8 k4 J+ U, [2 q' S% |- aTetris* CreateSixTetris()
9 z$ t3 b G7 X6 Y; F/ o! e1 U) o
# y9 \! j3 {& N0 ^; j4 W, [{
) @5 z/ ]- q" R" [' I! t static SixTetris tetris;
8 C8 [! R: b% j$ q' q6 R
# ^, {8 V- l' ~/ U0 ]5 q1 ftetris.InitPos();
f+ ]. P& l5 z- s return & tetris;: [8 A7 k0 |* k+ ]. D& v! t
. D d+ M1 ~+ g) [! d5 F}
7 C& E: f. S; T' R/ g& M8 P9 ] & j. q( S, f& k3 ]5 h3 H8 A, I
/ K: j7 d, k6 z6 G0 V5 t
+ f2 W/ N. _: y
7 W; e+ I3 S9 G0 {& BTetris* CreateSevenTetris()
/ |1 o2 k/ f- ?. N' |) W9 h. `+ V4 P/ C6 G+ |/ B) I% d* }
{4 M) q/ O% l9 C( j/ i1 V
static SevenTetris tetris;- \+ @: I4 }8 E/ g ?
4 X; S* i8 K* |2 h& W
tetris.InitPos();9 F/ u, O' p. l) c2 W: K! ^0 G
return & tetris;% v' Q$ U2 [# r5 b( C% Q U
9 @8 l& K& ]7 g9 U( k h( {/ [}
' u/ n5 J/ Y; M% E4 _" M* S; E 8 U: m5 P I! G9 }0 c! P( Q d3 p; ~
private:
# n( @! s5 A; M
! l" S2 h: Q& v: c& ^ typedef Tetris*(TetrisFactory::*PMA)();( B9 {& s O; z2 [) f1 d" r
4 k3 G0 b% K4 J8 W3 K" R& \
std::map<char,PMA> m_sel2TetrisMap;6 }) H1 I( f/ c: Y. ~
2 D! q' F2 X% G9 e: P3 B. S) Y
# _# V5 \- p' H$ K3 R
};! Q. M# M0 G9 ~; L3 m. i; h. S
' a) I/ t) A7 }3 H有兴趣的朋友可以下下来改改玩玩。* Z1 }; a2 I: {/ J( Z9 U. t8 D, G
- K [$ o' K2 c3 D+ a+ {" L* w q
That’s all!& e. d9 v }* C& \$ E" f
7 \' w! ?3 x5 b) ?- A
Peter
. N) ]& N9 V2 h3 g) m& M' D
( _# P, b" Z9 o7 Y# Z[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|