|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: , S# @* J& N3 d# f# B! o
图 1
8 [ X$ Q/ ^9 n' V完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
|1 ^% T" Y% h
* f7 F: E9 W9 z1 w& k
3 y: g% x4 U+ s# \* XFactory的code如下:
/ F' J9 h: J) V+ c 9 `0 h) P5 W; u9 l3 M
/*************************************
) @" \& c5 \0 P* {, X; t4 h; G) h* k" F2 B6 m1 B2 T
* author:hgf_starlovecpp@hotmail.com' s9 C% {; _, A* t( c
5 Z( f. G P" Z! s0 P% Y
* version:1.0
& c( r$ ]# c: n5 z+ t' n( o( }5 H) f _; C# T0 [6 I
* description: just for fun: w8 u% b, o* z& v
4 l) V3 z# @& T! s' p
* todo: hard code exists need to fixed- U" f$ \& c( i/ c+ r3 m: `* T& J
4 e1 X# B" M5 V4 L
**************************************/
# s4 ]& f/ r9 v: _+ C9 c/ ~. h6 E4 B1 j . p4 t( B( ~. |
#pragma once4 [2 v n1 Z8 r3 U- x; R D4 U& a G
#include <map>
: Q3 o0 A3 @- r! j: b' p6 I3 X/ l#include "Tetris.h"; U: V( [- c/ I* x. m" o
#include "OneTetris.h"' ] C, M( i5 N- s- H8 T9 a* E+ o- k
#include "TwoTetris.h"
: c* _: u: `, |) q#include "ThreeTetris.h"
8 c% U- }- i( A# u: m* c2 S4 I#include "FourTetris.h"' m/ z( w* P6 x
#include "FiveTetris.h"' K( }; e) o: z. n# z3 a( Z$ |' w
#include "SixTetris.h"/ p O2 c; q& M" w
#include "SevenTetris.h"
( o# v2 _* F% u4 t 2 x4 V" E( e! Q( }
class TetrisFactory
) o5 X c2 q5 X9 a{
6 K+ {& D; j, ?$ E( rpublic:
4 \6 s2 C6 V' s# l" n ( v+ @$ H! G% l0 ?# f6 A
2 Y' X2 W \& a3 G, W x
TetrisFactory(void)4 X, h3 z) h. O1 T
8 ?. j3 ~( g8 U2 P9 \" X) u{0 ?( v# j5 N+ J
# X1 n; j8 J, r7 |m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;2 Z- N7 C! S5 {4 V/ E- a
S+ d1 |3 s+ Z/ j( m$ L3 x3 Jm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
, q8 D4 }% [9 t. V0 M9 f# f! }; ^ s1 g; m, A6 [- m X" v, S' w
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;! J7 G: j: ]2 K" n, t
/ n W. P2 N g: y* tm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;. y0 P, c2 U" P8 b& X1 k. s! `
) f4 ]1 T# R T9 L" k u
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;9 D- C# q: `( v% |
; U* v, K D6 F3 E$ ~ M) @; n. C
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
/ h) O2 N' r! |6 w- G! l0 z% _5 O
. g- G: _: k* x# L1 n9 E' wm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
$ n+ z+ p9 B0 L. z) O# y: v. F% ]& Y6 _% Z! H& j+ ?
}7 E3 `) _' K2 i) x6 f
public:! {- F# ~) O9 Y
1 V( @9 `9 E# ]
7 `. R1 Y; M5 U~TetrisFactory(void)( q5 v1 y# R0 K" \
8 K. p1 ?& Z" |/ l6 Z! e# P; O0 @% Y% e{2 g8 N0 N) b1 e! J" }+ ?" g
" ~& C4 a, O3 a- ?; t; ]}
5 u+ N) F2 s* a5 c* k, e
. P# E4 v8 M% b" Z9 S. jTetris* CreateTetris(char sel)
) y9 o7 i9 t* n) F" _; B/ x% M
/ N c+ @ C0 s- x7 F; ~; E{
8 {# s/ T$ I) X7 {! e3 k9 ? return (this->*(m_sel2TetrisMap.find(sel)->second))();
( b" I: p3 v2 B, U, ~$ b) n9 L" R9 S4 s$ I
}% v, n, l+ L; K4 D
private:+ ^/ Y! |0 a/ H& r
7 b/ Q7 Q1 @+ ]% z S" a7 u$ I4 L* V! L5 R" v1 I* u
) \, b( b Z* G- T8 b- o ^+ c# N
Tetris* CreateOneTetris()# ~. P' Y: O) S* H
; B) I" S7 m: g{
$ y0 B" a# [! C7 X% b, P5 W9 Y. b static OneTetris tetris;
) S O8 }1 v" J9 w; i4 f1 ^; p, f4 e5 s# h* N! R/ }( R% T
tetris.InitPos();% V. q: z `9 y0 W
return & tetris;! r: S& ?: I# }) b8 v+ S
/ d1 D+ C w; t
}
/ P3 U( r7 _0 A7 m7 c( @, m
$ O# f# c1 d# Z, o0 [2 Q; m) T5 Y; s1 ^- m
) X5 s n) O/ |# o, T7 h9 Y4 M
Tetris* CreateTwoTetris()) l& {2 }8 j2 S% W9 k" ]4 N/ J
; R/ k+ O5 ]5 Y/ Y5 M7 V{& T- K1 n- L, ~, |& P8 {+ ~/ e
static TwoTetris tetris;4 ?4 f/ I$ N- _/ g& R
; d6 k$ }/ }* k g8 [6 I" F: `* @
tetris.InitPos(); N4 y. S9 @: r; N5 _4 a! U" v
return & tetris;
9 S% D' w6 W3 q: G; A3 X, k) C
/ B' c' t9 H4 z: H0 o4 @! Y5 A}8 L: s+ Z4 l. {7 A" q" r+ h5 F
% k$ t; R( h" b2 O7 q9 _4 E5 E: Q$ P/ `9 i* p& T/ i6 y' a: x* F
" _1 J, B" p0 {. L) O! T( ~, A
Tetris* CreateThreeTetris() \6 H x8 ]4 \$ A u& I6 R9 ~9 e
- u. p' V9 Q" f) g0 k
{
0 C6 }3 W6 N$ {1 _5 Q& f static ThreeTetris tetris;$ D( C& B8 Q9 W+ C, x
$ n) G) L; i3 @( g$ L) P8 P
tetris.InitPos();
% i. L0 {! e# f& w
% q; |' e5 |' t
8 K0 x* d. s4 I# u: k1 Wreturn & tetris;* @0 X; n0 @0 E7 h4 @' `
4 M7 d: ]$ p- I) D: F
}
( l: ]& z5 N5 q3 M- a6 [
3 H4 k' ~5 q, P3 H. m2 X$ [
% E5 @/ q" F" m- _
! t# d# u- H+ k9 f3 r. t$ S% rTetris* CreateFourTetris()
0 F) j- Q0 G0 [! i' j/ G1 S v9 k& Y, \6 m9 q F7 V8 d- b
{$ n2 j0 m7 V1 ~; C" P
static FourTetris tetris;% y: D3 ~: {' n4 l( n
( A$ E! w; H% X( Q/ P4 R
tetris.InitPos();9 j8 a, H( T! ?8 Z! O# g+ N5 Y0 w
return & tetris;
3 a( i5 ]0 ?2 ~ y% [
) w; a* W% I: B* l1 b}
+ A1 z7 S: g4 U% s, O& b3 k1 z1 U& j2 y/ S) J1 F
0 O, P+ F! F% Y5 S
' r5 M* q7 p* N1 _/ P7 `Tetris* CreateFiveTetris()4 U" {) ^ X$ @3 U S% a! K5 A
1 Y1 h9 h' {9 [9 z/ s{
* }4 U) F6 w+ R1 u' Q9 D: Q: ]% B static FiveTetris tetris;# q. Q7 ^) q5 d3 O9 i' w
" f1 r! m# o; E) S; itetris.InitPos();
$ y& z" ^& W4 W j3 C. @ return & tetris;
, m, y# V! }2 q% n7 a6 a: ^$ W0 \* t5 x9 Q
}2 a7 t# M& {) J% S
0 r9 V/ p+ e" o6 h7 O3 x
+ A- B5 i: T) b7 ` U$ F9 l& TTetris* CreateSixTetris()# E! g# h4 M0 w8 ~8 n, G0 k
# }6 V; x9 N- {" t2 p1 w
{/ k4 u! G* ?- X% _) a, x; ~% s
static SixTetris tetris;1 R( V: ?4 R, e9 j6 Z
5 ^; {( ]" W+ Y8 ?0 | O
tetris.InitPos();+ l" N7 r, B; p8 j3 M4 N
return & tetris;. t& _9 U% H" p& n
" N- a0 w8 c- R0 ^: i; W
}* {$ n. \% {0 }) ^
+ b" w0 \4 f: M3 t7 _
3 n3 U8 x0 |# z$ X. s9 F
7 Q. i7 q! O, r8 F) |7 \0 {
3 p3 ?" p$ p9 A |6 mTetris* CreateSevenTetris()
; x; J8 h' c* d0 f" f/ v. O; O/ d) h1 ^2 s
{# U* {1 i2 o- l' h% n
static SevenTetris tetris;
- |5 D& r' {* f6 r# s
# \/ o3 x: E& t) V3 `8 r. b+ ~tetris.InitPos();
* ~% U' [2 N7 o7 }- A1 P7 u- p return & tetris;
+ a, P, o# O' B. t; ~6 s' Q' ]& I, B$ y9 J) D
}
! x; `% Q" b6 e1 b' |
' |2 @* q( A$ B. b# V4 e+ n: iprivate:& x5 w* C( s7 b: T
7 L$ n% w( c9 S N' R typedef Tetris*(TetrisFactory::*PMA)();4 w6 p: b5 T* w
0 `, o7 B+ i( ?6 F
std::map<char,PMA> m_sel2TetrisMap;$ P( ]" u. i7 P' h# P8 g- N
1 r5 q" K: M$ ~5 c
! b5 \, _ P/ w};
& Y- Z0 W8 r# Q* [& }7 h m $ b5 M& m l" m7 ]7 {- i4 T' o
有兴趣的朋友可以下下来改改玩玩。
: b: p* V+ ?0 U6 g: m4 F0 \
1 Y4 P2 E- |" L1 I! D/ F1 h, \That’s all!5 [5 x0 J( V$ |+ O* j% W
4 ~0 S+ {& R9 D* r5 G# tPeter
& b9 B; P; M( G+ J, @0 w d% ?+ `0 O6 r; l0 R# g
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|