|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: & H' }/ R8 X. M# r* f
图 1) M8 ?$ a- A# _* f) W
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:4 N: j; S2 Z) F3 Q9 W3 r O5 g! k
& [. l! m* y6 c; g& D- C
1 n/ M: `/ k( Y" ^+ Y, s& zFactory的code如下:$ L9 P" `. D" z4 l/ ] S
& f' b; M* C. `" h( x* _/*************************************1 r7 {& [; h z, z0 m" V
, _, [: s; x: P6 Q- R
* author:hgf_starlovecpp@hotmail.com
0 c$ H( U# y$ L+ Y: S5 F! e7 E& [% y5 Z
* version:1.0! X: v9 s c/ O3 H7 Y
w, v! `9 j; I* description: just for fun
7 m) w1 |: W( g) v0 Q, t5 w0 w& S( } j& s: ?: w6 \* `' ?
* todo: hard code exists need to fixed
+ R" j0 K& [# d3 C* ^; o! ~
5 t/ J# }$ [+ A6 o8 b8 k0 |* `- x**************************************/
! `* Y8 \6 k. v( ^. `/ ~, @0 A 9 S! x/ k. p* `; B" K( t
#pragma once
9 |0 V* K7 s) A9 J#include <map>
7 l5 X" t* C, O& c/ Y#include "Tetris.h"8 e4 I2 ?& {9 K! d E0 {3 d
#include "OneTetris.h"; o5 g4 O+ |+ j, q- B3 C
#include "TwoTetris.h"
. x$ \9 g5 f. b2 @3 A#include "ThreeTetris.h"
- ~0 o4 B9 I6 Z. M#include "FourTetris.h", w" w( @7 L' e/ R( g
#include "FiveTetris.h"/ m4 S2 Y0 l4 e! y7 l
#include "SixTetris.h"
( ^- b) w# i% ~/ Y#include "SevenTetris.h"
6 q: F# W3 R! M
! q" X+ c% k+ [, O. g) gclass TetrisFactory
* S, o& Q, b( b) y9 Y! }{
6 }6 L2 ]# f0 l, R4 r0 R. Kpublic:
# x' x/ s D7 ]2 Q
2 E9 i5 E1 [7 g' l. c, b
% I% \: O3 X, ITetrisFactory(void)
" q2 Z9 V# N( Y9 U6 T
* `8 u, y9 i: Z! L. P{+ A5 ?% c3 K$ u
0 n6 I& \9 ?) u, G
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;( b* a* l, N' L# A) a
. G4 d0 O6 D2 l: V
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
' t; T3 \; L4 r; v p; c( n5 z. ] _1 _$ f
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;# r, W* C4 X# C' b0 w
3 ~2 O$ J! K5 p5 n$ h; pm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;, h" ?5 x; j; ^$ f- L
# B+ a; f$ N8 Lm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
' a+ M: T2 b2 H( t
' \7 E; s, n2 [/ t& U( qm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris; F' X8 V F& ?# W$ y. o
" Z1 u8 `! |% ^1 \+ B3 [$ om_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
( F* S0 B2 U- r$ j" p9 D8 n2 o5 B% L% C" E1 Q4 a
}# j5 b9 s4 e/ i5 d1 u
public: l/ g0 o" D: W1 A8 t
$ W1 t; b9 K9 [* Z) e9 N/ C; N5 p4 x4 ?8 H) t. C8 h q/ a
~TetrisFactory(void)
8 U8 H" i; {; D, c! d$ V" U# u
! i- l1 u6 H8 y% @* z' f{
- `3 J& j9 p& ~0 [
1 C- M1 e0 f @1 s" E}! g$ }+ B% u3 l
( m( U# P% U g8 C" |
Tetris* CreateTetris(char sel)
3 N, X; J- O6 x6 o' o2 w0 O# r1 b9 g4 g( t. D/ I* W0 e+ b# [6 {
{8 R8 D+ f" R7 `* Q9 h
return (this->*(m_sel2TetrisMap.find(sel)->second))();
2 E, i4 D' M. L Y# v0 T# g: _! A( v7 _/ Z
}
# a& t; S* d2 H# ~8 I3 G0 E& [' Aprivate:5 a6 P8 `7 ?5 A/ h: C' `( ?' E
7 S- u/ Z5 k$ o( h9 V2 O/ `0 j5 I7 F6 ?( j: S# A. j
- w' R9 k$ |9 wTetris* CreateOneTetris()4 S6 f) }2 h+ z7 S) j8 Z. ]7 z
: D5 q8 {9 ?! A% X{0 e" b; I5 b* O' f% @5 H% I
static OneTetris tetris;
% M9 m C" Y' Q. w+ e6 U7 m
, D3 o( O9 D. R: a0 Ntetris.InitPos();
; {4 i. r- H: V4 ~ return & tetris;
3 W* w4 F3 c' }* Q& }8 ?
* w" c' B* t/ [% U}
; ~# S n* b4 \* X' Z( ?, k8 C
6 f0 F1 K9 K- G' x' H' L6 [# u" s' j- T
- b8 \9 Q7 {6 A
Tetris* CreateTwoTetris(), l! H% Q- j! K3 K# d _2 N
! d" F" w7 P7 `4 ]4 }& a7 J2 z{
7 {3 N0 J1 I, k* I+ J static TwoTetris tetris;
# l8 I9 U2 ^, _, K( m& K+ I8 C% t/ k
tetris.InitPos();
) P/ A- G+ W7 m8 ^ return & tetris;6 H- R( @3 M0 ^5 ?
* P2 Z. z6 s- s, T1 k}
1 W, n, e8 ~& Q3 x( x2 _0 \! u" _- L' f& x# m! ~
+ G( b2 a. n7 F2 F$ c( p2 I
. s5 e2 Y+ R) \$ q" S ~% UTetris* CreateThreeTetris()
7 s1 j" U3 w2 x+ K* p
" x4 u7 l! M0 ?7 t( t+ v; m- _{% v @2 }& M9 o$ L4 ^5 f
static ThreeTetris tetris;
3 Y1 p1 s0 s& A1 {" D h! w/ G: P
, y: h3 r1 _& o: X8 U' m3 ltetris.InitPos();0 m I( h1 I0 `: s6 G& n5 j
7 s$ |+ p% e1 v9 c
5 w0 v! _$ q- N% S- X0 p
return & tetris;) k: o0 B, l7 Z" B
$ g3 d$ V& G& \& T+ t) |}: A& U1 y5 g" a
7 q- i! y* Y/ v0 O) ]7 b! V; b
% s( Z& w6 C9 E4 I! o+ l/ k4 Q, a: s) M) J
Tetris* CreateFourTetris()
' V/ v, l' y( E8 L. q
% y4 F8 l; g4 Q! z# Y4 S( `/ f{$ f7 Z# X$ P: G& N& [2 V7 p
static FourTetris tetris;
+ q. S {7 f' g, Y5 W( h# j) {1 R8 K5 o' t/ | n* x$ @$ I- w {
tetris.InitPos(); I% X x% W2 j: R' m, R
return & tetris;
& |5 x/ c& L' T G& s' w. O( C3 {, Z$ i1 @6 k, ?0 ]
}5 s7 \* o: I8 C4 k: V: V7 g7 k6 H9 Q
3 `( |& m& S5 d
) J# ?3 ]) c9 N; E5 z
7 p% M' A7 h( O2 ZTetris* CreateFiveTetris()" c8 o- M1 R) ~" l B+ Y
4 @& ~9 w4 C$ t1 [{
4 R% q/ S3 w' L, K9 m static FiveTetris tetris;
( O& `/ ]! p9 k+ C! n$ T& T; y6 p: v( X$ ?& N
tetris.InitPos();
: h/ }. N6 b l4 d3 F; s! ]- \ return & tetris;! R: T$ X0 `8 x2 |; m3 c
, I3 ?# r* E5 u" k
}
+ m6 |/ x# x% x 3 ?9 I7 f8 S# j7 k% k6 k5 o
4 F/ M* M7 ^6 G" `1 z
Tetris* CreateSixTetris()$ b/ w' G* B* o
. w# M+ E+ u' f) O( h{
2 d- D! d1 \) W" B static SixTetris tetris;
; \, A1 n7 S8 B$ c. a+ h: _9 O' _- U# p/ `
tetris.InitPos();. j8 Y6 @7 O! h Z" X8 ~, a
return & tetris;
' b5 o: c4 d7 _5 p s
" l4 G3 m8 |# E: @2 z( x5 T7 _& V}4 g! I2 j* _5 U0 L7 i1 \3 x
, t3 f7 f" T0 M7 b5 s$ O
( T( H3 Z$ T2 x( D1 l/ [- a
1 L, u2 f# E2 B+ `% q
7 I5 f( a! p) \. Z3 X* ?Tetris* CreateSevenTetris()3 v; [& P8 r- v6 f
; [; u' i: o% e9 }: c* n
{
4 P6 I+ s1 s; a" s: U static SevenTetris tetris;- g6 d5 i! `5 f+ h5 U' h1 J* _, R' X
! c7 v1 M. _5 A3 h" Ltetris.InitPos();( V6 B; ^' Z: `
return & tetris;
2 `( n d, i0 n4 o
. y/ H! C; u k6 Y' `/ F& J1 m}
, _+ `; l" b% i ! [+ S/ s% O" ]2 e( x' c" N C' F
private:' q' G( c" M6 C
3 u8 d+ K+ x3 S# n5 t' v# w typedef Tetris*(TetrisFactory::*PMA)();
4 l" b5 C. r9 t: p% d. S% N# H+ Q; _. }6 `: K7 p
std::map<char,PMA> m_sel2TetrisMap;
( Y& X. a& U" i c( X. Z0 L- K8 V; ^* c
1 M2 }3 A: m% b2 w
};
5 v9 Q4 ]3 H3 f Z) g) h- } x
$ N/ n; y6 M Q0 S, {有兴趣的朋友可以下下来改改玩玩。& L0 s9 `+ J( N& m1 E
7 A t0 y3 _$ N3 G4 p0 D3 B
That’s all!3 z0 Y' v1 U Z/ ^; @. x4 E3 l
/ N3 S4 P6 R7 V9 P( v- V
Peter
! T# K [2 W8 p( _* s' W- P' a
: M7 s, k$ Y) [( W! E[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|