|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: " C( v% B- c/ m+ W) F, O( Q
图 18 ?8 m, I7 ]" ^8 F
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
! L7 l8 ~3 N9 O, D& Y4 u
; V$ F9 W4 n7 p0 W6 @& r+ w5 J( K: `( b, h; ~) F2 Y' C* ~. e( L
Factory的code如下:
4 X0 w# Z/ E+ \/ U% y P+ L , I, V4 m1 \1 p! z/ J- e8 |0 Q0 r
/*************************************; L, ^0 b4 S) U# U, @, ]) I% x
" w$ d$ z- m; u! |: K- t8 D
* author:hgf_starlovecpp@hotmail.com5 h6 K- H) C* e: d9 e0 U* M
! D" R2 R; a1 j" B. A, [* version:1.04 z% U& x. e- f3 T! ?8 S
" ~' B% N' w/ [0 e
* description: just for fun
0 E3 V; G4 h/ S) e
+ M6 ^. _1 s, J- ^* todo: hard code exists need to fixed9 N, G# x$ v+ F- N; J
6 x: H( ~/ F. |+ b, U. T**************************************/
2 O. s8 ?( q" O" b; U ; L: C5 p0 e4 C; @4 ?. R# C
#pragma once
7 P/ Y/ ~3 P+ n8 S; W1 f- r3 P" U#include <map>& g; F( n+ f4 u% h7 X( ^
#include "Tetris.h", F4 f4 @' K7 e# q& F- P! L
#include "OneTetris.h"- M D3 g; `* j) O; \
#include "TwoTetris.h"
' d i( Y; {( m3 x' W, r#include "ThreeTetris.h"# c4 n$ _1 v+ P
#include "FourTetris.h"
8 i1 \5 m/ y2 J b9 Y! s2 Z#include "FiveTetris.h"
% s! u; @& X m- r#include "SixTetris.h"
( i, U( ^# ?5 H+ ~% Y. O1 L#include "SevenTetris.h"3 g Z1 u1 }0 \, o9 y
S1 q S H# a$ m. lclass TetrisFactory0 d7 l4 y& v7 ^1 x6 f
{( I5 a' N& h8 I# m0 h& l
public:1 K# F2 r+ a) C3 p. R1 _
* T7 f; R) L7 {; y; e; O3 q1 k4 n+ P5 o* W j
TetrisFactory(void); J1 |& Y( h/ l1 A! p' n
- r2 U ` Z \/ e- i{
7 w4 t+ v$ S K' j" {6 E
0 v5 a( d) e6 F& \- o. O1 k8 G7 n m( {m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
5 b. q: m8 S4 A& n2 b, H, e4 i$ `+ J }. u) ^
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;, Q5 ? g: j% p5 f v
, R) i- B% F. O7 L7 z/ k. \ H- x* gm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
* X, [, ^9 Y% X9 ^; ~% a) E" C0 q3 _9 w9 e0 l" ]
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
/ C0 T; A/ d& \
# |; o6 ^& M" W! u% @m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;; N6 p9 a/ t4 A
6 x, E" p" d% g7 C/ Y
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;7 u: z# f1 c: Y
: g2 O7 N) S" _8 J+ f
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
) M1 l9 W/ @3 e6 ~+ k1 L) m& v) ]& A+ f: r! _; X* I$ k
}
( ?/ }/ ?- x* [! H3 C8 Upublic:
/ [( M8 `4 ?0 z6 U3 O% y ! E, b/ b* f0 { t$ o
+ L% v; {1 S0 t4 H# G w% A) P% d" C
~TetrisFactory(void)
# D6 b0 `& q6 |# ^" n2 ?0 P$ V; T: I$ ?
{
2 V9 Y$ A: q5 J* U! W
- N' p, e, ?) |- d$ s}; ]/ ~, s0 ]( a( E9 N
: I G0 u: K n& f. OTetris* CreateTetris(char sel)9 i8 a l- D2 ?, e' ~
8 C, |2 \% b+ B{
7 _$ u& }" D' U. b return (this->*(m_sel2TetrisMap.find(sel)->second))();3 q4 y# b( g) h
+ b$ Y+ l3 e A# f}1 z4 B4 x; S) G& r8 W
private:7 \" ~, p9 W9 f4 d; ~. ]
2 ^) V8 u: k7 R/ t
3 ^5 }+ U/ N4 J2 a% l' B @, ]
5 \1 ?2 F" w1 jTetris* CreateOneTetris()7 m0 o# R+ i2 l7 B: d
) Q# K+ J; P7 o. K
{
' E/ w+ W% ~1 ?5 J, G! r, G9 }2 ^ static OneTetris tetris;. i$ ] ]6 N1 x: k4 a# M. f
& f8 j( q n0 I2 Z$ X( Utetris.InitPos();+ Y6 I/ y0 h$ g2 l% Y
return & tetris;
G* b- k: E2 k# }$ b, H5 c6 D# q1 |
4 }. ~1 `9 V' m6 F}3 B. O, t: X+ h
: e& A( T# Z, @% x% F" ~/ \, v5 D3 _7 P) r! R* D
8 q+ ~8 {3 |+ W. A
Tetris* CreateTwoTetris()
) _4 k9 G: \$ N" A! t) _+ f& e! Z- z
! l; p* r2 U, p& W* j, G; F- J{$ W9 L) [! v" T) {/ U8 x4 S8 S
static TwoTetris tetris;
2 V0 Z4 V# t. L$ s- Q1 S2 R/ V
0 w. x3 k' t- K A1 H1 i6 btetris.InitPos();
8 _% w! b; D5 S. Q9 ]! I# l return & tetris;
/ `0 k$ {( H$ P9 I& t3 P% P
9 K( {/ w: B6 H4 M L$ F}& _5 l0 }7 j3 O& w- M# O, P
G! j1 @3 Y. [! @; e# ~+ a! `) y" ^8 m: W- ^
4 I; ?* q6 m- m( k n5 {5 b+ \: N
Tetris* CreateThreeTetris()$ W- E6 ?2 m/ [/ z+ z. r) b+ V9 x1 i5 A
6 g9 L# X0 V; o* b- J5 N; o
{, E6 S& n8 b' j% D# M8 L
static ThreeTetris tetris;. y) V3 l5 p' f2 i$ ?, @, T9 U
8 X' a; L. }3 C d
tetris.InitPos();2 l. K; i7 F2 x( {" M4 x
/ X9 W4 h/ n- n$ |! v) y0 t1 X* q) F; \' o d3 _4 w: I) Z
return & tetris;4 D% n% D$ L' A4 d+ k( O. W2 h
* f3 T! M" {3 Q, ]) C}
! `4 n5 U. ]8 i8 d
$ X7 O, O: t# m2 A; L$ b: v3 C5 B4 b: q
2 E; ~$ z5 d" W+ E/ S: Y
Tetris* CreateFourTetris()
$ r6 X7 a" @$ N* N" B3 U' O, g1 j; N: X
{' F2 _9 f# j Q2 d
static FourTetris tetris;
5 |0 F& r( V% L, |- I: j0 D9 H d& D6 \% n
tetris.InitPos();
3 b! V) j( f' |. R. U7 ], y- a R) P return & tetris;; V7 X! P1 G8 O$ S3 m
3 m' ^: W9 s1 I6 G+ g: b8 j
}
( W! @) f. `, f9 D/ v2 a- {5 i7 T. C3 g* |& Q6 y
7 F' H" X/ r1 O. ^( _
. l' {/ i3 Y* {! R# kTetris* CreateFiveTetris()
5 [7 \/ l9 h" ~; \- u7 c& a( q0 y( j; [
{
- Q/ u% ~, a3 ^4 R& C6 V static FiveTetris tetris;
$ k2 M( O: S6 i4 F/ @& I! @/ a ^( {3 n" G
tetris.InitPos();
/ u0 l/ \1 R2 { return & tetris;
6 \( h: F" f/ X# ]. d- Z
' ~- e7 X) x( q; I0 {$ h' a% S}7 g0 z8 Y& }2 n4 j6 k6 o
5 V$ g2 I5 O8 r7 t7 \8 c$ g' k
0 X! [$ N Q! z" H5 hTetris* CreateSixTetris()3 v* }) g1 M( L6 }- |: D+ N9 m
; s" K1 c: b1 {4 V5 g; Z" T, r$ o+ Y3 y
{9 V! J( A6 q4 `6 |! Z- y8 a
static SixTetris tetris;
( ~. Z/ D3 f* q; ~9 I* t% F/ T! C+ x1 F
tetris.InitPos();! a% g* G6 v7 O Z6 N! f% w0 C/ s
return & tetris;
6 n; `% }% ?7 Z* d) |% ]
; p' I7 S, `' t: C! k& ?}
$ X+ E; k; O+ b. q" k/ e3 l ' w& Y7 s- n& X# w9 z" F/ r
6 O' S6 k. ^' } l
+ f% s. p9 V+ s8 M% H' \
4 u% j. A/ E3 z; D( u RTetris* CreateSevenTetris(), y( \# D+ x' S" T- e
' ^, u4 ]" j7 z) |' j{
" ?' ~* p1 e# i( y8 ]; e. u static SevenTetris tetris;: u" E5 O2 Y* o! @$ |4 \( ~! q
& x" J+ B+ k# o, }) @tetris.InitPos();
7 Y; h& l9 h' w8 @ return & tetris;
/ h0 N# t! a8 f7 M4 I, H6 n
+ G4 Y6 m" p* k. f1 b9 N$ M}4 g* z6 L* z4 s8 }/ ` H' ]( |
9 U3 E, a* u4 @5 D4 t
private:4 x6 A! j& _+ N
# Y$ Y+ p+ `& a' k typedef Tetris*(TetrisFactory::*PMA)();6 b9 w) I& z1 c/ g) B3 I# t
0 H. R" ?! v) m; l
std::map<char,PMA> m_sel2TetrisMap;
' w& z! p( q/ j9 D" o% E
: r) [2 ?4 _+ C' b" B. p9 ]8 C" q
};
7 C% Y T2 h) _2 Y* O! b 1 t/ }* F$ _2 C" O2 G- G6 ^
有兴趣的朋友可以下下来改改玩玩。& t: f9 h" k1 w V. U
2 @: n; e2 b) g8 n _. @That’s all!
3 e' J0 V# e4 E5 D& t; T 3 C/ E( L- g, q1 L7 k$ D6 N5 ?
Peter * i. y' y1 D: O) s
9 N2 \; g% ?* {/ M- f! A[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|