|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: ' o0 r9 A2 @- H7 w: f1 P8 D
图 1
* ?: c/ j' Q! S. `完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:6 X& U2 h' U4 v( G0 f9 U. R) P
" z% b; Q' B! m6 [' o- A. ] [7 a1 {1 ]8 b( P
Factory的code如下:2 o7 K+ O- N7 o3 _6 {3 b+ K
/ G6 Z' G/ @! A2 D! I
/*************************************
8 s4 T5 M. v4 J- }3 q- p1 @! [3 L" H% ]: Y' M0 F
* author:hgf_starlovecpp@hotmail.com
) s/ W! F# O) i0 I+ L8 H i' e8 n, ]; V, [
* version:1.0
5 L5 Y: h* X) R9 M9 v7 ?5 G# e8 o! b$ B1 ]' f# z p! p
* description: just for fun" [/ V% V/ r4 D9 U
3 t8 J" t+ o( x- |# l
* todo: hard code exists need to fixed: ~& g3 g0 ^) ]
2 v5 _; [' f# D; h5 F' ~
**************************************/
9 K4 F8 _0 p6 g1 m% i$ E% n : E: B I2 ~4 m+ ]% |7 E r
#pragma once
9 T% C! K! l( D# U0 V% r#include <map># s- V2 m' P+ Q4 A: |" h
#include "Tetris.h"% g) @! U, W; y0 w# e$ f
#include "OneTetris.h"
% G% y/ B/ h+ o, F" B$ ]# \" ]#include "TwoTetris.h"! E: E3 S! b- P3 ]! Y
#include "ThreeTetris.h"+ H3 E" j: j% {( |& r7 D
#include "FourTetris.h"
/ F. t9 I: U* ~0 `2 [: O#include "FiveTetris.h"
+ ?/ X) s7 ]: @3 h#include "SixTetris.h"
- w% k+ J$ ]' W6 y. r#include "SevenTetris.h"
8 H) L6 P3 H/ }+ Q( w& M- }
: [' B0 l7 c0 E+ ]1 S' @$ oclass TetrisFactory
& G( P& x2 U, _$ ~{. v; N$ I4 X3 [$ d! U
public:
) v! W, S) p3 ~" a4 ^( X- o 2 n$ U/ A0 |, }
0 q/ W: C. J! `- l. x' \TetrisFactory(void)- j" Y* S" U/ G1 |. \. T% n2 P. V
6 a' N" q% K1 q" x1 c4 _% s5 ]
{
3 j1 F1 Z+ u. f, t- P% k4 h; Y( d
0 S# _& F9 z; J% N' [m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
5 q5 T3 j+ m9 H
7 L9 D. P0 O- [( T+ Hm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris; ?4 ]0 h7 Y8 i
1 y2 e: b& ~: f- G& qm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
6 F- J& x/ w8 a, R- q, U# Y8 v2 z8 v' ~- T( R' P: M
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;( Q# D( F+ w+ q! U/ Q3 Q5 H6 v+ U; A
% S" ^) o9 Z1 E }# ]
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;9 q+ d* Q; u/ `# P$ ?) t. j0 f" _' c
3 p& O! p% z* X: D
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;: U; ?; k) k$ H. j. P2 ]
5 G7 s S% g+ n9 m8 r
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;4 p$ y+ U1 Q/ ]" d" D
' r) n5 u0 E+ ]0 ?. H- `
}/ L" R& n9 l8 J' e# ^( g
public:
7 k' D- r* B3 B: G
. s d4 ?4 X. b1 j- o; F$ ^8 ^& a2 \/ k7 w3 Z/ I
~TetrisFactory(void)0 ]( \5 D% Z/ s) l/ r3 m
; [8 N% `8 x2 O; P/ j8 V5 R! l) J{
' _, G" l8 O( m0 ^
5 u) Q6 b$ T$ K6 G; S# K) O0 w}- q" k7 b. ]+ w- i' d
. w- r- m* b/ d& B) g: [Tetris* CreateTetris(char sel)1 D. O+ c8 {, T) f
, ^. J6 W: x% m/ k% W7 J% E0 _1 H( S
{0 v* l, G% _* I2 @' c/ n
return (this->*(m_sel2TetrisMap.find(sel)->second))();
% B+ b" j2 F( h3 V, `4 X( \" a" \4 N; j, W* O
}4 n9 ]# Z2 u3 H! W" l2 k1 I
private:/ n$ N: a4 y; B& x. e
$ i2 k: t: x3 c) m
: q D/ L$ X& K
! Q8 B$ m3 E, F3 }1 u% X9 J# ~Tetris* CreateOneTetris()
* H8 ]- {7 E6 w$ C& Q5 L% y
) h" y' A/ }3 M' @{
& F: S/ K% f2 l/ g0 @ static OneTetris tetris;
' o. a! |4 v: @) X, D; h. H+ m% x3 B! v
, S0 V( I: {- z3 k3 ctetris.InitPos();
) o/ C- A; X& |, _9 k; d/ L* X return & tetris;
/ U: }. [1 b% R. g+ u4 z1 e+ s1 y- ]/ J g: H! w
}
& ~+ k/ v1 Q, g y
/ P1 D8 M, z/ S( P7 z
" B6 ?, Y, f- D
/ I2 E H& c! G% S( w" z) c3 i8 R8 QTetris* CreateTwoTetris()
& E4 P# { Y3 u; Z& A+ f: a: X- M7 c4 R. S; G3 l
{8 o, V: Z6 R% h* i8 h
static TwoTetris tetris;
, Z9 R- k: B# |" q
- e- T+ O7 \0 R' ^; mtetris.InitPos();# R( B) W- W" Q4 m% {1 q3 }0 ]
return & tetris;& m! {! |. {1 g) w
( _: g5 N: \/ R' f
}6 y+ C/ I, w" e! E! e; ]& h
4 R. N, f2 j+ ?$ T3 I! g
/ X) r2 l! ^$ {1 G6 r2 x, l2 H0 R" E
Tetris* CreateThreeTetris()
l7 e6 O- V) t2 p6 E: N9 w
: M7 o( {! w; W4 w' n1 W{, u2 |' ^& P) V. W/ X6 P5 T/ n0 N% k8 Z
static ThreeTetris tetris;5 {8 D, I1 V% a
1 N; @/ N# x4 O% _' ]& ?8 [tetris.InitPos();
: t& [/ J3 B0 G3 G7 V
7 Y9 S7 F# l. G& h, f4 X# X) P9 @5 o) {. y
return & tetris;
9 A: ]: j* N7 s+ }" ^% T/ e/ U8 I
4 U% y& n! K$ T3 _ W! D( W}
% ]3 W% Q. p% ?- l9 P6 g( S+ ^" s, X4 i; o- _: J) x! J0 }% w( F
5 L/ j1 x2 ~& O4 I9 `$ g" o
, P: n* N! @' l+ ?' m2 DTetris* CreateFourTetris()6 \4 M! B+ y+ E9 K: d" i
, |' L6 q. G4 O+ C. R
{* H! M& y5 q5 V9 W% k* j6 C5 G
static FourTetris tetris;
/ K$ R7 ?6 m) C- I) L7 L, F# R1 {# `. `
. s6 U+ f9 k: H8 z5 W" Xtetris.InitPos();8 b& v) w# C C" v0 ` P: u2 {8 W+ [
return & tetris;
0 i [, n' r5 J" m8 y1 O
# Q0 w" w1 Y0 \$ P+ y}
1 t2 c7 D' a. @1 y' e. ~# g6 [/ s
8 @4 k& h ^5 W1 u+ ]- a8 x- b o( l! G- T6 S
Tetris* CreateFiveTetris(); E3 d( C0 I1 K% B* E1 z
& m/ l# b% `" T9 y
{2 u/ p! ?) C8 f& n Z
static FiveTetris tetris;- ]* _/ h3 [7 l# ^' N7 n! h
( j3 Z( z" R6 y9 [9 c6 l; u
tetris.InitPos();
& y' Q% f1 D2 |3 c return & tetris;* u- |4 U2 Z: d0 H) C/ D8 L- G7 L0 c
* y* W$ K# w9 R( H: D' |5 G}
- q# v# K2 S1 e0 z, ?' v& w 6 ~% ^- ^' o# h4 C6 r1 w
1 l& o# @) f$ L, E4 n$ |/ tTetris* CreateSixTetris()5 d7 e. K$ k& v8 g3 [
/ ]9 o; ^( R9 g4 Y" p) U. V& g3 q
{
7 u5 N2 u0 J, W1 F' H; [ static SixTetris tetris;
5 x A/ D2 u# U( }6 q" x' d L6 Y" z/ z* D
tetris.InitPos();3 z3 E" K0 y; k8 _& m
return & tetris;
/ L- P. f! @9 u9 }; e' g2 L( O' i8 w8 ^ D, i
}
% J E% w* Y/ K5 Y & R q, K$ g, a3 i& D& R
) Z0 t, T) r: C9 p) R
5 }8 h! j% T- q/ W' Y
& G1 c& G+ N e! }' wTetris* CreateSevenTetris()
+ S5 v4 _$ o8 M) `! ^
7 x4 P! ~5 B6 G0 c. |) ~{
8 f! V) o2 u6 u/ h" J7 C8 w& U static SevenTetris tetris;4 {* @( g# x. L3 B) E) i( X
0 o- o0 o- W! I- f8 [4 ]+ rtetris.InitPos();
_: H I, Q: V N4 q5 i return & tetris;
) [8 e- I2 F! K& }8 J: ]' S
* J* s2 J: n6 s& H# p}( Z6 W$ ~; L' D) _- U u
6 {/ r7 Z; E) u' n/ G G. Dprivate:' O% a. r9 |$ F
- b0 r- [4 B) K2 v typedef Tetris*(TetrisFactory::*PMA)();
( n5 x! y1 f+ q `1 J3 V
1 Y) T2 }5 q7 c% Y8 @- t+ Tstd::map<char,PMA> m_sel2TetrisMap;2 }; V7 l3 f9 u- x' L
5 @* y$ w" U o
- M3 \, z! D9 e6 }/ x, v};
* K' k. k8 Y$ `1 e" {2 C7 I
* i8 \2 A3 L' F+ I4 i有兴趣的朋友可以下下来改改玩玩。* Q( h+ t* g/ S. K# Q1 i5 ~
' s9 }6 U# L T( J" z( P% n' G7 w, mThat’s all!" V3 t5 P% e {7 I
. o8 ?: l3 L+ c* y6 WPeter
5 q r. _7 y- Y1 i% I- \3 m4 o( ]. \2 ~9 I8 O9 F- x
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|