|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: 1 S1 @, W' r% Z$ t
图 1
5 [# N8 d9 x' b' f. h完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:3 D+ O p: P) t; X4 ]# u$ a
$ F4 D* ]. l2 F. I) H6 m: _# M4 X! x! g8 W4 _1 d3 a
Factory的code如下:: A# B6 r3 n G% V: F( M) X
/ s! H- Q9 n5 S9 v i/*************************************
' K* ?$ v% p/ K7 E, r
! P, \. _' T! x' I- G- S* author:hgf_starlovecpp@hotmail.com# }' x8 \. G5 v* B: T% C7 I" L
& _ p4 S+ |6 f6 y' K* version:1.0
& M9 A- k; A [1 m) K
2 A2 u; [' A) x2 {# o* description: just for fun
7 H# U5 }% p" c4 f$ p; Y
) u |4 O1 f: z4 f, B* todo: hard code exists need to fixed
, z* G. \- v/ B" J% i4 l+ ?0 w- h. J h1 [$ g; y7 G$ R; E3 T
**************************************/4 n$ p& u) o, m F7 b1 X
+ q+ e/ X& c5 `#pragma once
/ g) b# F! J) }! X- _) X' r2 o#include <map>3 a2 n- J( Z- |/ i
#include "Tetris.h"* X: N+ s1 b$ h! ~% v" R
#include "OneTetris.h"4 i% Q& N3 @% P+ X* w! s; A! S9 i
#include "TwoTetris.h"4 f4 _$ A) a) t1 k. W
#include "ThreeTetris.h"
* f5 `! y0 K1 D#include "FourTetris.h"
4 u6 V$ v& R3 H8 Z6 I#include "FiveTetris.h"
" J" T( L+ h+ R/ j5 F) {#include "SixTetris.h"& g" S1 p6 j: W3 U9 | B% p
#include "SevenTetris.h"4 T% k7 {* ^) n7 G% i7 V' U
$ S& B4 {; c2 |" z, Tclass TetrisFactory" m; T6 J* w. B
{5 Y m+ C! _7 z
public:
' |0 b a- e; M' x4 z4 I- J4 X
% a ~4 a: [- d6 L
" W- Z$ f A$ g2 i: ], o9 uTetrisFactory(void)( |$ k5 p2 t: u. h$ b" K: n/ T
2 g; v% x1 T3 \: `- M0 M7 {$ \0 T{
- g- J, B8 h6 d1 Z" r |+ T
$ K, `5 f0 V, u, k# r: j+ f5 H! i. sm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
$ d: U: B+ B: @8 i/ ~0 ]8 r+ N! F8 A% \- [4 X/ q
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;0 }- j, i! W A9 s1 ]+ Z
: Z" S/ I2 U: k9 l2 {" y0 q
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
$ \% b) P4 C1 _+ X) Q& q+ O# g* O" b! y
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;8 v% n; P! U3 L7 F
. M0 V8 K+ `$ {) ?' v
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
- H5 k6 \$ F$ X/ U* I9 ]' ?& U! V. o0 K' ~% Q3 l' @( ?
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;' h/ ?. \7 Z4 x; q: B2 s; P
) l* @0 @: B; @. m
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
- G% q( ?4 W( U1 P: a, K
; v, N: E q/ \}4 ~) t! b: g+ Y# u; t
public:- a' U( O6 v$ ~5 ?
8 y3 `; F1 q: K/ y* l5 a5 z8 r6 l9 g* }4 n! `- a7 a. L
~TetrisFactory(void)
! W) A3 _! p5 L6 Y/ L/ ?$ [+ T+ m) L$ e7 v& K! A P
{2 {; {( n5 Q, {/ A d, l2 m
" I# Q: G/ W& t2 f6 k
}
4 F7 f7 \4 C) x3 D! U1 _0 g
9 W( ]+ J) l5 VTetris* CreateTetris(char sel)
" c8 i! x# N* x0 I* W$ M1 n% S/ R2 c- H5 z' N6 @
{
) X% H6 Y; v" H2 x' t return (this->*(m_sel2TetrisMap.find(sel)->second))();; i, b! h8 N* t$ ~' [
* G0 y6 b$ A& k$ X7 H% B6 n
}8 I' R: S# d4 y$ P4 t6 a+ b
private:
- i5 N2 p; L) x# D, M V$ @4 e2 x
( }+ ~8 @: K/ J. y% [2 J+ x% L8 C2 j. y4 H7 s/ W
: |0 a; S9 P+ W5 c3 a$ x+ W) ^" PTetris* CreateOneTetris()
1 H7 z* S1 o7 t2 { x0 d
' ]! k/ N8 {+ ^* s# ?{
4 ?! Q: T( ]! _( A1 ~/ ^ static OneTetris tetris;
6 e$ e& z- n: b+ k [4 A
$ ^" Q1 Y/ P8 ctetris.InitPos();
J: \6 i( `5 D7 e$ r F return & tetris;8 J. g2 H- C J8 p
( a% H4 V( b! p) Y) d$ s}
1 @9 w. V2 Z. Q9 O: d2 M [3 i
) i+ z" F0 n( j) N' Y$ T+ L7 t2 @0 l; |6 N5 @9 e
6 R' w A1 F+ ?5 m2 \3 w( fTetris* CreateTwoTetris()
3 |6 A5 V3 N( |! y/ f& E1 G. z$ a+ N* ~# i0 i- {% e
{' r" C: J9 r# I2 [ ]
static TwoTetris tetris;0 v ~2 K) R8 I1 J$ ^. l8 i$ a
* ~! F; d8 _( Qtetris.InitPos();
, w* k3 q/ o$ k- P' C return & tetris;3 r1 C% z& v, @
8 {# L' a/ ~" d0 B/ f& b}
, a% ?1 K$ u* h! Y) T, `* X
# |- ]* @0 L" b% C
# j$ V% i& z5 w0 d$ F* u8 z
( \- g/ j! C% Y* W. F, [Tetris* CreateThreeTetris()9 p/ a2 g4 `+ G
* n# @- v: I9 y5 S{
) t& m4 z- e/ {% B static ThreeTetris tetris;
% y: ~4 R( o- y" c$ C! T$ m. P. a
8 h8 e! ?* K4 l) h" P5 @tetris.InitPos();
& ~9 F5 S9 x% }8 @% I$ s; b6 s0 F4 G k# B* L, w0 ]$ c& U5 x$ @ o
2 f0 d q0 y, t9 A# g @
return & tetris;
+ L6 l, n; L9 d% |/ n( Y! h
( f1 j% _8 N$ C* I, w- i}
: \3 u# X9 D9 o1 h1 F2 b
5 [0 V+ @% { U- `, N
+ I2 Y0 H6 o: T7 E2 x
2 R8 ]& y; a4 Q( T. z' ITetris* CreateFourTetris()" R" D% }2 v1 E& k8 g: j" {4 T
1 r/ b% e! R* L7 `& u& x
{
: F1 ~7 H+ @( P, H static FourTetris tetris;3 w' j, `- Z# A j
# E$ V' |/ Y5 U% f6 T L; Wtetris.InitPos();/ \7 x$ p E; @0 H1 B
return & tetris;" {* f* W5 e8 X6 y \# \
8 _" u _! H1 R" y; J3 t
}0 z) H0 k% @* R1 g' V9 T
; s2 H X( L) C* j
5 A2 H% _- n: V8 f) x) O+ h
6 C2 G' R4 K% c3 dTetris* CreateFiveTetris()
" K, `. E( p+ ?; r: k( J
( G$ q, n; ~& L& e+ {{
2 ^& {/ A+ e# A4 j static FiveTetris tetris;
7 k9 O" I* x) ~% w h" P A" k' j! f
+ g4 f" e M! u, Qtetris.InitPos();. l+ |! i: c4 `# f8 q
return & tetris;) K/ b! }0 J8 O! J2 u' K, K; V
# c0 J v4 K5 y0 h( ~$ o}$ q3 E9 b& q9 ~! P) N; E, q
+ w' L3 M7 c( U5 t/ I/ |! {) a4 c/ e* K) j
Tetris* CreateSixTetris()
& [1 x5 E$ v. g% w$ q. A7 l
* N/ X) w2 _" x- b4 b0 Q{
5 i6 t2 O, j; W3 K5 N! k! l" I static SixTetris tetris;4 c6 P7 K& d+ s' E
$ x- A* H% a# k% D& ^
tetris.InitPos();
0 g r3 y: n, B6 p return & tetris;( o. ]% A" J( N7 }
2 D( w$ E, B3 `) y/ g7 n. L}3 t+ V' p# {3 E
6 o. b# @6 \7 y- Y5 e) k0 h/ u8 z- w
0 x9 r/ R' C" ]* J
! C1 f- z1 [3 P. q- R! T& {
Tetris* CreateSevenTetris()
! g4 A+ x) l/ Z! \+ p, m9 E6 K8 u# T. P! g, u2 |8 P
{- [3 @5 L ]! S
static SevenTetris tetris;
! K8 {2 T4 s5 v' Y; {% l$ O6 c! H1 j7 z
tetris.InitPos();$ k0 [- }1 [& B3 a- R
return & tetris;
n. h: w# {% @+ L' V
1 x# `3 T; S% B6 J0 p9 Q/ Z}7 E2 |, l. Y7 [ A. y, w/ X
2 }- \& t- e3 e
private:5 g# s: C* } K; s' q
0 k% m# k+ x* m
typedef Tetris*(TetrisFactory::*PMA)();: F* w" Q. i9 b2 d& L
0 R4 L( d1 w6 T& {2 T8 a; pstd::map<char,PMA> m_sel2TetrisMap;+ J/ e; [, \* B" F1 {9 q
; j% I) ?, J2 i3 y3 P
B" O1 K' F, z2 i};
, l0 Z5 V" ~2 A' [0 R
5 G" O9 |; S. p& J9 w有兴趣的朋友可以下下来改改玩玩。
' e* t$ g5 u- } s
0 P) q. U9 J+ G1 `# ZThat’s all!
+ e! _9 u) W* [/ Q& ?2 Q" p 1 i: ]3 ]/ L& }9 ?8 Y, i8 m
Peter 6 C0 I0 e3 d1 W0 t2 O; A% H( d
" e; t! d: X2 ^% r[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|