|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
" l& ]( h/ m/ X! y; q图 1! Q: Q) t. B) ? }4 ^" F7 c
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:8 X3 G8 [2 a# b! J/ J- n
. s0 c+ n0 Q8 B, E' b$ G3 l
5 R2 }" L! D$ d! y) Z, @, p
Factory的code如下:
- K) I2 }8 \; q( L+ r % |) f; D$ Z3 b$ r& R9 z1 U
/*************************************8 Y1 J8 Y5 {& {; U& H- X
) m7 D. w( C1 [- l5 V/ S3 @- p1 U! n0 j( H, g* author:hgf_starlovecpp@hotmail.com8 I7 |, i, @1 @# s* g; c# {& j
' ]1 X9 K; b4 j7 h3 m/ k' e
* version:1.0
% p/ p2 Y9 N: V! b" ]4 r9 i6 R+ o3 N A A* s0 A7 O1 {$ I$ q
* description: just for fun. P+ e" ?% e$ `4 j/ |! n* k0 k
7 b1 [6 V/ Y/ F' o
* todo: hard code exists need to fixed8 z. G/ G. R7 y( c* M' v6 y. V. H
! D& H7 f2 }6 z. r5 P, k( h& J# y
**************************************/! _) u" i9 u; C5 P1 `6 z
1 `9 A7 `' U2 J* O3 M
#pragma once
3 F- m! L8 r0 g( l: @#include <map>0 O4 Q/ P P4 d% j; _
#include "Tetris.h"0 O' S7 m% ]" I8 ]- ^! O
#include "OneTetris.h"* P2 B3 v: \ V, w
#include "TwoTetris.h"
7 e- P- Y3 r' |9 ^8 g+ o! u$ i#include "ThreeTetris.h"
; s* Y4 e% Y) b) P: `#include "FourTetris.h"
" `6 I+ j/ z9 {7 r6 R% A#include "FiveTetris.h"9 p) c! G& P/ Y! K k; U% M$ W
#include "SixTetris.h"
" j# v0 N3 a3 `' O#include "SevenTetris.h"( o9 H$ \3 c" Z& c
. S: j1 B/ W2 M6 Cclass TetrisFactory
1 ^0 F; w6 {! [& P8 p$ O% y; A{# q+ {" N [. k" W$ t
public:
5 i/ S. I& R2 N7 {6 H3 ]$ f & t. k1 X4 b* G
* Z6 e. a8 F, [6 @. d
TetrisFactory(void)
$ S+ _) R: g* e" d/ k" R) t$ V" T- X5 b5 j, M) A
{
J( m' _5 q% U1 E$ g0 u I* C+ g" g- w# j) C
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;0 e) `5 n, y9 I1 o) }% x, k* W
/ N. X* Q2 e$ Gm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;& e* e9 |2 \. {8 z' n
. h6 c1 b7 r! f3 d3 h1 p
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;9 l5 ~" ^8 E2 C. {$ _ ^: S; r% |
' f* @3 ^+ o% S5 Mm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;+ d8 ~. n4 [( [- Z$ V
h* J; d* b8 b+ U, b# F
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;+ c% p1 m2 E' U; U$ T; o# O1 L
+ r' O, Y$ \( h! om_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
3 N( ~. @4 q- y& P
; ~. L. L1 v Q1 X9 n! `- Om_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
8 X8 |( o% ~# }+ ?0 P: X
( J/ U. A, X; s M}: F2 O; l0 k6 } }% N* F& b& V5 I
public:4 F5 `- X, P0 Y, n
' V+ j9 X8 ^9 h' y- t! Q* C2 ~
6 C& h- O: H; A7 r1 O~TetrisFactory(void)
6 n0 P: s3 X2 S p2 Y2 t6 | Z. _+ E
{5 K5 l# V* j6 I# @# J
. B5 N$ A& @* e+ K
}
/ ^: Z- y b S' ]8 U
' X {; {: {1 r5 w5 x8 pTetris* CreateTetris(char sel)
: c1 t) _2 Z1 J; w+ B* X( L
& |' J$ x+ }$ [! C/ k{
; Z; \9 v5 X0 g return (this->*(m_sel2TetrisMap.find(sel)->second))();
$ ?3 [2 s) U- J! W* h
0 p% L$ `5 z: }7 Y; h}
! A- X7 O, S& J6 B) v2 Q& c0 Aprivate:' s+ K! `5 H. f0 X
) u: ^/ E' Q: S2 l: h. A b
( g; W8 m4 q3 Y0 E
: g% Y5 e% O* r8 y1 QTetris* CreateOneTetris()9 }' H' E& |% i* g) F& _% C& v
) Y" P! D5 Y& L{
3 O2 r* R) W3 J static OneTetris tetris;, W5 e2 ~3 Y- T( f( l5 K( E
0 N+ k/ q2 |5 P" ptetris.InitPos();, v; T4 V ~: A/ D' E8 b2 w6 ^
return & tetris;) a _ h7 G$ ^: s- G( B
9 d2 A0 H ?: N4 R* d/ E$ C}
1 m8 v: X( r+ ~5 z% a6 R3 [$ U3 E. r8 G/ b' R0 i
/ o8 x; {$ F3 |6 n* t$ `) {* f3 w0 [' w L' n# O( }
Tetris* CreateTwoTetris()' S$ |; m, F) M3 f
: z6 }) T& d- D+ e{
6 Q" u& h) L# P/ b+ y1 q" p static TwoTetris tetris;
3 P$ V9 o8 d( t- n
$ y9 T. ^( c" Q+ F+ s3 }) d- Qtetris.InitPos();) k6 k3 m. j6 n4 o6 ]# ~& j7 w w
return & tetris;# ~/ h% S+ Z3 A* g
9 w. D* ]7 H3 [4 q. u! A2 T
}, ^# c4 a) h! j8 x/ B( r8 q' w
6 d- R/ b# j) u
' O V7 c. i( T1 R9 H+ n4 G$ b& D. U- c8 V q' l7 F
Tetris* CreateThreeTetris()
9 m4 g3 w6 L; s+ ^0 l4 M+ D
+ s8 i/ C" `3 ^: E5 U% }$ q{, e& s& I$ i/ C8 `* L1 p( _" s& ]
static ThreeTetris tetris;; a: l3 V; O: W& ~- Q3 z
* s4 t' P( Q- j, o+ E5 o, V# W4 Otetris.InitPos();+ S$ [: a8 Y1 k. ~8 ?, e
# |# _# A" M* w5 t5 e% h0 d3 C
, x) O# z# W" q$ m" K) Z2 I
return & tetris;
7 r$ E( \9 P) u1 ?+ Y' a' O! w/ D, f1 G6 M1 L9 j1 `1 B
}9 z6 Z" j6 A a0 v
2 k. p' a+ _0 a
9 G+ b( q' X+ ~ u* U) `% O/ ~9 M! v% x; U4 I! }0 n4 u
Tetris* CreateFourTetris()
) y3 E+ @8 K! E$ W
R( ^# b' {" F2 E6 l7 D! K{
/ Q( R4 y/ a5 o/ [/ K static FourTetris tetris;3 @" C q3 A* u5 ^
, R! s q/ y! b4 d, X2 M: Mtetris.InitPos();
- y3 \5 m2 \' d! _$ z9 ~4 o) C return & tetris;
0 y* y$ q* Q+ J. T8 X' N/ `' Z$ Z3 M, z" L( c( h
}" V+ [. Y0 ]+ K
) A* L; T: O# `) u V) ?' h- P5 m0 F3 I' l9 z
r; M* W3 k. t* i% L$ R, ^Tetris* CreateFiveTetris()# Y4 `# k: }- `
- h% t: K+ @% f/ K
{
1 n7 S3 a% ?: M0 L% ]. u static FiveTetris tetris;
& d: Z! f# A3 V" _% t4 q! p& |$ q' D% t4 w. R
tetris.InitPos();
% H4 c" E- Y! M+ J& z h( H return & tetris;) Y+ ~1 L5 I( r+ U, t9 i# d
& `- H7 Q) l4 n$ x( z* m5 b, z8 ^}
9 J6 c+ G' H C 6 \( N4 \5 ~. l+ t [6 ~
8 G% [7 X3 |0 \5 x- u
Tetris* CreateSixTetris()/ z: A9 }# c8 y& ^: Z4 \
7 P2 \# W5 I3 f5 _! d+ t
{
6 E+ b1 ^) v7 g+ c static SixTetris tetris;4 \- s; m9 @ q6 s6 l& N( Y( o
$ h; s' O2 ?' X w' m0 R5 Dtetris.InitPos();$ ^* d' b; ^5 f+ a. N' n- U. c
return & tetris;
: _: l# [9 U8 C9 C3 b! {5 ]
! K8 R" \$ U/ @}! E9 Y1 t% Z; @- g
% S2 V: T! l( u' z/ a
7 c$ c5 S2 w' c4 k% Y
6 D( ^ t5 @ ~( m
0 m5 J* i& L' G' o' [0 i1 A( a2 xTetris* CreateSevenTetris()
6 N- S; @# F- u1 A( C/ b$ { [. I( V
- Z- A% q3 P/ h( }{
, R, H" `3 @' Y' h, _ static SevenTetris tetris;- S( h+ N. |, d/ m. @/ K' M- H
/ c8 o G# d7 L
tetris.InitPos();
9 n; m" a" k$ _! O- R return & tetris;- M* G2 |4 Q$ W( M
P# X& T6 C/ ^9 M3 L C}. x, r" O7 r% b6 `- e% o2 E
- M6 b e# q6 q+ A3 q* Xprivate:
5 l- ]+ x+ I4 b( u
# r- c8 ]# S4 H! S/ ^* C typedef Tetris*(TetrisFactory::*PMA)();
) \" Q+ q- _/ C' A. c0 l$ f- X e& I) I& W/ P3 C1 m
std::map<char,PMA> m_sel2TetrisMap;
# d: S! a/ b J$ O2 d) t, n: p: d# o4 a, `: ~9 A% H, Y
9 M! d# Q+ y: c0 y) u
};3 I p' b3 z3 [; U* }' d# v, v: [
6 y3 \, _3 v3 L- W& d6 D5 m
有兴趣的朋友可以下下来改改玩玩。' }) d: x$ a- j9 t$ U& G) v, n
# |5 E8 }, _4 V8 s% ]( A% k
That’s all!
- z# j0 ^% Q2 b. x- o/ Y9 q " z9 D! `8 B3 B$ k3 D4 d/ `
Peter
( Q) b8 @3 Z E# I/ D ]/ B( K1 i% W: B5 C. G- \
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|