|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: % m! J) F9 z9 N& ^" M9 G" F
图 1
1 k4 w/ X5 D2 G: l; Z" c {5 r完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:/ Y0 D) W) u4 O# Y# s2 [' B
5 P& H6 a* C, I
# C2 F, E! w( d' q7 }- BFactory的code如下:, e, L3 B! I) C& L) |. k
_! |: ]+ E X- b3 j: T/ d
/*************************************
6 J+ S0 u/ ~% W$ D3 `' g1 z! ]
4 {& h. `- k2 |* author:hgf_starlovecpp@hotmail.com. c9 _3 o; m' M
: G5 {3 o0 Q# ~$ j/ `2 z! l) k0 N
* version:1.0
+ ?. W- K) @$ t& u/ H
3 a& `8 S5 |$ z% \5 s$ I3 |* description: just for fun
% c4 o w0 ^0 V+ x/ V5 d* Z# W+ L2 K/ V* C# A1 f; k5 Q3 E: h6 q
* todo: hard code exists need to fixed. ]- h0 h) t; r8 ~1 O3 S7 {
4 C" x" ]) g! M+ s2 N- z
**************************************/
" }: D8 C6 Z( Q
- E7 p- o7 I5 d' O: u9 M( r#pragma once
* y# X- P8 j; x2 I1 f, d#include <map>& B9 n& g( e: \' ^- G0 h- U5 O
#include "Tetris.h"
: p* x2 V$ z- X& T9 q2 I, x; W' `#include "OneTetris.h"
9 b. M2 [$ [6 q) h2 s+ x' W) t#include "TwoTetris.h"$ r) X8 c) c! Q/ a* f
#include "ThreeTetris.h"! O. m7 u$ S0 @0 D4 I) {9 \/ z
#include "FourTetris.h"
/ h6 u4 n( {, f#include "FiveTetris.h"
$ `4 T; M' D+ k7 d4 X#include "SixTetris.h"
* L6 C' `: n- v; k! O#include "SevenTetris.h"+ R, q U+ Z- e1 i5 ]
8 Q# r- X0 P& Z9 f3 H, `
class TetrisFactory
' P4 s) b9 t5 _{
% V. r8 x. T$ p5 g' j, y+ spublic:
8 k7 b- M6 h0 w6 |) e * g) E7 V8 z* U `. Z8 y- A- X9 m8 x9 r
; `. b5 N. Q0 K+ W) W; l
TetrisFactory(void)* R$ a* n3 o, m1 `# ~1 T/ y
9 ^, e* K9 f& r/ i# @
{
% V8 H1 C6 N5 |1 b# q7 O
- z" |. h$ q6 R& v* y) R1 W+ b) x: `m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
4 ^; @2 K1 ^" U! T3 u+ ~, u4 G/ s# u6 y: i
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris; F) X3 k# p' o0 H5 p; P( }1 [
2 G* Y. G: B: Z( M) a, }m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
, q, N$ Z8 {$ e6 V& z* _7 h; c9 C- ?+ D' ]
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
& B" C+ @/ [7 \8 ^1 ^1 S% n
0 V3 G0 l+ k5 Z1 T: }& Vm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;! U6 \1 |2 M* T/ y! O1 [
, `2 v# Z% Y6 W, }
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
" v8 L$ m/ w( ^- P0 R2 v' K6 Z$ N; }6 ]+ Q# S
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;0 W2 ]' ~ e6 k7 T( {( y+ h9 m1 P
6 R& c# p, a d7 s0 s m
}
3 P) P/ j. w7 }9 Tpublic:
$ f% U5 j, D* C$ ~- R7 }" w1 [
& G( I1 `) |# z6 k. z7 K3 w( K
~TetrisFactory(void)
0 j4 n# v% B8 ~. m, q. U
' T* T5 K7 E% S# b{8 z9 r& ~: O0 h& u
7 B" q& i* s$ E$ ?}6 R; q& c4 Y: Z; I* z5 M
0 f: P4 f" `8 Q- d' ~Tetris* CreateTetris(char sel)
% P8 T2 K, I" D* V
% U1 M( q$ K$ e+ ?+ m( Q{
/ K9 U4 S/ L9 w- C6 o return (this->*(m_sel2TetrisMap.find(sel)->second))();
7 k2 C: Z) z9 T n$ H% ?& p% T! E& p7 G- V
}
' U- ]) {$ j6 |% t" ~private:
3 t! F* |7 ^: w0 V U* l5 e2 C2 U- c6 A! a3 g3 F
9 |5 ]- z* S9 j2 l
# T& a+ Q+ k5 zTetris* CreateOneTetris()! L8 T! Q0 K/ |' H0 `, `
6 |* D6 s# l E: I% ?
{
/ _, f: z+ ?& ~+ c static OneTetris tetris;
% [! \9 x' s5 \7 y8 ^% {8 Z0 y$ k# R* k# L: I2 o: U2 Q
tetris.InitPos();5 ]; i/ J4 l2 W' N" v" ?% h
return & tetris;
# b# _& l- D' l6 @; V6 Z" l$ Y U* a4 E/ G4 o6 {9 s) P# k
}7 f0 ~6 l1 T! Z( q# Y! e# e
u4 Q% o1 ?! X
5 j: X9 r& i& E& m7 H8 h% S7 H* R% K' }- f+ C
Tetris* CreateTwoTetris()
4 L) }8 l1 J3 V v
. f3 c' X. G8 m f{
U- Z y( f4 g# [7 O' [+ a9 e- { static TwoTetris tetris;6 Q+ z0 d/ n+ F7 z+ B0 Z
; }* n8 m! w& s' d$ Y
tetris.InitPos();9 G, Y# {9 z W& W/ w7 }: b& W# c
return & tetris;# ~! c4 n0 d1 }
7 z7 Y8 l1 k8 l5 Y8 U) @2 z}
- Y: E7 |7 B. W0 i: o% R, ^# S% r
/ q! W/ N; ~. c ^# J& z
2 k/ n; G- E/ l7 z; l) ~* A: U- Z* t6 R) ?
Tetris* CreateThreeTetris()+ ?( K2 J3 c* `
# R$ x+ }: e' A7 D
{
3 W1 `1 l5 ], z" Y1 z+ D: M+ Y static ThreeTetris tetris;
% m o8 A$ b2 P/ v3 T# o5 _4 G1 m; \" `
tetris.InitPos();
# C7 O/ d: f, B* w
+ x+ a4 h# i* A0 N% H2 O3 d
4 L( Y1 R% `3 i) W4 m# ^return & tetris;
: E. S- x7 K8 O0 c, S
7 U# P! d0 c# j# }, N4 O}
% B0 Z, I5 B* N& M
! |* T# n. i6 `6 u# J) p
0 ~2 ~, Q4 _& D+ |1 k1 [- R: q6 H; Y: T) y/ G/ b5 r
Tetris* CreateFourTetris()
# S& i5 u3 L7 |8 [0 \6 l$ z; ~
6 [3 Q( N4 T: d1 x- B4 i) S m{
) K- F: r8 P; L* {% _; @; E$ z static FourTetris tetris;; {% G( v' Q: d- F
5 X! ?8 C4 A& v2 _8 ]
tetris.InitPos();% [: K- w+ @" N+ R( J0 J
return & tetris;: F. L) o$ H3 m1 @/ h* [6 v
6 z2 s5 F5 {) Q' L0 i1 X( ~8 d
}
, ?' v% Q. T4 B& u' `' k: p8 o% K+ F$ p% Y
& @9 P; R. N4 _' C, S1 H
1 _$ M; \ g- e6 ~' U
Tetris* CreateFiveTetris()5 J- r2 S R# C9 _3 W
4 b; ^/ P1 V! y' F/ i& H7 x
{
m8 k7 j! S. L static FiveTetris tetris;
% v% G8 R" D) M# `- N; t% k+ H3 S' W( O! c& ]7 d
tetris.InitPos();8 w1 s% R8 h, X5 A# w. x- _
return & tetris;( R6 l8 Q2 v3 q5 m! T7 ~
( I, U6 ]5 b* S}' P; }) P% W2 r7 @ l1 ]% h/ `
6 ~. N2 X; O$ u; @4 s, N& O+ ^+ h) l" E' c; g* @( o
Tetris* CreateSixTetris()
; M* W9 F' n% e) r- _8 A* d6 H2 h
5 H j" D. @" Z! E3 O7 W{
7 {7 N1 ~( Z1 |6 {8 ^ static SixTetris tetris;
[) ~: W( N% ]5 }- s) n! B$ L! ?5 |2 c, \! n- \
tetris.InitPos();7 P) L* O- n& t* K5 Y% ~
return & tetris;* D8 w9 B2 ^/ b* j
5 ?0 P. j6 [1 o4 U" m9 ^, ^
}: I& z( q: ~# f; e# d+ ?8 G( {
3 k% A7 P1 y* | y* A$ N
. M: ^" N9 n2 R: S3 @- S1 t" g4 T% A
) U; P9 ]5 i5 s! ]& B# J$ r2 @
/ |3 ]5 D! K' C; \2 a* ^. T
Tetris* CreateSevenTetris()
2 ^1 @: K: I9 P
! f0 a, G; Q2 z. o$ t' s{
/ B- g# E6 d- E- u1 s static SevenTetris tetris;- M0 {; Q$ N# G3 Y7 g
' q& Z a; n8 }( G0 Ttetris.InitPos();6 c7 c( J, s, G, Q" k1 R
return & tetris;
7 V' H' H/ I: p# j. \" z" `9 d5 v( C- z/ F, m8 H; O8 j- s6 E
}
" W3 ~. X- e9 ?) |5 j) S4 G
3 o1 d; [# n) x9 `; Xprivate:
9 t9 f; q# Z! B" w, H; m, s# @ ! Y# ^/ [6 v+ S8 \! P
typedef Tetris*(TetrisFactory::*PMA)();$ m& B7 [( f3 \8 k; }
- u3 ~# g A; zstd::map<char,PMA> m_sel2TetrisMap;
1 G0 n5 S8 j* u3 L7 l# R8 @7 Y8 X/ |2 j1 P6 f
1 f; S$ ]% I6 j- m' X1 P
};
2 J1 S5 r/ m' ]
9 y' C# ~0 J/ I" k/ `" p" I' V8 }有兴趣的朋友可以下下来改改玩玩。
0 B, @' i7 o4 V0 c5 x7 E $ B2 q; p" o' p1 i1 @/ ?6 T
That’s all!, s$ k3 K+ d* v) J0 Q& l8 k
( F2 u5 w! X3 G- R; A& }5 H" uPeter ( r! a8 D3 u. K1 E7 I1 o3 @$ U2 c
% K# x. ^, ~, n+ n/ V
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|