|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: / ^/ n4 h/ H* Z+ _
图 1
/ y6 c; o. K' O完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:% `, {( V+ ^* ^& }; _& D* d. S
$ a4 R0 R: t2 @6 \ r, H$ R& Y0 c
1 Y w- g; \# r5 i- YFactory的code如下:3 o* N/ j3 z' c" z
6 X' H9 d( j4 W
/*************************************
+ b. _9 a- b p* x' O0 f) a7 s
) r+ e8 i2 c4 b; g' A* author:hgf_starlovecpp@hotmail.com& c* x2 s9 A5 z8 t9 z
+ X' Q& Z6 p$ p4 T6 J* version:1.08 v) [6 j" D. s9 b7 g4 z1 k
0 Q. H7 K6 r0 Z) [- H6 @1 E' ^# k4 h
* description: just for fun" U& z. ?7 _/ x4 o. D: o% y
1 P1 _. Q8 ~' g/ t0 N; p
* todo: hard code exists need to fixed# D. f4 m4 \; ~" e: x/ q7 g
7 G! J$ d( g6 n% ]4 A8 X**************************************/
- a0 ^, m& m' r% B3 o
& a- _8 i: D/ ^' B; n#pragma once# Z" q% r1 B0 x& J* B
#include <map>1 Q9 G1 e6 D V& {7 T+ t
#include "Tetris.h"
9 d. s/ @( \/ B2 A: q#include "OneTetris.h"- O9 \) D9 ~) N' R9 d2 D
#include "TwoTetris.h"
6 c/ B" |( ], g) X' U#include "ThreeTetris.h"
- |7 H" g& W5 S9 C2 N i#include "FourTetris.h"4 j9 o: E; Y" W2 o
#include "FiveTetris.h"" v$ p% |% p/ v4 _4 L9 i
#include "SixTetris.h"+ l) {/ l3 R3 q- Q( @) B
#include "SevenTetris.h"
. \, \. ^( } Q* C
" S7 x& H4 j4 a F7 H- ]class TetrisFactory
- O0 F1 K6 b x. I. D! \& [' ~{
& }: F6 o2 l+ {public:, a; }8 U2 z" q0 J0 e$ x! Q
2 n* F4 z" \9 G7 A
+ l, R. z' B$ s9 X) y+ ]% ^TetrisFactory(void)2 L: g7 _- K. b/ i% ?; d
0 x z$ ?0 ?4 M0 A( i1 X" @{
7 t& l) L8 N, t) {
' w- X/ l$ _0 O* x" M! [* qm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;- n% Y+ f7 r" D+ G p
' ]5 i; I. U$ [9 b bm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
/ @; a5 u2 n; R* S H% H! W4 P4 k" c' H) ^$ _
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
# r K4 y2 D( a" C5 f& @
1 i1 r8 |0 s3 w4 [6 m$ V& W0 y# vm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
0 x I" z+ V7 u4 B% Y
9 Y! r1 Z, O4 b& ]* u8 A0 y$ { nm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;; e4 W) L/ {6 ?3 W _# e% X& v
" Q" Q; E# h7 `, P, Gm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
: i( F( F, w$ T
+ O& z" \4 ~* e3 D. U* ?7 G& o* Rm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
; a+ \* F( C* E
* w: `& U' G/ Y7 R+ P2 O. P}$ O1 a9 f4 h; I- X* X# g
public:
+ D7 j" j* J7 L
* i' L: r* y. B' o$ c% v, @) j" _3 _
~TetrisFactory(void)
0 Z1 a4 f# r* `
: h6 S$ L2 D5 x6 v2 D+ P{
4 F0 q' H. }! U. E9 l2 w& N0 ^9 O
}
5 h) }0 o( ~( z! `1 h- a- Y
/ g9 O4 T" d/ a; d" T2 \Tetris* CreateTetris(char sel): |0 ~0 k1 y, x4 P
7 D1 U' \7 }7 }{
3 u N4 V1 i' @$ I" { return (this->*(m_sel2TetrisMap.find(sel)->second))();
# R7 R( \1 V" v8 M! V, A$ g1 Q! f; |! g! b& }$ ]
}
( _4 U0 _# n2 v* d) Z. lprivate:
( x6 t7 W0 _: g7 @
8 U9 w( [6 x& F K6 p& U# p% u- P! g
- y# m7 W7 y% |8 D/ x" T& B6 P7 W) t
Tetris* CreateOneTetris()3 x7 C# J' I6 ]1 T6 T! w+ x3 E
' X3 U! |: i( c6 ?# b' r9 J- @0 A
{
: A9 z! f: }! k4 t4 t+ t" J$ \ static OneTetris tetris;
) |/ X) e( E/ b) ?! ]' |7 m7 {" u- g! r" j$ I' \
tetris.InitPos();
- r9 T: {. t0 [9 R0 d return & tetris;
7 Y' y; t4 F* [% y+ ]+ k
: Y5 T; _$ E$ u}
3 I3 J: z) s" Q# u4 W* [8 d" o: V( l5 v& H$ {' k
: @; G2 z5 |0 j, n- V& Y$ N: V9 `5 |- {( o2 ] r, ^
Tetris* CreateTwoTetris()9 e% J+ ^" g" r2 Z% }2 |5 C
- R4 K; k y+ e# ?7 H0 w
{
5 }3 n; m( k+ r: ^' a8 k static TwoTetris tetris;- @8 ?1 E* G4 L% B6 q5 y
; @1 R# S2 Y$ y& {$ Dtetris.InitPos();9 T" P! \; y9 N" Y: X* z4 a: j
return & tetris;
) z$ G0 A( ^8 S Y
! ^0 ?# ]# h) B+ I5 @+ c}
$ @" w7 H8 ?+ b7 W5 Y! f5 S# A& t( H
: n+ z- L5 p/ e9 S8 Y1 u- c. Z8 B
U" m+ u8 h- }/ {" yTetris* CreateThreeTetris()* T& B5 ]) h% d. D
( M5 j4 I6 [9 g) S; s5 y
{
/ c& ?7 W7 i) ~' b% K6 g2 o' K static ThreeTetris tetris;
& ?! {" @8 m8 E1 S& \' c& T5 x G1 D" V
tetris.InitPos();! M" \9 V( e6 l# k, |4 \% h X5 a
- `5 P; q3 @& `$ B" s- \2 z) O
return & tetris;
5 w* y0 j; M* a, K' \5 X/ B
# _+ V& r: x! k+ ?}
3 y% G& ~% M- {/ ]. T& L9 Y6 Q, W) @4 v4 ~
4 G4 M! d+ L5 {8 F
- y, o/ s& {2 l8 R9 l# O6 u& d5 NTetris* CreateFourTetris()
, Z: ~9 v: ^% f" x; H' s; f4 n7 U# q1 p l. B7 {2 t
{4 b4 e' [' C* v# P/ ^0 j
static FourTetris tetris;8 y& W5 G6 U2 t4 N4 Y+ Q
6 j3 {: \* E Ntetris.InitPos();% G' c3 p4 D5 m3 e# D
return & tetris;( W+ B) m; Y" A2 g3 p
& E7 o( N/ V5 i' m" m3 _/ \# R; @}
- {; a. H, M! D/ R- p9 a& Q& u- y+ h3 i. |
/ s/ w' {! {! G8 H' L$ T6 M; w5 e! K( M0 N. K2 o/ V3 h
Tetris* CreateFiveTetris()) T( M# N; m% P* q, y
# H) E4 q, d6 S. [
{
! X, ^ }# g# f9 _' L3 `0 y static FiveTetris tetris;
8 @& L4 e& O8 p# u4 P2 b6 P4 x: ^5 `
tetris.InitPos();# `: w& W0 `$ Y# g" U
return & tetris;
' I! _- \' R( h, ^! g8 h) a5 g5 b' p7 w- {! A5 n( W6 ^) @. w3 f
}
, P7 g, I0 G* ?$ f! F; F' P
& P, ]" A# Y& _( L/ N- R# W: u9 k& Z
Tetris* CreateSixTetris()( a. |- Y. q) N ?: s
9 F( q- S6 V: o3 }2 p5 w; i4 K{8 J9 [" Y* [* _
static SixTetris tetris;
/ k! x, w& y, g9 g& X6 y' a l" f% C+ G1 j* l$ w
tetris.InitPos();: k* l1 Z+ {! G; q U
return & tetris;/ N; v0 E/ P5 U7 o; t s+ W$ Q
2 z; S8 S' R# i. @" |* w& |}. {) W/ L; P5 e' X- E
6 @, d+ w4 q: Q, U
) k8 D V+ r: @6 r! D% A6 ^' K, j* b6 T* c7 g+ X- K. r. M f
/ R2 l8 ^& F- U9 B8 A
Tetris* CreateSevenTetris()- y2 |' g) [% \% \$ m+ e$ W0 R! _
' M9 ~: L6 ^5 H" d, f" z
{
9 T) }) I: Z6 U" z# m: Q& U7 y static SevenTetris tetris;, O6 O$ }7 L" Y
, ^( [) q1 s: e" y% ytetris.InitPos();
2 ?+ f7 g. B( l T4 N6 j return & tetris;& X3 h: Q3 L0 j" n- {6 l
& S! R* _3 M# W% |
}' [2 R1 Q% N2 P+ h- v
# J1 D9 e z7 r5 G' \private:" N3 }- `: N8 `
$ X0 f6 p f- h! o+ b( I( ] typedef Tetris*(TetrisFactory::*PMA)();
& V3 ], t# _/ l" |6 t3 u: W( r4 h. H g
std::map<char,PMA> m_sel2TetrisMap;9 r5 a) A S8 x
+ g. @1 e2 D4 l. ]
/ V# g+ x* {: J' T& k};
! m# X* k# p- u, M
% z g: ]7 ]1 @有兴趣的朋友可以下下来改改玩玩。
% `7 q+ Z Z' H' K4 |' A" u 4 ~" x K1 `4 R0 p
That’s all!6 H" o/ B4 H2 `2 g5 I6 \7 O
5 j/ X+ N$ o' ~; q" H& [' PPeter + U3 M& C( `& @$ D8 B9 ~% w' ^
& z( Y& ~( N! v7 P/ C* M[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|