|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
' t( y) [. R6 T图 1
$ d& l |% j+ d% r6 V完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:" g% [' b2 V3 I+ R2 C0 a
+ s8 i; Q' ]( L0 ^( z4 D; G
5 p& R$ w/ C: JFactory的code如下:
6 Q9 g1 h" `1 r9 c
7 ?% R/ z1 S Q/*************************************
0 G0 J' D# o! Z& `( U! c( c+ s
* author:hgf_starlovecpp@hotmail.com1 v* B7 L2 W& d- J- s
0 X9 J. g: t/ G' i+ {, @4 Z* version:1.09 H5 }' ]1 N( f! X* j
# b2 D0 Y3 x) {, K. `
* description: just for fun
8 E& d a! f6 J2 m, w
) F, E' o- L: X1 a0 f* todo: hard code exists need to fixed
; ?4 a: u8 K- T7 @' F) j" \/ ^
U1 W2 n6 S0 `2 G! v; t3 b: e) ~**************************************/4 q' z; c$ `4 c" Z. v
% E2 e. f5 c6 [4 @0 V#pragma once3 X1 b" P! U% B* T H2 f/ D7 O
#include <map>
8 A5 M6 ?0 o( _1 t#include "Tetris.h"# N0 k3 L" d) I/ _7 J2 [" U* M1 }
#include "OneTetris.h"* v3 {% O5 @% a. [. X
#include "TwoTetris.h"
1 u% W+ R2 A( p3 E% G' c#include "ThreeTetris.h"
, O2 m; G, Z. s! L; X/ j, l#include "FourTetris.h"
& [4 U& B1 V9 b& z#include "FiveTetris.h"
7 a9 }0 M0 a( N4 k; U#include "SixTetris.h"
2 }, E7 V3 N3 I; J& n6 h* x1 t#include "SevenTetris.h"
! Z) c. n! G/ i* b' C) c. ` ; Z) z. `7 K* p* l& E" G6 f
class TetrisFactory1 o& {5 `) h5 Q' s! }: U9 [
{! D# G7 l9 l- W" v; s
public:
, ]. @3 Y; c2 ]( E. d: j7 a + z! m q; _& r. s' `, I
7 ]5 P7 N3 m0 p/ o! b3 ]9 w6 p
TetrisFactory(void)8 k7 H* L, h: O3 ^
4 k- q3 v& h7 a: Z+ _/ k0 x) k3 l{! T( U" ~$ K/ n6 @5 @( o. M" m( v, N
" c9 Q& m/ c; X9 q* i
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;4 y- Q1 _$ x( W; A" q
4 I C( ^3 s( @9 C
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
" N2 ^) i: Y6 H( x4 Y0 W( Q% e7 W3 A |, y- r) f! @4 M7 J! f
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;; a9 e3 Z+ ?, m$ p/ }; _3 x5 A- H
. p/ f1 R4 R# c$ j' `. O' hm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;- }9 `0 W3 i$ [5 ~$ N- ^- h! m
# e: K, c! g0 f: E7 \+ c' Wm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
, Y+ x7 b* S2 S( t; P2 }0 |+ p: l# ^0 |: @
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
" ?8 ], @' R* X7 H( B- A5 _9 k+ l5 G
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;5 C- A8 [* J4 d
- B8 S5 F g* d+ x9 O+ W
}% p- Z- K- v$ U V, Z' y
public:
g6 } B. V+ A9 F% l/ L
8 r l) ~5 g9 \+ v, }* l' G* f3 l* Z6 l! a
~TetrisFactory(void); F- l( @0 P. R4 Z- Z. y- P
1 B8 ]0 ?. q1 w$ [9 C; O$ e% C/ j
{, A7 z# u |8 F# b
4 Q* _0 i+ t8 d}- U; ~& v8 h4 C9 B6 s- C6 v
/ g' I; I+ M1 b2 l( \6 RTetris* CreateTetris(char sel) P* G2 e9 p7 h. N7 T
3 _$ q* n6 m* c7 O5 f
{1 t: V5 R" Q. W
return (this->*(m_sel2TetrisMap.find(sel)->second))();
# u+ u3 K9 A# R( K, _/ x% t. F$ Y; O# m& p, D
}
5 }4 X U, Q* |7 dprivate:5 d; H& X; b! d1 T7 M. ?& ^2 k" p* w
6 w9 L' f- i$ T& w7 R7 K' S
3 k* U! b9 z( _% J( s4 M
$ r6 _4 X8 U' g! N7 M' gTetris* CreateOneTetris()
( y( V- L/ I7 F% [/ A* Z0 \& t# u- c- P- O( l3 O0 _7 x7 z
{; g h# B5 ^* ]% {# O2 o- F
static OneTetris tetris;+ I7 ?0 D) V; ~5 t% n
9 Y/ B5 x) R/ x9 E" p8 |* z6 ]' Rtetris.InitPos();4 @: Y" Y5 r }7 f0 }& s
return & tetris;8 l H8 f/ f7 S+ s
( z5 B+ S8 X( L* R! B
}
. L6 W, v5 n& U1 n9 D* J8 ]. T
: G% V# O4 g2 R
& B/ L: G* }0 ~ Q8 ~3 I9 }# T+ { J1 g* V# Z8 H; j
Tetris* CreateTwoTetris()9 c1 F+ I8 Y; G2 I' p/ e0 M4 Z
! @% D& E, p/ p( G5 l9 N{
7 p* E8 C6 [! w- \$ I static TwoTetris tetris;
e0 @! w1 J3 O; [6 j) s: x* M7 ^' R
tetris.InitPos();, n! J+ k4 i( _: F
return & tetris;
|2 J8 k* g9 s, T: W3 t+ q% L6 ]
}
+ I, `0 F" r: s# J" ?
3 y4 Z/ i% I) N1 Y9 Y. S1 L
+ a3 U5 Z4 v) c0 `
' _# Y: s7 ~1 D+ L qTetris* CreateThreeTetris()7 e' P( [; X4 X( G3 O% ^0 c
' j; T3 M6 l3 @. {9 ~
{
" {+ c$ f+ Z. i. Y4 \5 b static ThreeTetris tetris;: }- s( L/ P, b7 I5 C
4 t8 u u3 r! z/ u3 s
tetris.InitPos();/ `6 Q J4 o' m$ I7 B- E
# p0 G) `$ w: }
# Q4 }$ e5 Z* G' F. k- lreturn & tetris;, k9 c8 ?% _/ L) O7 R6 Z
. A; c- ~/ E0 n0 f6 U
}
, Z( u& y/ ~ A2 y+ K
3 d' t$ ?) V* B* @1 w
4 ?4 g2 c( K: D. ?* Z) A! F ], T: Z$ p
Tetris* CreateFourTetris()2 z p( Y5 c( o4 a. R# B
, x; |& H4 j2 V& @- r7 T
{
n9 J! K4 H; L& k% I9 C: Y static FourTetris tetris;
7 f0 b, f( G3 q( L; Y( `
& ~6 ?* O. O- Q3 D* H9 q$ atetris.InitPos();& T4 x+ C# S1 j# q# T
return & tetris;1 y3 u2 f% Q; r3 t# W- V
$ w8 B7 a: t/ L/ H- N2 \8 Z4 V2 J}3 v" z3 O! C- V4 o" n8 S
; G W# t+ y: R* y8 W/ i* u0 m
7 X; n0 ^* i( N b, b2 l1 G2 Y
7 `6 L. S1 w W; g8 |0 y% c; u8 P( eTetris* CreateFiveTetris()
# ?; h4 i! a4 |7 u8 e! S2 g9 O3 W7 l8 ~
{
& G9 p8 t8 W- f6 L; t7 y static FiveTetris tetris;2 J* q0 ~' ^- W# Z6 Q
+ K$ f$ s( O6 R9 Atetris.InitPos();
% @" y: u2 h: U+ ]/ k return & tetris;2 e5 A0 ]2 f: z g
: x& {$ F; ~8 Q6 w}
2 k( ?) S# k7 D) b
n& G% K3 M. K$ a7 m& U, f7 w6 d
Tetris* CreateSixTetris()
z, X' N; W7 c. g. `) T4 @
/ \, Q. Y: S- r$ h" t{- j2 c! `2 H! [/ H" p. ~. x7 t& `2 d
static SixTetris tetris; B6 b) ?% n$ @ b! J/ d U
( L# v" j) `( }$ a$ q, ]. _% t9 Itetris.InitPos();, I/ r @4 _# F5 n& [
return & tetris;. U% k( S9 {. L! ?+ }
7 c, P/ K8 I- U5 P' j% @1 \
}/ y5 ]' ~/ k8 ?' {" U6 c, O
% O4 V$ R" L# B1 h+ u# l! ^; |) [/ n
B2 ?9 D4 \. r5 m/ W" ~
: p% _2 p3 I5 j1 n9 j% j" f0 A+ R+ y6 g- m
Tetris* CreateSevenTetris()
0 Z2 ?3 A2 t- b" _$ O ~$ T
6 @# ]8 h8 i$ i2 I5 S6 |7 U{) p+ B H: S& b- W8 O( w0 y W
static SevenTetris tetris;
& U* {. b7 w6 Q) p
( j2 K9 y; d: _8 Jtetris.InitPos();
0 f+ }4 ^* x6 I1 W* a return & tetris;
, q3 E% H' J. f; H- v8 @6 E" A# N, A
}5 i1 [$ q1 Y% ?) n- ]
! z$ N' n$ _. \private:
/ A: O+ ?8 D/ g x6 _( @/ I3 y4 F
- t3 v- A0 _2 a typedef Tetris*(TetrisFactory::*PMA)();% @) [$ W+ V# J5 O$ ^+ G
: y- O! R6 }+ M, D0 {( Estd::map<char,PMA> m_sel2TetrisMap;! N, s% l' t# s; V7 W
# Z& Y, c3 P" w! b. r! C" L) ^" q9 ~
};# y: g0 p0 O* g2 _6 _; _# o: m
& y0 D( m% S% s& O7 k$ K5 I有兴趣的朋友可以下下来改改玩玩。/ t* _1 E1 G0 W* q4 f
& o+ I# t3 i0 ?! ~" d& H. {That’s all!* K, E; H. f8 U
4 ]* H$ s# D2 y$ L; F
Peter - L3 P6 O) ^* R4 a/ J. i
% q" Z* ~5 q5 f1 S; b! e# W, C2 F
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|