|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
# j& A9 @# `0 v9 z* O/ d4 Y图 1
6 C% E/ P& L8 h% q9 P完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:5 B: Y+ i7 q, K( l* t/ D8 t9 t
1 U8 V; {6 s" A! Y( X
$ c, E* L( `/ Q0 CFactory的code如下:
8 u1 m1 E" w! i* q9 M* M
F* K) R( q7 V) T' v& X/*************************************- I2 i, J7 S: R; Y5 e
1 D5 d$ O1 H8 f* author:hgf_starlovecpp@hotmail.com. n' P, {! }; A3 D$ g$ b
" f" A/ Z! L! V& a) k
* version:1.0
0 O; K, y2 A# L" }1 r* S
5 ]/ d* J8 b! @' R, d* description: just for fun; t A, |5 L8 i% P( ?- u
8 f# Y/ d4 K0 `: b8 P* todo: hard code exists need to fixed$ ^8 C9 X1 b z7 }$ L
1 A* f: x' ^3 N/ W
**************************************/
% H {# R8 h8 N0 @4 x i" M
9 {+ E% O2 H! C" W; ?#pragma once
}, B) m1 ?: s5 ~( R$ h% r5 S#include <map>
6 p: c# a) E' |; W A9 @3 B#include "Tetris.h"- X) E3 ~$ X: a% Q8 z" z0 ?9 R
#include "OneTetris.h"
+ D. m% k9 O" ]2 w* H, i* k! M& g, u' w# [#include "TwoTetris.h"
& T# |. P( p. b+ u/ S, }7 r#include "ThreeTetris.h"" l7 ?, k2 x* c% J0 e
#include "FourTetris.h"4 U6 a; o0 ]: F) G, x v2 A2 y
#include "FiveTetris.h"* Z8 B) v7 W+ B- d7 I) k
#include "SixTetris.h"
% H3 ?6 v0 b! f' |# c3 C6 `/ G- T#include "SevenTetris.h"
% K1 {3 @9 \' d4 h7 } , y) T& H4 f" r) y' \
class TetrisFactory5 z5 K; f$ g" o
{ x) {8 j$ }. P
public:! J8 S" h) d0 J. F) y' O3 i2 R
0 ~* V4 f3 Y4 o4 V
) X5 [+ p( W& b: qTetrisFactory(void). J+ A. t3 G0 T* h
) f: L% J* }0 t8 ?- t
{9 f3 o, @! G7 U
1 P( O1 J8 T" c2 \, h Lm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
9 g: X5 U' D; g, Y! R
9 `1 x O5 E1 }4 ]1 Lm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
5 m* G: O u O$ I7 r1 \9 s9 l# f, s- }$ W
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;& }& z, h# B: K% p
% q) t; t) ?/ a$ hm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;; |/ K% n5 V* a
+ @8 ~5 r# E% q0 a/ U$ |2 @m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
1 O: M( K% o7 [# P: H/ B4 t6 K/ O L3 t9 V/ v
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
% Y; X) y, d3 j; E% N$ l% ^" f+ X- s" x
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
: X# k1 \ U9 @' n# v
; i4 w9 |. @7 k+ z0 p}1 Z3 L* d. x& y+ o- y
public:
# T4 ~6 d" B! K+ B: ^
* d/ N0 ?1 y1 f E, B, h4 q2 }: `" a2 v1 m/ m, H. y: X
~TetrisFactory(void)8 L* _8 O% `2 G# m& m
, a2 S& f& _, W" A9 n' F{; Z* W# E* ?* k9 [
7 }( E+ Z1 v; ~' Q- ^! T$ b
}/ q2 J* q) k: A2 M5 ^
8 b+ L, v% C6 m( L
Tetris* CreateTetris(char sel)4 G& g% e" P! E; \2 w/ c
, z8 F$ k+ n: m7 m
{) P( l1 |. j1 H% n8 a
return (this->*(m_sel2TetrisMap.find(sel)->second))();. ~. U# c- d0 X4 S# d" {4 E
; ^: R4 m; x2 R; ~
}
7 _* Q! t; N' x( y0 gprivate:
) a) B G+ @9 m2 l7 U1 ~* g, x9 T
( M9 @5 r1 [. H& @2 A: \1 R( A
) v$ \ s* C! z5 L7 UTetris* CreateOneTetris()
% y3 a1 m. f) H# m6 l# l
6 d9 P% N5 u6 d4 x{: g- O! Q, J$ [# A5 d* |3 f, l
static OneTetris tetris;% w1 M/ T) R$ Z
. i: y0 Y8 O) {% R$ W5 M2 h; |6 V
tetris.InitPos();' D" D* C) `5 `. Q! M( C# e2 w
return & tetris;" A) J2 b( |9 B4 X* N9 @( {5 y
- ~0 h! s! @$ A9 j, Z* D7 \
}1 F% G' P7 R5 o- d0 b
8 K v/ X7 c3 P: h. G
, f! `' o( O& t
2 Q9 G1 b/ W" ?/ M C9 N. C: X( E
Tetris* CreateTwoTetris()
) R# R" ]- D; h ^; X
, r2 Z. J! j8 S) g& _9 d5 G/ a{/ z5 d4 b0 ~$ ]5 c
static TwoTetris tetris;
) a- {- k6 S& h: d8 W/ G- b1 x1 k$ V, |1 I6 B
tetris.InitPos();3 h/ J: x) K( h2 A
return & tetris;7 x& P& \& X2 T- }3 x* o- U, J
7 t8 K- C6 J% l; X}
4 P& i( q. U7 T4 R" M5 K q5 R% A' a6 G- j3 ^; r: g7 F
[/ \) ~5 ?$ k9 ^4 W4 D3 f% J
* n: N( ]( d" L0 K3 O( ]- v u8 U
Tetris* CreateThreeTetris()& [. c8 P+ R1 w; P% N6 K- v+ a& e
. W; k3 e6 k2 ~- D, v/ N7 I{; |" U* ~1 r" f# B5 @+ x
static ThreeTetris tetris;
5 c5 F% ]: S! c2 ?% ~" p$ p
% L6 T4 F' Z2 x$ r* V% Q7 Z7 ?tetris.InitPos();
3 X" R% |: W; v% I! R. x& L
@$ T9 }! s% F" Q& J$ I" B& L# L1 L7 J3 L, \9 ~; M- i. j
return & tetris;
2 W) G3 S/ S- `* ] ]" T/ Q
+ m9 K. \1 [5 P* X* U}9 D. r- X/ ~ l4 J6 O
r4 E' t8 u% q+ O9 ?. K
, a# s! T: H% G
" u1 y6 v$ Q% n' ] R5 x: H, @( W& kTetris* CreateFourTetris()! y5 Q# G% @7 ], m$ B' e L1 g, ?& P
6 s8 p6 \- X! O7 a( J+ x# f9 o{
* ]0 u/ d m3 W static FourTetris tetris;/ e- u+ S3 t# }+ p* M3 Y
6 g) j, s o9 c5 ~tetris.InitPos();; p2 ?7 _7 Z3 I1 _9 a4 w+ M* H
return & tetris;
4 [8 f) f2 A0 q4 Y, E3 N- C8 K
$ d% I: z- N, X: A0 d' t' C0 h, v}" R3 |7 V0 n5 }; w C3 l
. r6 U, m9 P9 q
0 g: g w [. e
; [2 X8 e/ e5 WTetris* CreateFiveTetris()
* ^, r1 S1 V# V$ Y9 K* s$ O7 O# }/ p0 Q
{
& t; b. @# X/ @ static FiveTetris tetris;
' B! A% e; r0 c
. O* a3 L/ p# r$ i( Utetris.InitPos();: b+ g9 f B1 e+ J2 ^
return & tetris;
3 Z! }. Z, Z" O5 m. B3 L4 x4 F5 a- y, X
}
1 S, ?* g" o4 d 4 D# ~; |7 z8 }) M3 {9 F1 z+ q
$ p- b8 v" S3 _
Tetris* CreateSixTetris()& R6 Q- Z- v7 K( X' R) s
; x" k; H2 q. ] L& K& J: }$ x5 ~{! @1 G/ d& O# `/ {# }& S
static SixTetris tetris;! W( u) B2 N3 l+ v
' H; X" D3 U7 i, `
tetris.InitPos();
6 a/ c3 m0 n- ~9 T& L7 j return & tetris;9 @! o$ J C" x6 \) K
+ ~+ `( ^ w# n1 K2 f+ }
}" ^2 V+ F) d$ h. e N9 _6 Y! p
" x! X/ G( K6 K. x6 ^6 M8 o8 x' K" H% j: ]
R/ k4 N* |' ~4 D2 Q, p8 Q; k
f+ N3 _2 c& z! p8 e
Tetris* CreateSevenTetris()- v' H1 `" \% d8 @9 z' J
! J4 i' c" [% q! Y: ]9 K( [
{
& U2 G5 A1 _8 N) Y a static SevenTetris tetris;
U- U0 z& M! U& h9 ^4 t0 d: r+ T- U& W/ s! u6 T, ?' ?+ Q3 M- u
tetris.InitPos();. P$ |& `6 \9 {& e) ]
return & tetris;; E7 S2 x" N. ^' \7 d
# D) j3 {0 x! d7 o/ i}
: ]' F( R2 d$ n i3 \# i; x1 P + M, B1 Z% Q$ X/ y
private:
! d; R9 B0 G! s4 Z" p
( J' i1 }8 {& q. E. e( V) u- U T; C typedef Tetris*(TetrisFactory::*PMA)();4 s; F: ~" H5 D" ^1 V. ^
4 q7 E8 O$ t" `. a
std::map<char,PMA> m_sel2TetrisMap;
0 V5 O( U4 p8 z# q
. d. p" A( R( }0 q$ P) z' M6 n2 U% c. D* H `2 r
};% }+ ~" Y2 m8 P
8 `: @7 j; V! O3 F6 Q: ]有兴趣的朋友可以下下来改改玩玩。
/ d; I/ Y. z5 G$ A" d: e
8 e! b" [) x7 }" i+ V6 Y) V2 v! BThat’s all!. v' [( @- `7 ^: R$ J
+ w9 |+ g. ^0 B/ B
Peter ; O$ j# p5 _0 k* b) {1 f
6 e- _( \: w; c. R" w0 n
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|