|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
* Q! s+ `0 r" v: @% `8 {) K) E: C$ [图 1' T# d% m" o) t* L& ~1 [: R; g
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:1 I; v% j% x$ F! O w! _) v8 e
: @" U# z! h! i% {4 y+ ~* l- R, v/ H
Factory的code如下:
, E6 P5 `: Z2 K9 g& S
& z" U# h: V! k7 q5 e" K, ]/*************************************+ x. Q+ H4 h! h3 N7 D! Q, ?2 ^* S
! P0 q/ A2 s: B+ {0 |7 r6 I4 Q. z* author:hgf_starlovecpp@hotmail.com4 R" g% R5 E) J5 x$ `8 a6 u
& O8 B3 l O/ k" a) F+ U1 k/ t* version:1.09 Y/ L7 N# j8 S' ~0 X* T
9 f* q6 y G* J* M
* description: just for fun
: l. r# y1 p6 g0 T( D4 r R, c' v+ j0 ~
* todo: hard code exists need to fixed
# V2 H$ P# ~9 }: m" e, u" e1 [4 P* I1 P/ P
**************************************/) @2 Z9 }% I. F5 u# e6 G& K
. [ |: C7 q3 ^. B" f/ F
#pragma once
. t7 k. S0 ?) O" J9 E#include <map>3 {& F0 p/ z" p
#include "Tetris.h"; o6 d0 F6 h# L& @" x- A+ Q
#include "OneTetris.h"
$ F9 |- k( Z+ s5 j7 T! W#include "TwoTetris.h"! G' r+ M4 W! S1 i
#include "ThreeTetris.h" J7 l% h: H X& D+ K0 ^
#include "FourTetris.h"
3 s& T {# V4 l* o9 Y: j) Z#include "FiveTetris.h"% I+ q4 q0 `/ z
#include "SixTetris.h"* L' _0 d, Y! B- {
#include "SevenTetris.h"8 G5 m( y0 Q. d
9 U& g7 {, U* k& sclass TetrisFactory! {* m5 _* S$ ?9 W
{7 b/ P) v) I# Y: c
public:$ w0 Z7 ?2 A5 {. s
- ?9 w7 M; b3 S/ A# n" w6 |4 c
: `$ J. z. A2 |5 m( z5 ?, r- uTetrisFactory(void)6 @- m% X6 @8 D' ?
6 j4 e& q, i; [ ~/ z$ e0 h* T, P{& n1 ~% _# ]# V5 \6 b
5 O8 a, X* F* N' t# g8 c8 X' c
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
( i, _; T2 D- J& W- q7 A/ B& \$ ]# H% H6 {8 Q
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;- b" e: L8 |5 `' d' ^1 A" O3 p) Q, ]
& B$ u* W6 c: u
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
7 } s6 V! h, b" j* V" d. A# \! n: X
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;! z, b- E+ X5 O! B
; R# T) w$ d$ F, M+ ^! E
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
, U" F- k3 g, V/ J, k/ D( B- N1 V3 M: Z! W2 L
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
8 U+ m/ o+ y |' B4 d( }' {/ j! }9 C7 `9 g5 I# R; C
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
* W9 V$ f" L; O' d; d
8 e, W& ?# W+ o5 D& `- [}8 a5 |0 N8 u0 A" |8 L p' A
public:& d( Q3 x! k$ J* {8 M1 }
2 s$ C _& _! P) }. h5 X- x5 I
^* l. w, j% A0 @$ |; [~TetrisFactory(void)
- E5 n$ {2 c v' \$ C8 n5 _3 j* u( _: s
{
4 n- Y3 N7 G5 h1 V9 q5 V P/ S
0 K# v+ P% w; M9 K6 Y- {}
6 G: n/ t- o6 w+ n$ y9 \* Q) k. X8 z# R! ?4 t, d) B
Tetris* CreateTetris(char sel)
! H3 L- C+ D r- P; U/ g+ U% k3 A8 I- o2 d* I0 Z9 Q: q+ m4 D+ X
{
2 c7 }* q6 `, u8 K/ j9 B return (this->*(m_sel2TetrisMap.find(sel)->second))();
3 ~# J3 y( A8 v/ I5 @
@6 C/ m; R2 X9 m! `}
- l9 b, D5 q7 J) G3 v) ^private:
- r# n, q' a2 t' @ K( r
2 e9 q$ D, U7 u* i6 K
: K7 W$ y3 X% U. k0 }/ f1 W* G
8 Q8 Z, b5 g6 A [# }Tetris* CreateOneTetris()
; y. {8 n% m, p9 i/ h! W) w# L$ L3 _- K
{
. ~; U- b5 F8 y2 x0 Z1 U$ Q) a3 g static OneTetris tetris;1 E1 I, R3 r! ]+ T) y6 g( Z6 O
" E* @5 m# ~4 K
tetris.InitPos();$ x& h* e. q& L4 f
return & tetris;
7 k. d; Q* u$ E9 D; |2 B
6 T5 ?) d- v4 E}
7 i3 w1 f2 c6 W) B0 Y6 w4 e. x0 J1 H* Q: [ k S% F* Z
* r2 _$ e4 T$ Q/ l
2 }) o" Z6 ]: C' O( c1 i( y, b- ^Tetris* CreateTwoTetris()
" J+ ^( X( u# a' y" g% A* T0 h( R/ r/ k8 u, p$ g
{
4 a6 H4 g2 }6 ]! \1 ?: w8 s static TwoTetris tetris;' I0 \' }0 X# |0 y
2 Y6 V3 V$ C1 X' G) q" w q" ]7 n7 w
tetris.InitPos();
c: {5 o7 ^2 E2 Q0 k return & tetris;
8 Q9 E) c& W2 t6 m/ u5 m i" k5 G2 f5 w2 g4 X+ h9 m5 n
}
( A3 V& c5 c/ ^+ T m9 f3 \# O
. e' M+ G3 i: c4 P* f. P% G' b; M- e T' S7 C: M
% h. }+ n4 x" P6 l; oTetris* CreateThreeTetris(); g/ t4 Q) ^/ V
3 i4 T7 f4 s3 y7 F% m# x{- a, v) w; ]& P! _4 q$ V g% S
static ThreeTetris tetris;6 u8 H0 R' u/ |) W! ~
4 \# T, B' J' Z! _" Vtetris.InitPos();
/ g- e- ~7 b' b4 q6 ?
6 m& s; b. v1 ?8 o
# C5 i5 ]* l' q" Freturn & tetris;
- \, f: r( z5 M8 Z6 [( i+ I
$ p2 ?5 J& N: V8 H9 Z2 @8 q}
: j. g3 D; `0 _/ n, A! u# Y
' y# _) w5 B7 \, [ f5 A% b& g- F, K: W: g( |# L. z
% e1 @0 o3 e6 Q! @
Tetris* CreateFourTetris()
1 ]/ l3 N+ ~3 Q ]3 _+ v" g7 z; o* |* [, |3 t$ C
{
) V) u% d& w4 ?! ]; A: D static FourTetris tetris;9 ^ s; N P5 m0 g' |- ]
( W4 M! y4 Q# H+ Ktetris.InitPos();
$ M" |/ n5 ?# `0 v# O7 ] return & tetris;
9 C) @1 \( }/ t- n) s$ `% C( s; R" u! V8 T
}
* @9 R, a2 D, m: I. {; C
2 x# p. p N8 L6 X- c+ {
" Z+ R- n7 K, `3 f. \( L* o
2 u; V, W- \' p. rTetris* CreateFiveTetris()
' e: y8 D8 Q. u d5 E- d+ _! a' `2 h$ ^ G9 N
{" ^! |2 ?' b6 J w& c5 I
static FiveTetris tetris;
% _' B. w) _' G& e
1 J9 x! R' C+ n- Etetris.InitPos();
! }; o& Q9 ? H4 a+ C: w5 [ return & tetris;
6 W2 B; @& k# a3 Z% B1 }# a& d2 O- X! O! L2 o+ o1 c% a. _- _) _
}: x f" y4 e1 p& T4 J
9 M9 U7 f3 X+ x6 r5 \$ _2 G8 h5 C1 l7 u# U; i6 f
Tetris* CreateSixTetris()9 F2 z( [4 R3 X' h; O+ m
4 ^+ j! C4 ? k6 r; H{
* B, a7 U2 J8 i( i$ u. z& A5 y static SixTetris tetris;5 s3 Y/ n( D" D4 z3 m4 }! ]
: w+ a. }5 O" m
tetris.InitPos();
6 v/ b( k2 t0 D! i7 Y( i return & tetris;" ]' d% _; T5 F5 ^! _
# I! J2 e+ a) O/ K' s: Y
}
0 r- x( D3 {# b/ K9 q2 E" O
/ z2 I' `' t4 }/ J, k( q! ~1 o( G
0 s, S. q K2 i1 i6 v1 {8 W
2 L1 U7 u) [2 N! D1 V! Q% ~
Tetris* CreateSevenTetris()6 u) B% y# B" Z3 M/ B5 \% L# }2 b
4 E* b% A. C5 A P& a8 [
{ K- E& b; ^) }% M1 }
static SevenTetris tetris;
) o3 a u( n! x% Y
# n" X+ ^- t' F3 ]% T2 L1 Vtetris.InitPos();( h! J% ~; y/ _6 ?: P$ l
return & tetris;
' h* y# S: {- ]; [, D- h8 ~7 q2 Q' ~/ d K: R' q- S/ z
}
( w+ ]- i" h8 w; p 5 a' f u2 `7 j9 a+ I7 a, b! I
private:
& d1 E3 A& y9 L- q " o% p z0 }2 }; z* X
typedef Tetris*(TetrisFactory::*PMA)();
* }+ a" V! H; q2 Y* r u/ t* R# {, o/ k2 E2 F
std::map<char,PMA> m_sel2TetrisMap;" \( A( d9 p0 S6 c; b
3 {; `0 N4 S2 }; V6 t$ L+ F
8 n% u2 Y2 N4 i5 [) E; z% Q1 w: q
};5 ^: Z7 C6 Y" W) ^* f
3 f7 Z! F) Y- _) f+ Q& l6 F9 ~
有兴趣的朋友可以下下来改改玩玩。* l, U. j% V' C3 L! G
- @9 {3 {" z! O) ?1 d3 m5 @: b2 aThat’s all!
6 Q0 \: w3 [7 Q& N! ^# j # l- _0 s+ U" R5 G0 d
Peter
4 o2 I- n+ W9 z, @
! O! D0 c' l: T" o- X) G( n! _[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|