|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
2 x% J! f: g% @, P. ]+ b图 13 _! q3 l) h- h0 t& ]6 z
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
7 L( U3 m. O8 ^0 N1 i* D A
9 E2 f# W8 [( \5 I0 Q6 R4 O( |6 d* \# X/ k
Factory的code如下:# i# f1 f' K- n5 t* c3 c! ^
4 z! P2 e3 c9 J* c4 k
/*************************************
# K3 ?# @3 ^' V" n7 a* a5 m& y. j" }8 @# q; J* V; y
* author:hgf_starlovecpp@hotmail.com
8 |* R% U! s! `& K2 r+ Q) U2 s: V) D- u4 O2 G
* version:1.0
4 }6 ]6 Z1 q2 `+ {
% s' d& v. Z. `: y$ X5 Q3 P! `* description: just for fun
% i2 z* g0 U- T J. S* I f* A; r2 c c- T2 \. V
* todo: hard code exists need to fixed
( P+ L8 u# w' v& p9 R+ k W" a4 ?4 J. R" U. `- p
**************************************/
( T; q g5 y+ i 6 [8 Z2 U# [7 P6 p
#pragma once6 A& [8 u! ^% u) y$ E' F+ G: z& z
#include <map>+ d/ r |4 D: Q; z8 M
#include "Tetris.h"
- m( j7 k4 t' E' I% Y#include "OneTetris.h"
; w: n0 t8 j2 Z& Q+ M& i6 ?2 _3 w#include "TwoTetris.h"
1 J* k L! u. X, q5 c2 F#include "ThreeTetris.h"
( Z5 o4 q* B8 f" V: m! i#include "FourTetris.h"
3 D5 c3 l+ K# V#include "FiveTetris.h"
( y+ J: U- S* G( d3 K7 U% X/ I' T#include "SixTetris.h") p$ x. S! R! q8 W/ ~
#include "SevenTetris.h"1 s3 M+ Q% }6 X6 d/ Z; B
# L# s5 {8 J: @; ^; @& u
class TetrisFactory
. t5 e) N l+ ]" m' Z; V7 h{6 G9 J* n0 N5 A: r0 n
public:- ]7 T# O3 @2 ]( t, Y. {
M6 _8 T* L z
q i L9 d vTetrisFactory(void)
. X' C, |; o: d6 y" O2 y# ]3 l0 F7 f' V3 }3 m9 M L' O, B: m
{
& `6 i( v! w$ T5 e t) [. s$ O# I& S* x$ L( R6 E
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;0 P: r# V& e; R% @& x: W4 r
+ s6 T0 u( M3 O) r$ ^8 e
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;9 S- {, N' R) |$ u, j/ A
3 u+ J7 d* W3 d% t$ L/ _m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;5 n4 k) F! w6 w
, A4 e8 a0 G* s; d. N5 `3 I* i# [
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;+ a* b0 D8 F- b: D; @" U
& M# M# h8 C/ p! |9 B& X$ \m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;, T. N5 W* ^& b9 M3 R' D
* J: X4 f" H/ C. @m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
' O2 r7 t3 O. D& c9 s3 J S) }/ A+ s" j+ X. b
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;# B# z: w7 c! x0 I$ C, F
y6 d2 v- F4 t9 F3 p3 m2 [
}
. Z [0 S( R) L9 r+ m1 ~public:
8 E& @* z2 y# v1 ^7 E! J; t( W
: ]7 r( L) ~0 u; m) s+ o2 J- e/ t. E! ~0 L, {$ E
~TetrisFactory(void)$ ]) k1 D1 f3 }
( M8 t& g$ N/ K. m
{
/ z1 A/ f2 C8 ]2 `( C D& V0 G$ |7 d
}8 U8 q I3 A0 V' c* v8 Y
3 b/ M7 `( Z+ p/ {# p1 lTetris* CreateTetris(char sel)
+ m+ Q7 h) i1 s* S; U: o) m+ Q* M) J( z9 J, T D# w4 m
{
2 E8 `: |3 w5 t, t8 s. F return (this->*(m_sel2TetrisMap.find(sel)->second))();3 C0 H: M( E4 a" f
) k; ~5 |0 E' l( r; K+ h7 ~}8 ^) T) u0 `, T$ f: m
private:+ `. E* V C4 Q3 u
9 G; S' B% T6 P, c4 d. o
( u4 ]$ _& J6 `- w- Q; X* `5 N5 g2 d7 Y
Tetris* CreateOneTetris(); f) C0 r2 }3 k4 X z2 E& X
: e* Y5 o! ~8 E{
( X) C Z$ f+ U/ | static OneTetris tetris;$ ~- H; [4 Y$ p% v
8 M0 S& p! q9 H R6 \ M
tetris.InitPos();& j. p/ e. ^2 E/ \! p
return & tetris;( _. A) a5 s8 b
9 Q+ \+ H$ @% m5 |4 J5 ]% _}
0 V" y1 z/ h- w- } D& x2 p4 x0 J `6 n! _
. O9 q0 N9 C& C- P" T4 f' o5 N( d# }
9 j4 c, x) _( B+ UTetris* CreateTwoTetris()
/ W* J* |1 N: T1 D* K3 ?0 A* _; n
{
6 G y) J: [* i# Q5 r static TwoTetris tetris;1 u8 E( W+ n; U/ s
' T" Q4 I, Y0 Ctetris.InitPos();
. q8 T3 U1 \& z, U) I% V( X$ F return & tetris;
! n. h& ^* g6 h: `, ?- d% g/ C+ y# V, C6 i, G. @
}
$ I- @ d5 y3 `4 }
8 j7 U/ ^2 p- ]; u, U
* \( a+ |, g% S6 k8 w* m6 w2 N& `# U. d. @. M% k
Tetris* CreateThreeTetris()! [/ M' D: }5 p9 b) v
: D8 O! l* L* s" h2 E. `6 P7 r2 u{
- z- m) l' Y' m" I0 k3 d: S" H static ThreeTetris tetris;( m$ ?3 n2 g N* j! y; b2 Y7 y" I
5 t: r' c( l$ d! m2 jtetris.InitPos();9 k2 `5 e% H- t1 h. C) _
) G0 g5 P& n2 N! H6 {
/ S1 Y4 i' P7 r
return & tetris;" E* |4 @/ s9 N
* W7 j; g* f# B8 o) F
}
R. h1 z$ x/ v! z R9 ^. i7 W
8 S }" z7 A0 y6 T8 [
6 u- T5 b! E7 Q, r4 Q8 C% {4 {
* q) z. G' X0 p5 ~Tetris* CreateFourTetris(); [# u, }; u4 y* Y
2 d# o) M% T9 A+ k0 Z3 a$ j3 q{" f' |/ K9 A0 n: d" g
static FourTetris tetris;
N0 w1 u% m! w0 l
! P4 a; _1 E" Xtetris.InitPos();1 Z; Y: V, M, ~6 Y+ D+ l. T6 h
return & tetris;, a0 l$ D# j/ t% V
' w# D' T. w: q8 }9 K, ~( {: L}
4 |! p- p9 ~! C) ?" x/ B5 A7 @9 K& q9 H t" E' M5 M0 ]
8 [0 {' M7 O' [9 g* o4 B) Y% y4 a7 [/ K* J; q8 [" f
Tetris* CreateFiveTetris()* n# D4 U+ x3 |0 T* C
` }& T+ c C5 X" `6 z3 n
{! T: ]% g/ x5 n
static FiveTetris tetris;" A1 C# n( C1 y5 p1 F$ A Q* K
( s# J5 N, h! h0 T
tetris.InitPos();
6 G' h2 C$ s% W return & tetris;
& i9 m3 Y0 I2 e3 Y# o" s' ?3 y/ \7 _1 E* \; w: c5 @& r* N
}
& B) c# `/ S! r& D
/ [: ~0 N- i3 b- m( H5 [
; Y% q4 J# e8 |# j) z$ |Tetris* CreateSixTetris()
) T4 F9 f9 g. E+ s _( `( t9 W1 w5 Z- t4 Q6 Y
{
% v+ q' I( ^, l static SixTetris tetris;6 z5 i$ g& }& c" c$ b5 C @
) ^& e/ U) Z: s# Z1 r" x" ~& F3 ptetris.InitPos();
& F9 y$ Z; N" c return & tetris;
6 L* V8 m; S$ P' T' i; C. J$ |- V) o- h) I2 ?; _
}
+ Y( k8 Y ]8 ?4 ]3 C# S
* y! p1 K% w. y7 e2 k5 }1 `
& ^) ]& `2 p+ J$ O! L* u% s f: v7 D, d* K
" a- ?& x1 G- W9 N
Tetris* CreateSevenTetris()' G& i+ O# E% W: O: j
, ~6 R1 ]' W& L w7 m* j{4 P- V! Z& f$ N" c4 C
static SevenTetris tetris;7 m) |7 o {) w
: J( y: H/ R2 s3 Ptetris.InitPos();( x- B# K# I+ v8 O
return & tetris;8 x; t' {* d4 ~) _9 b
% ?: y3 B P, n% V9 |3 M
}
2 D! q; I* \* [3 ?8 O1 j- E: y }5 i/ }0 Q. ]# A
private:
. i$ X9 w. U) N" g, V
& e2 k0 D% O& ?, i# z* L/ o typedef Tetris*(TetrisFactory::*PMA)();$ c" t7 j2 k ]
1 \' k* u' b$ Z7 Rstd::map<char,PMA> m_sel2TetrisMap;
7 D/ v- ^- J! u$ ^' q/ x) v+ h9 @' L; t# s( W0 ?! s8 n
/ g4 H1 e+ M3 d};( I$ U$ {# ^7 S
* V9 D% _2 J# b$ e2 s y. y" H6 M有兴趣的朋友可以下下来改改玩玩。9 ?0 h6 P: v$ ]# p! E
/ \6 ?! q" F* d# W6 E+ MThat’s all!# `0 F& \* |" F k- f
0 g) w; K. ~( k C
Peter ( O w" S9 h7 f# y# u7 o
- D$ Y) `; ~6 K6 r[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|