|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: $ k6 ^9 Y! i! a+ `
图 15 X6 y: B' {9 t9 U
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:; O7 ~$ Q% Q, ^4 R* F3 [9 Y- |6 n
( Z' b; R1 M/ H, o6 o7 A+ I: y! r r, R- u
Factory的code如下:
& q) ?) C Q; T" a' h
2 d0 i& ^# n3 `1 _5 `3 B/*************************************; _. f+ \# A7 j9 w C
5 s- y. d- p, D. R J7 e z2 Z* author:hgf_starlovecpp@hotmail.com* B8 Z$ m2 [ `
- [ ^3 H! g! G/ z# @
* version:1.0( q8 r2 w/ Q/ a) c( s! K
8 T/ f8 g; B: U6 Y! B) Y( h3 @& M" E0 W
* description: just for fun
2 f& X- D1 ]3 i- t. r. @; |; q% y ]% i7 ?6 D% P
* todo: hard code exists need to fixed
4 t* {( K* q8 d4 A/ [( s
5 `- K+ P. l2 `" N* K9 \! E$ e/ K# d**************************************/
4 R! a- w3 [: S1 j5 |0 y" j + G2 h; `9 v; @4 Q2 G0 t- m5 B
#pragma once
/ ?( t1 i+ M) N$ I) G' r7 @#include <map>6 C. E4 f% }3 x' t {- F
#include "Tetris.h"
3 h6 i( g, B, ?1 q4 J2 n#include "OneTetris.h"
# O* v. X+ L3 l! z#include "TwoTetris.h"
) c3 s, G5 B( c0 L$ x5 b* B#include "ThreeTetris.h"
& _. z" g7 d& ~. v#include "FourTetris.h"/ L4 \% r4 U% z9 U) A6 c! W; S
#include "FiveTetris.h"0 w1 z3 B5 ?# B+ @
#include "SixTetris.h"! H. E- A- a* C+ p6 ?3 P# a
#include "SevenTetris.h"
5 N9 j4 A2 b+ y& p, K0 ]
+ @& C* L( g1 Y- M" E7 Zclass TetrisFactory
3 [# b) U8 m3 f) S' u. b" u{+ _ M5 w* L: P9 d
public:2 j) m; P& I2 Q4 l" i2 _" n
; N% e% e+ s$ Z9 X r* d# {! [- w2 d0 v& }1 `! _) y" j' a* M0 m% e. G
TetrisFactory(void)0 ~, M$ n6 p! T. S6 l/ C* g" F0 q9 u
/ l0 B& I. N+ d: k9 _( P{
) m1 Z! Z6 Q' M0 b7 {6 Q+ {% ]8 n' a' O. B! U( a' e1 w( m+ ^
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;" q& T; W, i1 L
; r6 F1 M* n" Sm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
( x" S( V* B" k4 p* I) D; y* S# T5 B3 X
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
2 i% H6 K/ E0 C+ X- v; Y Q( U( c/ o2 `
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;! E: z. r8 `( J* l& D: `9 X
1 b; w0 ~! r8 h9 F0 g% ?* fm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;9 A1 M2 t! Y% ^8 F3 ^
1 Q! y& Z9 ^! M; |5 _2 Im_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
: `, G9 H3 z1 b {, u
" U0 r6 x+ \& E* T1 B7 zm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
6 |- n8 A( K7 G& ^/ o
3 l; K$ S8 f# U- E% D3 o}. ` u* @1 b5 }% q: L0 j
public:
" U* z: T- p+ z4 u q
& V( a! N. x) Q* L" V! G8 i( O }7 H6 ~5 s/ o9 q% X" W8 u' z
~TetrisFactory(void)
2 G. g# ^$ t$ `4 q# \3 a: r
7 e, c( W7 D1 T* W0 }. i{
; P5 g/ N2 ?& A
H1 C7 T1 N, T}
: W0 ~( R& q3 N$ n% k
' i8 e2 \! _, s/ }& D7 T7 x6 rTetris* CreateTetris(char sel)) b8 E6 x% P1 [$ I7 f4 p2 f: M
0 s" i0 u, F+ ]0 l
{
' J# ]6 _& T# A4 a3 ~! p return (this->*(m_sel2TetrisMap.find(sel)->second))();7 r$ {$ a- C& h
0 n2 w9 c1 o) t; i
}: E- d' ^1 u; D5 c Y
private:
8 x) K& f( V1 v
- y& r/ {, t' p8 ?% ~/ T& ]8 P6 u6 y
: A* c8 ]0 d8 M4 o
Tetris* CreateOneTetris()
1 F: j& q7 c2 T5 X) e$ w3 x& x3 g& x' K2 T) \: C
{
$ V* `3 `3 _3 |1 G* {; x static OneTetris tetris;
) q9 ]$ ^$ H! F
9 {0 P( m- T6 j& \ utetris.InitPos();
) O' }8 v2 u1 e% I% V6 q n* ?( T return & tetris;' J" }4 Q3 c# s; }; u: Y6 a$ y
4 |: S: V/ U( h+ A
}
1 I! h; K4 I- B V! P7 G3 ]# S1 k5 F8 V5 [& h
0 L; w8 M% h! u8 @# r
$ @6 @9 y' k& A! bTetris* CreateTwoTetris()# q" T2 z7 g# o# v6 Z0 W% O
/ g' }7 f( i% b' o9 F ] J{
# C2 I+ }+ L9 I static TwoTetris tetris;3 V7 m3 _' O2 a5 X. Y& e( C
# m0 R4 Z) K+ E& {- g( j: Vtetris.InitPos();
9 t3 z" Y3 G4 ~$ `8 b return & tetris;& @. i( V W4 n, r
! b. m5 [" X8 d( k1 B1 Q" g* U9 U}4 O6 c4 B. e" X+ E' U" o# `$ K
/ s9 Z8 c( Q7 \6 {: y% j( A0 y
; \* P' d- t4 e2 Z% D6 r) m4 C4 j" p: z2 ]# ?$ z' w
Tetris* CreateThreeTetris()' r4 n8 S; U6 Y. i8 `1 r: O
( L) q& {. }# Y/ {1 a{
) D* l) Y% u9 ]8 { [ Y static ThreeTetris tetris;
% p- b3 g& l# [ D! [( y0 W' l, t( C
% U1 [ b$ ?* ntetris.InitPos();
; s8 @& ]. y. {4 `$ i3 r; K. R
, K' d# _6 t7 i# D- s/ n
, Z1 ^3 A7 T( Z: O4 W9 \2 xreturn & tetris;+ ] R( R0 K7 e
/ S! l3 q# d$ ?0 b}
" a9 f7 Q0 k1 T3 h, X
+ C* k" O' B v5 m& k2 l
! B1 G3 s4 Q; E/ u2 [! t4 U: k. I
Tetris* CreateFourTetris(), x5 E4 }% R, q7 a6 {1 {) E9 u1 ]
2 g- O8 S. H9 o z$ T# M. p
{0 C" @4 O t( M# @
static FourTetris tetris;0 g2 Y8 M" c! r; q
7 z$ L% p/ t5 P: B, xtetris.InitPos();/ Q) `# l* i g+ r8 @: _# g
return & tetris;
% w+ A' }- u5 _; w0 S3 |
8 K3 E" { X1 R' e6 K6 b}) n* D3 d8 n& }
; \7 M6 m$ v# f
- N8 O0 _' s9 P( m/ s8 z( B* b/ h8 k
Tetris* CreateFiveTetris()
: N/ `' [) o9 q/ u7 _% z/ n) K& s1 p
{
( r2 X8 I7 K$ a" @1 U static FiveTetris tetris;/ Z u+ M# T6 b1 Y* _4 A* i& Z
( t2 ?8 M# R( t0 @; x. C4 btetris.InitPos();
, j# R# K4 a& ]3 } return & tetris;0 [' _ f a- ~
- @+ J+ O# I) `4 M1 j
}1 O, g9 x3 G6 i9 D* q+ z6 m
) c ~9 Q: t! s+ t' W
: p; p+ I8 X) _6 [
Tetris* CreateSixTetris()3 E5 J$ c/ f: ~+ a
Z- v% P: ~( A4 F) \- y5 S
{, s- c. c. K4 ^3 \6 O
static SixTetris tetris;' t* N6 }5 c4 J% ^
- g2 [' b f( B" mtetris.InitPos();
+ o! u$ l- s9 c* E) I9 H5 e6 K# q return & tetris;
# @( h' R1 r+ ~; Y1 v) A: m& z* y- ?- T4 @! q4 Z0 l
}- M- ?7 v+ c, Z$ g* B3 L/ s
1 L2 V: r6 J3 C% P q
; ]0 Z7 w9 f) @# V) Z" R+ v
" }+ J6 v" K9 o5 k
s- h- [. s& W: o/ sTetris* CreateSevenTetris()
4 E9 H; g" E' T4 J7 M$ C' L7 L) L+ g1 C5 |
{, o6 a }% A w% ]+ n6 j. T- E
static SevenTetris tetris;
/ N+ R% c+ K% y3 y I5 t0 R5 f; e$ p; V* p: x8 |2 D4 H
tetris.InitPos();: L. g+ L2 c0 a& o
return & tetris;
U( t) X* {9 |' {" g
- m/ T6 v% I4 C+ Y}" b+ X& f: r# @: F
3 {- _& G# k: b5 @) x8 s Jprivate:
d, k+ ]& n, H6 U' t* W + o' b$ i0 B f/ j2 j! v, L+ e
typedef Tetris*(TetrisFactory::*PMA)();$ e! b' J. d/ s }* h
% T B6 r8 X+ G
std::map<char,PMA> m_sel2TetrisMap;3 w# Q I2 S4 i5 M+ e
& c" q, r6 l' Z/ Y3 L s
/ W4 r2 l5 a- y! m# i$ x};
% T: B6 L5 L, ]! ~ " _+ `9 `; U7 M+ A7 N
有兴趣的朋友可以下下来改改玩玩。* J5 D/ v' N& n
0 F0 o) X+ r2 x- K4 {9 p) x& t# h' e
That’s all!
! p7 z7 p# ]" z5 C" S + k Q! a+ V8 P) D
Peter 8 C+ o4 {5 V5 e7 Z% S
0 `- ?) [% A2 A" ]9 o" F+ l* j
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|