|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
0 i7 m, O ]- j# K+ L J$ P4 V图 1- ]. M# F: k- A2 X; C' y( A7 e
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
3 X' G6 O( n/ u0 z: N& P1 `4 {) i# G9 t- X$ F; T L) k
# s4 M" y' }" \Factory的code如下:
7 Y5 r% d" U @2 @ y$ }8 J
) O( G% _' I5 t5 P0 F; O/*************************************& ?8 b [( z- s
" A) q2 y: F# P Z: p: A1 Q1 m8 E
* author:hgf_starlovecpp@hotmail.com
; G- n: \: Z: F5 L4 I6 S' S& w0 F/ g7 Y4 q4 o
* version:1.0( A( ` R' S3 c8 Z @" n, J
& {! U7 F% Y+ |# {
* description: just for fun
# u7 B% ]% o! A/ m% W2 S0 L9 w. |+ W% u- @1 j5 [$ Z
* todo: hard code exists need to fixed
. A2 V8 R Z. D+ R5 H! x4 R! k) @0 x" ]) i
**************************************/
& q5 n( H5 J+ ^/ a8 ? B. E( A4 q- M( m' n4 {
#pragma once% |+ S7 F8 B, F! I# {! h
#include <map> Y8 G7 ^$ H7 H5 r: \
#include "Tetris.h"
" h6 k1 l7 L, |0 S& L& U#include "OneTetris.h"2 W) }) _$ |2 l n/ H$ Z5 [( ]
#include "TwoTetris.h"
! U: L# v7 M/ S; ^. j9 ]#include "ThreeTetris.h" G2 e3 R R. X
#include "FourTetris.h"
9 x( z+ Y& U" ?8 E#include "FiveTetris.h"
! _ b; U9 @- f0 o#include "SixTetris.h"
8 Y- g+ z( }" M#include "SevenTetris.h"
$ S1 G8 ^: \. q+ f+ L
]2 i- q! ^6 R' ?3 Q. Q6 b, Dclass TetrisFactory" k8 c# ?' w% ]; S" k8 |$ V* r
{
W; g9 n/ j, Upublic:' x8 [& v2 U7 A% v( A1 c
6 j; Y7 s2 s* C. }4 u- A" n$ x
J2 z, G, b7 b/ a/ YTetrisFactory(void)( z5 W9 B$ G: e- i6 G& k1 N
! T) W$ I' z7 N" n( z
{
$ F$ B! c# H8 m L2 z% m: J
' y" }$ J- {4 O: J9 {2 s+ T- Am_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
1 ~* y) ~) k, r6 J% O& |
# \4 ]" J$ o0 t) E2 V- Vm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
0 p& }! T/ ?5 k$ D0 r$ O. ?/ \5 [; Y8 M8 Q8 B: J3 E* z+ L" p5 `
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;/ g! l0 \2 P) k6 I5 c+ Z
0 s5 v. e9 }( ^4 v9 q9 L
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
$ o! a. Y' P0 L U- ~
; p4 v8 d/ r, `: C8 }) R- [m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;' X& Z0 a1 G0 B" G
8 r6 X3 e% ]4 r: Rm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
- R2 K) W; u8 r% o, K0 n! S' n- }% P; Y# v6 w, b, V4 A7 u
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
/ j$ B+ N5 p/ p* K' X8 j; ?2 s4 o5 J
}+ ~7 g. ]4 K" q N
public:, ^5 b" ?% [9 `) j2 s7 v
, k0 m/ B5 P; ~+ T4 h b! S' _& _" B0 }, w, ~- m
~TetrisFactory(void)
3 i! w) F3 O6 {
% m' M8 |3 p# }5 g. i- F{
& b( _/ r- x6 \. C8 P. ^: ~
9 f* C+ E. j" P. ]( }( }}
, P% D/ {6 B' f S+ G- I. m7 _
o. t. Y" l: Z; C L8 v" vTetris* CreateTetris(char sel)
- ]0 C+ ]: X( _/ H. c! r I
- W- @% R7 m0 L. R! Y% C6 o7 Y4 M, J{
9 c7 T7 Q2 H9 M$ e return (this->*(m_sel2TetrisMap.find(sel)->second))();, H( [" |2 f& x# m
! W7 }" \) {: u* d0 r5 L/ F}
* H5 f. d# W# @private:
2 \6 _8 ^0 j+ X- {) M+ _% m5 s* G/ |; q9 a" h c2 K
' x0 I y- P. _8 v8 E# Y+ i7 N+ W) p9 S- ~! q5 o( T6 [: ]3 C
Tetris* CreateOneTetris()
# n) m- E: H6 B b
- K6 q1 w. t: i( z9 t9 d) R{4 j f: R8 E+ k) M# e
static OneTetris tetris;
- i W: I1 N a- {0 T) T5 L) Y% j( `9 K$ u' }4 p& y
tetris.InitPos();- H: W5 W8 j+ l" ^
return & tetris;; W! O6 Y" q0 I' {% Y
) Q) f. ~ p# ~- `9 b}2 {# m. Q1 V. r! d" B
6 W4 o1 o1 c P0 T b% \6 G6 r( t! v& k4 X5 M
' P- z! t9 h$ X/ a3 C4 b. YTetris* CreateTwoTetris()
/ h2 B1 t t4 g O6 w1 F" q, u# m4 w8 A! U! y
{
# E/ [+ ~* \+ l6 Q! g$ y static TwoTetris tetris;
1 Y, m8 ^2 X0 j% D3 J2 f! z! x1 z4 Y9 H4 J1 h
tetris.InitPos();
- `0 ~+ c; S( f; X5 r N return & tetris;1 s3 g' J( j9 K. Q
3 n# u% S B4 P}
8 i- r) m3 s. N8 j
1 d. m9 y$ C/ \- F1 g9 Q! I% l$ {& k* c' T1 a& G
& R$ E) C4 d! |1 @3 y, tTetris* CreateThreeTetris()% W; ?0 b3 ~& I$ I5 I, Y
' P: _1 l4 R- s+ C6 i; Z% B8 `{3 I. Z/ g! }5 D4 f1 ?% o
static ThreeTetris tetris;
* Z+ g0 F+ G0 h1 t6 m+ Q) C7 q1 t2 a$ h8 A9 K& N/ w0 F/ C- I9 A
tetris.InitPos();' M, V4 |4 }; R% }- e7 u4 C
[0 U. j* N; \7 W: u7 |( h' e* E4 U2 L2 A
return & tetris;# y5 g* m/ G3 n" F
) }6 H1 q! P" v3 s1 Y% h# o
}
* j% ?" I) \; X& w! w# D! H5 l
$ ?0 J8 R, x8 X% `/ x9 K1 @& R
. c* z' \# t7 p0 I, N
9 z! Z6 u& e: A3 m5 o& G1 i; XTetris* CreateFourTetris()
; D. |5 ?0 k! Y7 b3 A
9 L9 \9 q; e- A3 j$ ?6 a{7 ?" q2 E$ x) F" O) I# K9 I
static FourTetris tetris;
: I; ^( x9 ^! C. {% U' H" K" ]. w( \" Q3 O" ~8 @2 z) I/ C
tetris.InitPos();- s0 @! w2 ?1 u; S5 l
return & tetris;( j* w& H2 P' U& v6 C" D5 J. D# [$ Y
4 e( z% z) ~( B
}
4 z+ |* s7 A& \( ]6 W6 k$ B1 ~8 L/ v) v& c+ x" O/ t4 A
: V5 v; T6 [% } e; P, v$ E+ L5 h; t! ~+ ~+ W
Tetris* CreateFiveTetris()
2 M: k5 a: i, V8 b! P8 E/ ~
( K9 Z& u' h& |. y; P) c. B{1 n% |( [5 A" G
static FiveTetris tetris;
- H. q2 M: S: N) D {: S
$ K+ \! k1 i# b' O- P! Vtetris.InitPos();& S) d5 W$ h: \/ m4 n9 ~! X
return & tetris;
" O* K, e5 ^8 Q9 r: j V: H! m2 k/ T; c3 F0 D% }' I
}
8 q2 ?" N* U2 Y6 w% Q5 u 3 v; ]7 _+ Y; u! Y% G5 e, e
* f$ p5 B2 Z @2 P- S1 ?Tetris* CreateSixTetris()
, |" H2 A* |( J
; G; h& G6 Q& }3 H- c3 M, w+ G{/ e: M9 a& V S/ }/ }' F
static SixTetris tetris;! I! ]5 w, v6 N% u2 A
: Y1 p4 l3 ?! v; m! Ytetris.InitPos();
9 F. h% u$ n1 {/ e7 b0 ]) X return & tetris;' S# s: H; Z9 D* o7 _* f
+ R5 @7 z. N, o( a
}0 v$ y, a( ~3 t' t9 p3 M
+ K2 M1 Z3 r2 D( ^, o% |+ s
5 w3 _6 v1 U: x' U: n9 n/ j1 ~+ Z1 s& m4 R- r
2 g5 s$ l0 Q7 \2 B9 L% H
Tetris* CreateSevenTetris()3 [/ Q: r) `* g: t* Z
- Y8 @0 M" C1 ~7 S6 s
{! T" `) W2 m7 b7 f" t& j* v8 y6 x% Y
static SevenTetris tetris;, F& ^$ X, [0 _
7 p* y% V7 C" {* F+ |- jtetris.InitPos();2 Q/ d: K j; `. q7 N; A( {
return & tetris;
$ Q ~' ^" X/ S5 y+ E( R4 v, C i @! ?& r4 P
}7 }& z) i( ~+ j' X" x( ?
" G& v5 q$ m0 I6 i$ q2 j* Jprivate:# Y a" r0 ^7 V6 Z
# t3 L, e! |9 G9 A
typedef Tetris*(TetrisFactory::*PMA)();2 ^8 y( T! d( [+ z* T! [& [
% s2 n2 h8 I1 t }! }std::map<char,PMA> m_sel2TetrisMap;9 G( J& H0 z3 o% _; v6 [* f
+ z$ p* I& i9 b3 D, E
* _$ G. M9 ?/ ? z- p9 a% J0 L};7 }& |8 `( O4 X4 R
w) x8 t( K$ G1 f+ _
有兴趣的朋友可以下下来改改玩玩。0 @7 T9 s8 s$ u6 ?
! ]5 w. Q+ z; n8 n+ j. [( rThat’s all!- x6 K* ~) ]( v; d; f
8 J9 U" T* p. u7 e) ]3 {9 Y9 y/ b! sPeter
9 m6 d0 _7 {5 [3 L/ o: g* y9 y2 w4 S/ ~3 y+ R
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|