|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: / }3 K9 D- V O
图 1; Z% f% K( z$ s* Z& I
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
$ C; n: u! @1 A3 T- d# J" H u0 z& H, A1 s
# }' u/ h/ m! r5 |
Factory的code如下:/ E2 C) L0 W7 K* \0 a
" Y, u1 R9 ]% a8 n/*************************************
6 z! F9 J8 e- U4 v5 ^
( c) J* o w8 ?7 A# }* author:hgf_starlovecpp@hotmail.com9 P# `2 n- N) J! ]
, A1 ]; S2 A d; ?+ X: X. C [9 C6 z* version:1.0( x+ E( w7 y* v- p2 c1 ]3 [; t0 g2 b
2 D; V: e2 l0 D2 U
* description: just for fun# [* q4 f' \+ j; S1 L# L* P. ~
( H) Q `, k: w+ j5 H: H
* todo: hard code exists need to fixed
, {$ {% S( I/ j2 g$ c4 E/ S) u# W6 Y% r, a+ \0 j1 q0 n
**************************************/
5 R$ p6 ?6 B1 L! A' ]. e* [ 2 `' S) g5 U+ d) S+ r% C
#pragma once
3 J6 T( t$ \: [9 [( C#include <map>& P- n$ A: V2 i' z1 ^' T
#include "Tetris.h"0 Q' Q7 J1 |& m/ K9 A
#include "OneTetris.h"+ R/ p7 b7 o% V7 ^0 u& w
#include "TwoTetris.h"3 w' P l% I; V' Y4 f/ }/ j0 A6 H
#include "ThreeTetris.h"* ] u; i; W' R- I
#include "FourTetris.h"6 G4 T/ a, U' {# M* t6 [% G/ k
#include "FiveTetris.h"0 }! _( P$ r& g' J C1 D2 i8 R
#include "SixTetris.h"
3 a0 L% w7 m$ B3 @- {#include "SevenTetris.h"
, T4 `/ K. r$ t+ O# H5 t" d ) I5 b7 j% b- r4 t8 Y- e; \& c
class TetrisFactory
4 s* ^/ ` d* l, m{
9 r+ v) l" F5 ?) l, Zpublic:
a# |* I! d2 m$ d! s4 Z + v; |4 S. l& x8 g, Q, d7 W
" z4 a! M; o! N7 [1 C
TetrisFactory(void)
0 {4 C: ]6 t4 T/ M/ h1 Z2 @, K- ]! R3 ` o5 C! D
{9 O: j" E, z6 j9 c5 C
4 n! U) N; {& e1 _; v. n
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
/ ?( n z1 l; P& [( z1 ?$ S/ n
0 N" u( I- N- f6 H0 hm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;/ j7 E+ G4 {" E- S* h
! R+ G+ w7 i, g$ h. W0 @
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
/ ^1 W' k9 H9 H) ^. {1 f& q4 E+ D0 r# u& V5 G; M
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;& _) U1 a1 P( m9 l! F3 w
1 n' ?9 V. s" [- M+ O) ~+ D
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;1 N0 B2 b8 p1 E0 Z* ?2 `0 h
' X- G ^& Q' e- m& J, B2 t4 qm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
9 F+ V9 b, d8 U" o% d/ z3 _1 i
" h! m% q* Y- Q! c* X# ~m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;/ G) Z- E3 Y/ `% _
. t- |0 t( u$ d* M/ X
}- m- ^8 l' L! ?1 z9 A( U4 d7 M
public:4 R% ^3 `% Q( k& B, E: k) m1 @
1 X: ~4 W2 ]+ u; o
) b2 l- G; G5 c1 `~TetrisFactory(void)
/ c j7 c9 Q; d- X1 s$ e: H. t' L4 Q8 D0 l
{5 Z; Y" ?4 w% a2 y4 @1 N
. F8 K! e7 a* S}2 p8 F4 e' O# L+ k& t- W! `
& a( l7 A! C# U o, `6 fTetris* CreateTetris(char sel)
/ c, b# B0 S F1 t- t" E8 q
# j/ [; s2 e! N" W{2 |8 H! H# m. X: W
return (this->*(m_sel2TetrisMap.find(sel)->second))();, T' {$ U+ a: N3 @
! R8 T6 W7 V) N
}
5 i; D+ B0 I( k$ u. Z) h9 Tprivate:2 z; ^2 P P/ D4 e
/ P+ _$ s7 l% Z7 B. u# L c
/ V5 K ~0 S4 t3 y3 o0 z! v6 f7 ^; V9 y) s, m1 T7 }5 }2 d
Tetris* CreateOneTetris()' V8 g7 Y% @+ M0 _
1 y5 \1 [! b& C{( Z( z' I3 J. Y. u8 D! W7 T
static OneTetris tetris;8 Y* J q% Y# |7 E3 m6 n
* B- H3 ?" k6 ~* P: h6 h
tetris.InitPos();) i8 ?0 V5 ~3 F& v
return & tetris;
) Y$ e: I9 c9 M( u9 {/ C
3 H8 z7 o5 d7 T9 Y/ C* f}- c" K2 \9 G8 G4 ~/ d
' {5 ?0 _* d4 H& d" Q) Q* y
6 v# f q& v& _0 z
% M& B4 }$ t8 U1 X& r3 BTetris* CreateTwoTetris()2 V6 ^( i: E5 t8 m
7 u) N! [' M( d/ Y/ z( w7 X. _$ k
{( `7 O4 \0 ]" O
static TwoTetris tetris;
; f" z9 W2 a3 Q. ^ P& x- b; l& L5 ^. c( c; N
tetris.InitPos();
Y5 _$ z% n/ Q" Z- G6 ^) u return & tetris;
- D, p2 A; c" x: Y, b: M
. ~ e6 [7 F7 w% w- g) m}3 C O; }8 {) {
) `1 P3 A. n! z) X8 v
1 p4 N' Y% I7 O2 j! v0 D
7 ]1 Y* n, t( \% A( G x( W
Tetris* CreateThreeTetris()
' A' i1 y& \) {0 u# b) u
9 \+ |% R9 ~2 c* ], A/ @{
. R* X }! u. D' S: E6 Q: [ static ThreeTetris tetris;
+ G( u* \/ R0 z E
: G) z' I. G* a2 w& f0 Z3 V; F/ Ctetris.InitPos();
& z: I9 l W! N2 F3 l( ?2 ]9 w; Z8 z- r" Y
8 C! J7 S0 G" g2 h5 q& R2 R- ]
return & tetris;8 ~' h+ q4 N7 c! p) o) J/ z4 X
3 {" e1 M' L! ?' i. |}
, X; W# Z2 }9 I w8 I. N
$ E% T Y5 {+ F" a; k& k6 s. W/ i/ A0 V7 _6 S' R2 ~
0 k( {' o8 C/ n: P- b* xTetris* CreateFourTetris(). u0 r( b' T |) J Z8 V3 m9 t1 K
8 q/ y& J5 r6 W# ~
{
% H. b4 I' D. l S- ^) U static FourTetris tetris;
& u6 \: q0 e+ P- F" l8 X& g$ i" N6 \
tetris.InitPos();! o# c) |" X5 E* s
return & tetris;7 `; `0 H9 [' Z" a5 n; `. }6 Q
& o) ?1 o- n& s* K% e}7 ^( ~" s1 l; ^- Y6 t
9 L6 e: x E: W) @
8 V: H; Y0 a, R
+ s; @: Y, D$ w+ D5 D
Tetris* CreateFiveTetris()
' @ q4 O/ Y* h( g: H, ]' t* w
{$ E0 Y, g1 ]; s
static FiveTetris tetris;5 i0 f! _: A, L
8 V- {8 o" _5 J4 s' b% ~
tetris.InitPos();( u8 q9 z) N5 p9 ]( Y
return & tetris;( r) h3 g \/ ^
" Z% Z# D) C; L8 \ q- [! f* m# c}
. K, i6 N) h# a$ W O! w( f& A- I* Y
! f7 Y- N+ N) QTetris* CreateSixTetris()
. O! E& X% d& c% R
2 n) p1 |+ C/ w M% ?. ^0 ?8 w{
: @8 |$ u) N- s static SixTetris tetris;
: ~+ \6 C+ M8 G: ^& |) t6 o( q& k) k
tetris.InitPos();5 d. d7 }8 L7 Z1 C! r4 E1 _" w
return & tetris;, T' D+ R3 Y5 s8 r: d
+ \; e; O; w- S* e: R0 U}
6 n( p: s# ?- c! |8 F( T) L
# U1 _: g9 S% n8 g+ H" T
! u* l- J0 _1 D6 E7 i# ]0 v: q4 h/ M9 p
3 N& P' G# g- Y. h" WTetris* CreateSevenTetris()
) q- ]9 u y+ i
5 ~$ v- B) r2 H8 D t{/ I" V! H: ?* e" _
static SevenTetris tetris;
4 O. L' `( E3 [
' X8 X; M+ g3 |2 ~' M9 [6 jtetris.InitPos();% \9 s$ c! ?+ Z6 B/ w f2 j! @
return & tetris;
( h, s: @$ _+ x/ Z
/ o2 T0 b5 T4 m- g {. K ?, S}+ Z+ ~* g& S% Y) X
; z* y j' H- r& {( e q# C/ y
private:, q. v) }( h& h) `6 l. X
Z w+ c7 h. A typedef Tetris*(TetrisFactory::*PMA)();
1 p; \* K/ d k6 _ J3 T
. o# J! P& K6 ~! h* [std::map<char,PMA> m_sel2TetrisMap;: B9 F+ J7 E5 ~. Z
- }; C& {! t$ F
* Z. b6 y* X7 E# X2 N. \
};
8 o( l, b1 j1 b
* _2 P" e" J+ T# w# o; v- j$ I+ L有兴趣的朋友可以下下来改改玩玩。
% C( S8 X" T# r2 x/ [- n5 k1 L4 C
7 F) K* [0 r1 B# d, ]0 a! vThat’s all!3 w- r1 c/ ]3 W# @
. L; }# W5 A4 @Peter
$ W% O6 G, J7 P; F" ?$ S; ^2 l" k) z8 W; T! q w
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|