|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: : x7 v: Y* f+ g( H
图 1
2 x/ Q5 T5 ]3 R完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
! U& g p& m$ ?- X \8 R7 H0 Y
* F. q# h- `3 B( U0 v% Q; d4 }- o/ M
3 \, {) U" P# S/ b- u& h* @9 U3 ]Factory的code如下:/ ?/ r' ~+ v0 ?" I( l3 d
2 D0 H1 Z' h, ^/ ]3 V4 C
/*************************************
: E3 r4 ~2 M8 k2 i( I& `7 A
; P. T4 i& Q+ [) c: h* author:hgf_starlovecpp@hotmail.com
/ e, ]6 A' R0 Q* C
" ?4 g# |; a P2 z7 m7 b* version:1.0
, E7 j/ v. ~5 |& |
) g' w6 s' |8 U, a- o& ]1 {& ?* description: just for fun
) Q5 S$ _' }* T' v6 K
9 x( t& R5 h7 @( O F0 m) u: a* todo: hard code exists need to fixed' H' W7 [9 v6 T% O0 {5 H4 p( G* L
. a! p1 h. H+ K# k) z1 h! c
**************************************/
i( ~; [) S5 Q! d3 t6 f5 E5 a 0 _3 l, W" _" _& |1 \
#pragma once( A' t% Y0 E. V9 a7 a) |$ c
#include <map>0 A# |2 U8 S) [# U
#include "Tetris.h"
2 t$ V$ P; O3 d' U9 C3 ?% q#include "OneTetris.h"
6 F. b6 S+ P7 w9 n' }#include "TwoTetris.h" A: `3 v# V3 v7 ^( _" @2 K( g9 |: D! O
#include "ThreeTetris.h"+ }. r2 m) m* [/ f% Y* r! }
#include "FourTetris.h"" Y6 a+ [3 [+ `
#include "FiveTetris.h"
0 N& k# O2 W6 i/ x" @2 u1 z% r#include "SixTetris.h"& P( M. q9 C& _
#include "SevenTetris.h"
+ u& U; n* q. H( A4 z, z
) k+ t: b2 X0 [7 ~' {- W Bclass TetrisFactory
5 s- U6 ]6 Q* ^0 W5 Q{
, _- c" ]. o. l! a8 W5 jpublic:
! n+ G* \# e. s
/ n' a) Q' m+ W0 u/ ]+ @2 H f% t1 Y' i' [9 Y2 k
TetrisFactory(void); \( Y3 E- ^4 f! {. t9 _. X) ]
Y/ O0 s; K7 m }1 H$ q{
7 V$ X5 |# q9 [$ ]1 ^" a
" ^' x. T+ B, A2 _m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;2 _/ q+ W9 t ]* _
& r. L1 ]6 i, i: a8 w% Cm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
& X7 I+ V: p2 [3 O( s: N' ~
9 S2 m4 P( d1 J0 |2 Om_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;2 h: d# `& V( L! l6 I$ T- E
9 u' h1 S# V4 x6 {
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;& d/ z5 k. G, P4 O3 v p
& l7 H1 Y! _: M& `' `* [m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;/ |5 R( \6 |/ `: l
& S1 B9 K$ S, \ Z- wm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;0 ]# j8 c6 U& Q% ?* ?$ c8 v
1 b' U R9 d- Xm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;5 i' g9 c) {0 R8 ?7 G/ K
" z; h: T8 E7 A# J* t5 Y' V2 c
}
5 N5 N) O* Q' l: s. H) a7 P: Epublic:# ]% v8 s% t) ~2 ]8 N# e
5 b' X; H$ y1 T
9 b; O3 ~8 y( K5 U$ K~TetrisFactory(void)1 v3 I) D i9 p+ h0 \& V( H
/ d; B1 a1 j, x6 M2 ~{7 r. b! t, I9 w8 P3 l& j8 ~
7 s3 p- U, }: d+ G& ]: q6 e# Q! }}8 n0 @1 B4 L1 J% i. V
% l4 o6 w5 \1 o9 lTetris* CreateTetris(char sel)
8 _$ l9 A8 _9 z, z" D0 g V$ v3 s
( A0 N3 k" B3 ?( r+ d& L{
2 m8 c" y' f+ W- K( [# O return (this->*(m_sel2TetrisMap.find(sel)->second))();
M6 r7 K/ u; |4 H) E6 \% ?) j% l9 e0 v" i/ `* c, f" z
}
! M$ m/ M: ^( O0 uprivate:% J4 ]' j% O( E" @, Q
. y& O, Y; ~: [# a, E" z
! W* O. E* [2 V0 @/ w8 J
# o, l3 t) }4 W- \Tetris* CreateOneTetris()) l) G" X8 a8 o- I9 ^9 q5 M8 I1 [+ W! ^
/ J1 w2 e- F* `. g, c1 q' J
{' Q# l/ [% T2 X9 v1 O7 S# y
static OneTetris tetris;$ C9 O& o* X1 M
$ F5 V6 D6 M$ I* N# @2 p
tetris.InitPos();
2 W i1 G6 f. T return & tetris;! K" \, k2 X* e$ ], P
- R* y1 c$ s9 b" Z& u$ Q* J
}
B. L5 ~+ K0 ~/ v3 b @& O# t
. i6 a/ k! P; U$ u9 k& @
1 }; S' h W- l1 E- k2 ]; z6 v4 |0 b/ D& |
Tetris* CreateTwoTetris()
+ F* {1 `0 P& T+ b. D& R/ L
+ w8 }% E0 D" x' K! K{
4 }% z$ j! l8 \ static TwoTetris tetris;* g3 P2 _; _, O3 [0 c6 h
* t+ H( K6 M7 s3 d* vtetris.InitPos();
7 ] t2 |* y3 h8 o" G8 w return & tetris;
2 U$ Z2 X& ?! j& m& H
. z3 o' d# K4 A+ g, [8 c}
* m9 |2 j* p/ u+ S
7 T3 `4 R6 p! B, U+ h9 n+ p, q5 [) i7 U- M g
1 I6 X6 e0 }& |' A! y/ cTetris* CreateThreeTetris() E1 l7 }# Y0 m
& A! k- h; r8 N/ s Y{1 [ I! v8 H* Y3 w) h/ _
static ThreeTetris tetris;) f" E$ ?: `. s8 G+ F5 R
2 l% A7 @! I7 ^$ p/ H- l h
tetris.InitPos();
$ G5 ~2 Q) K; o; N6 b( N7 ]$ n0 }+ T
; A8 Q1 Z6 t, P' c- d9 k9 j* vreturn & tetris;
7 q1 d! ~' |# ?9 v; L3 X8 q( @/ V, ~3 N0 `- y+ ^
}% ?9 d: e5 w2 y3 [' H
; _9 F5 a; ^% q/ c( W( p
0 H' r& u& n, t% F
V; Z, ]8 J5 yTetris* CreateFourTetris()* x- x1 s/ t* p) r
% |0 w) v7 C' i9 e
{- u# }. R# y6 ?( n5 J D
static FourTetris tetris; J, n/ u* ]% D8 L7 F
' H1 g0 _+ w( U V7 x! rtetris.InitPos();
9 Q9 o5 n* b- e& `: F! {3 ? P4 P return & tetris;! b/ w2 C5 X2 H6 G! K/ T, a
5 R K& |7 N7 a) X- O; S L}
) O' t2 [/ G V- [
* r( m. z# P! D5 R j( d% F
9 _7 p+ t; p" L! ? q
' {& O" Y* R7 J' ]5 a4 @Tetris* CreateFiveTetris()( f$ H7 j5 Y! N5 v
& x( B- E( d9 k) C% z; V" L
{
: A! B. t* A; a9 [" d static FiveTetris tetris;- m/ r; r6 D* Z" e5 i, n
& W: [- B1 y( F$ c
tetris.InitPos();
% k5 D# B3 r; w9 ^: ^" M return & tetris;9 O4 f5 n* K1 B3 w
, V: c0 z3 C; D( i3 K' d
}$ Z$ ]7 J, j5 A" a$ s+ }( ~
9 z; Q: S Z) V$ K* p3 M$ u- L2 G3 S
: r {. ?+ }7 x' t5 X& a
Tetris* CreateSixTetris()
4 ]: E. a4 o6 K& v5 F) X: l; I3 z! ^
{9 j) A& z8 f( O/ X A
static SixTetris tetris;' C8 X: P$ s4 c7 C7 G* f
. Z$ ?$ @' p8 H1 |- ]& d9 jtetris.InitPos();/ D4 h8 w& E/ R$ E. z0 d. e
return & tetris;& B8 K4 s# C5 R
1 X" T2 p; c4 o4 a}
& S0 ?% B" W$ P* r" }, t9 p
% ]* ?" r, Y$ A5 x9 Y
3 Q4 _9 C% Z2 c. L) E
7 b: B- J0 u8 e3 ~% `0 V" M. {2 |: n4 O& ~
Tetris* CreateSevenTetris()
7 T- R) _; K/ s8 M/ I/ r
! K) _9 M2 K \3 R{$ l' [2 o# j) s: y! B
static SevenTetris tetris;# I9 Q. _ |% z+ E
. ^0 _5 _( C8 \4 v1 d; atetris.InitPos();
r5 e9 x3 y' s0 T return & tetris;+ }3 \& ^6 Y7 s% |4 f+ [
+ W1 G5 z2 p# r3 N: R}
2 P: p: l; t. H1 c
' |: O* S& x& y5 p& tprivate:
" t9 @1 c: M' b W
6 J% o+ h5 z& b! b$ F% ?6 r typedef Tetris*(TetrisFactory::*PMA)();+ Q! W0 S# q# Z }
0 u$ u- ^3 E+ J, w* z$ i" p8 q
std::map<char,PMA> m_sel2TetrisMap;+ s8 ?& H! m$ U) U4 I' U7 f
6 V7 S' u3 v: u" R# u1 u' P. s
2 O, D& o# F/ V+ B: e};
4 ]" t0 k5 L: U
, ]9 s! ?/ f. @" L/ f有兴趣的朋友可以下下来改改玩玩。/ P" v: t2 T0 w
* c. O5 Z; |& A. L$ u; x
That’s all! m5 \: a+ Y3 l) p/ s
5 P7 g7 T1 v2 s) v+ d7 A! k" O
Peter 3 }* }& j/ @' P; n$ \1 L7 L( |
3 @4 s( t. v3 z& N# i5 g" S4 V[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|