|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
0 `( ~/ Y# X6 I1 V! `5 j/ b' U图 19 q- w( E- N# h+ }% m2 d/ l4 r' P
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
5 H8 D$ o% Y$ ~ T' E$ K6 d
% M, ^6 x/ J6 }' g5 i! x
9 }6 T) d; D9 r; J' DFactory的code如下:' [9 O9 z' P- k8 s# @7 T6 \" x
]. }2 [) v# G6 r/ u3 V" Z/*************************************
7 E9 N) O7 h m# l- d# n' A+ |$ g/ F, N) ]
* author:hgf_starlovecpp@hotmail.com
$ z2 s7 A8 v' z: |4 F, ]* T& w/ P/ W5 ~, b% ?; X O e
* version:1.0
. j+ f8 F0 r* L
+ N( H% w/ v, K) v7 `! L* description: just for fun( h I, I1 ~. _0 W
2 H& U9 w# J8 v0 R A3 F/ \
* todo: hard code exists need to fixed$ M& g6 B0 w# L1 s. N
5 u3 n% g3 }* h0 h; Z; O
**************************************/
3 y+ i% b; F7 o
& F, v! [) {' ~9 a9 W- s#pragma once
1 E# d0 h8 `: t1 {1 f7 ]#include <map>: A: A0 `! a) N/ i- h& @! n
#include "Tetris.h"
% D3 c3 M# B0 n( A#include "OneTetris.h"4 Y* [& w* x7 N( G9 u) D
#include "TwoTetris.h"! ]# \5 \: o, }
#include "ThreeTetris.h"; V) P0 V+ @& v2 m" U4 L: j
#include "FourTetris.h"
( c6 }0 [ V8 q# k#include "FiveTetris.h" g8 z8 x# v4 u& f
#include "SixTetris.h"
6 b5 E u; M s% v2 T0 B9 P#include "SevenTetris.h"3 g% c; K a" ^& s& v9 p
3 t) X/ K2 q/ ^! c% T3 K
class TetrisFactory
* M& t" U6 g$ i5 R# H{
: p5 d$ |) ?3 ]5 P& K: Bpublic:
1 l4 y" d5 v! {2 Q* B3 E ! x4 Z. I" ]3 @
* j. R5 y$ |' B9 G4 c
TetrisFactory(void) o/ x1 P& B- l" l8 P( f/ w
. n6 n& [+ \9 {5 B; } ?+ G& S
{$ Z) J9 z1 ]6 H. e% C
" u3 }9 h) q1 h7 F, o1 ym_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
' b4 a0 Y/ Q; d1 C( K- `" O, B2 u
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
) s( u3 T2 P$ j* f6 [! }; F
$ A- m6 k, B# W. n) Xm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;6 L4 d6 E% Y8 R
/ \1 A0 {9 Y2 Q3 l; I8 ~
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
; t/ W. Q9 D4 D4 C: `0 l
; w: B/ B: o3 L* K% a! Tm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;; _8 U7 Q) s* ~ r" e
5 w3 [% t! u V6 N, L0 gm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
5 W( J, `5 Y% k: J& W0 g% s/ J! \- E
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
- V! x* H& c' D* W+ q) K% z; a* Y" B k" ~
}. T3 P( Q1 {. t6 s: Y2 A! S
public:2 B2 [7 r( ?: H
2 u; g6 m0 n: H! e' O2 ]9 l6 c6 @- c# A6 j4 c" t% ~6 x
~TetrisFactory(void)# u. I: ^% A i0 N
& v" I. y& [1 P8 b{9 n9 d+ U& i9 d+ V* l
% j7 z. Y0 {+ B$ e
}
5 h7 @2 H7 O1 W) @8 `. ]: S. n/ V }9 \0 x1 O9 s4 m! i
Tetris* CreateTetris(char sel)
: ]$ J& x4 p ]! I, h9 H- P
! ^( H# z2 r$ H( ~* i9 [* P{+ p- s2 H5 c+ S5 _# U, c' u
return (this->*(m_sel2TetrisMap.find(sel)->second))();$ f, V; [ {7 B* U0 P$ Q
2 P7 ^/ Q- T+ w}# A* \$ q, l7 L ~# L+ p/ Q& S
private:3 {' E' L' g# X* G X
8 q9 j2 O& b/ @1 O2 f2 k
0 q3 I4 \0 Y8 W/ N4 s# m* [6 n# w' W" d {' [" a; K
Tetris* CreateOneTetris()4 A! I" t" u: j* {1 Q* Q( m
: R' d( v6 R: ?4 M' ?; G$ ?6 [7 B% o{! ~" H. b0 C. a8 ^
static OneTetris tetris;9 [; V) E" _4 t- j! d7 I+ V; w. y2 E
' L* H7 z: l3 ^: B
tetris.InitPos();
0 u9 Q8 _3 k/ x# i1 K; ]2 i$ w return & tetris;5 P4 G6 M& O" O* Q. e* h
- ~6 N1 u$ p6 F; C' P! J' s8 j}& K" \* l! t9 v1 O" l; M
7 n% u6 A, d3 j; b% T5 I
, a2 Q9 C/ w* t
5 W' o' W; z0 N
Tetris* CreateTwoTetris()$ ~3 f1 ]+ }$ Q! l& W
& g4 @% U+ T" i6 z
{, O6 O/ ~( x: `" e
static TwoTetris tetris;& a" s+ t: Z& n
* O$ S3 n" ?3 R% B; c
tetris.InitPos();4 x8 G' n6 Z: ` h$ w% k
return & tetris;
7 b; P, V& v% F8 q9 e
) R/ E3 s# ~& _& E4 z& v/ N}
5 ?; {6 b' h9 X+ G# ` E8 k
& ^- D4 M) ^ }- K: C7 L. |% ]- u- |& k* `
; w1 D+ r+ p2 PTetris* CreateThreeTetris()
- l4 F: }# O; M# L
# I) Y) \0 Z8 c5 X7 G" Y$ H{
: p5 m! k# z/ S# @3 d& E! j0 B2 _ static ThreeTetris tetris;
: y, y, x1 ?! Z) k
3 _- h' x3 l! m' i, n: O+ N9 Wtetris.InitPos();
6 ~' H: e, N9 H' g* ?2 y5 `
! J0 ]7 |/ r8 z3 H! r3 X/ u6 ?, x4 z+ _# u+ C8 u$ V/ a6 y
return & tetris;( E4 U8 C/ l/ s' w3 ^9 E) F! e
0 {, _& X+ n; \) {9 W7 z( K}
& M+ ?, t6 a3 g( j: s* n8 O# s9 N+ @( p5 C/ N
- n9 x, V- `( S. {( ]7 f) B$ F: A
- L% t0 E/ W. g
Tetris* CreateFourTetris()
! _ o: N. z# t; C
& O0 e! f( H$ h! J$ T- ]* p/ U; e{
: K" C6 v0 x0 h6 D% h6 A% N6 [5 t static FourTetris tetris;( z. q0 n' R! `; [& ]+ ]) {6 I
0 J' s0 U8 A& x C! O3 f! ztetris.InitPos();
( I; @ h5 @/ T, | return & tetris;+ g" C" W4 V; t% d3 ~* M& P
$ Z( Y n4 z0 K% k6 i
}
5 _& _6 K8 ?& Y' n! b
5 d1 }8 {# l1 J7 \* ?2 t" \+ m) m+ ~" r* C% i
x8 h4 N$ K( [) N9 G- F& |8 @
Tetris* CreateFiveTetris()1 K( @+ [1 P1 z+ g9 E( n
: t4 d, E( l% C$ K{, b" R0 r* q+ K$ l" L" k5 |+ ]* X1 R
static FiveTetris tetris;2 | _( t) b8 |; Y
% L/ c' V$ l/ X ^- Q' ?
tetris.InitPos();
. N9 V3 h5 z+ z* k% o! ? return & tetris;0 w+ q! m! U( i! C! [5 a# h
% M' U% K/ ~% l) v! E# U}
a0 p$ u& a4 {0 t- w! z W( b4 d2 X. c+ N9 `4 {& Z/ g
# M3 L* s2 c9 _7 E- P
Tetris* CreateSixTetris(); K# f) h. F# M0 ~& G7 \$ m2 Q1 Y
3 A; H" ?, A) A. T4 }
{
- g% M8 d0 ?9 W' [ static SixTetris tetris;) ~0 K8 M4 V0 T& L
) R9 U5 E5 s3 itetris.InitPos();
4 X+ W3 w+ j( ?- D" g; C% C0 X' ^ return & tetris; c' B& G$ j0 R' R8 @$ ^
/ p4 q8 b2 K- V1 d# ^6 r( A7 U( f}
7 p; g, `+ }' X, d# Y$ c 9 V3 U* l( S9 H8 m+ P
% Q+ m) x9 g( R- w) d
9 v, r, y7 N7 ]0 v
8 z. F# ~- q# t) F
Tetris* CreateSevenTetris()% @, ] n4 Y: W: D' A( E9 g# O% M6 [
t. c; _; O; F
{/ `5 ~5 W. ], E
static SevenTetris tetris;
2 U: `2 c8 G8 B8 M8 P6 Y1 G/ S# I+ o9 Z4 I& H; g8 U
tetris.InitPos();
/ ?! ]3 u; {& [; y$ B" N: @7 [$ C return & tetris;
6 c( m ~6 P% f! x5 j( R) A2 H# a$ M( n) E* q
}
# R: |" R3 j& U' `/ [! x . U" G& U0 M! U: Y$ Q5 Y
private:
, G* Z1 @$ Q' t8 q
. @) o+ }# D* i9 L" d$ h: C/ R+ V typedef Tetris*(TetrisFactory::*PMA)();# d2 \# X: I, }* o
) e/ P- d: Q3 P. ~std::map<char,PMA> m_sel2TetrisMap;
. N8 j7 l7 \( {4 p- L2 I
4 A1 v2 S$ j! I. N/ q
% Z% ~! ? n9 U- D+ e+ w};# {3 ]$ _* h m {, P
: x- E! ]2 m) J' Z* s/ x1 N1 Y
有兴趣的朋友可以下下来改改玩玩。( C' ^4 D; D, v" z
, n+ Q6 z! @7 CThat’s all!% B- `* e6 b9 I. r9 _5 \' c+ _
a4 ~1 j+ q% N& A& I* k6 Y1 `
Peter ( I7 H$ M. }! N1 c7 B+ Y
) y* a* ^2 k: g( U
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|