|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
v% x$ S0 R& E2 x* D图 1
- e6 o' J5 Q0 r( @0 Y- ~* E3 y完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:# Y/ P0 r2 V& ]" a/ b
% |, o4 c* C# V, v, [8 c. f
) r2 N( G$ E# u& n! i1 bFactory的code如下:
! k2 }+ M. J0 X- O , _* d7 O; o. ~& B9 o2 M' l! ^0 W
/*************************************4 o1 O* c# \1 B6 }
8 U5 \( m* r% J: u5 X5 X G* author:hgf_starlovecpp@hotmail.com
4 T' ~( z5 k2 ^$ \& f( g" X% {- w/ H& I7 m1 j1 H
* version:1.09 r8 ?" A5 U! t! z: q# \, S% h
) _1 G0 l7 l' g- g4 j( w% d* description: just for fun
7 m) b7 H4 T/ g- I4 R' T
5 i2 G. x6 z2 h+ s6 ~* todo: hard code exists need to fixed( C9 F- C! K& I" K3 I
) w8 Z* y- s0 f% _4 I
**************************************/; a* } ?7 K* M' N) q1 n% a
) p2 T8 D# M( N9 E0 B) `1 U#pragma once: ]( f& o7 Q, F- R
#include <map>
) M2 g2 ^# i4 S& h+ k$ {3 ]" E#include "Tetris.h"
! C/ D: c6 Q2 P: E* h* y) A2 y#include "OneTetris.h"
' i" |, X6 R9 P0 d L9 U#include "TwoTetris.h"3 H% D: v0 \! c+ a% ]8 D3 P7 C
#include "ThreeTetris.h") G- X0 ^# N% k: N
#include "FourTetris.h"0 U' W$ b/ z B8 m( s6 c4 I
#include "FiveTetris.h"
3 F- @ ?* X- M0 M' p% ^' ~#include "SixTetris.h"
; |: M# m8 k7 N) I4 p, M8 J#include "SevenTetris.h"6 N$ l/ j, j" A
' F* s6 |! M3 ^% w* D, l# G
class TetrisFactory
$ a5 [" q' N9 h( M" ?% k{) x% I$ S# d# |' v s
public:
: c1 Q; ?/ {% J/ Q, C3 p
' h& l+ r# U7 v$ s* B2 c+ Z& U& u# W4 w5 Z9 Y' t" Z
TetrisFactory(void)
+ S* ]: O9 B: f/ M& S1 C- s7 v, s7 h, X5 i' n: G% V8 s8 v0 i @
{
9 }# P- R2 i5 I9 ^ Q
6 ^" \3 \# D" x/ D% W p: Bm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;( |9 @- V0 b) _
$ U6 a5 R# ~& T1 e# s; mm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
! w4 ?7 ]# O# Z$ F$ g. ?+ n- r/ f
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;4 j7 y3 s# h3 |# w% m* c
; V( I( P' e: v' ^5 |' |8 R
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
4 k# d+ {& L3 f2 Z! f& v9 ?) G/ P" e4 B z6 H P! Z2 K2 V
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;* g7 L" v* U3 Y. _
; U8 B. t6 |3 a2 s; m2 L
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
# \* R& T% A$ P
( E0 q% y& ^) h+ `; rm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
' k9 D B9 L5 T7 r' Z6 j7 ]
% p, R" m9 W9 r4 s* s: l' B- u}$ \/ n9 P, C; G- [( j' L
public:$ Z( x0 G# u w3 ^2 P
4 }" b2 Q4 ~7 L2 P: e
9 Q) M: V5 T1 V" a! u" @* o
~TetrisFactory(void)9 x) {: m0 M4 d. y9 K' {
s. L ]3 ?0 x. q3 \
{
. t, s2 T1 O- {* M. ?/ x( ]* m9 i0 w) l! ?5 c; u
}+ i2 l# z: k7 U$ L+ b5 C# P
( E' ^# `2 n* m) ]3 E! ~+ g
Tetris* CreateTetris(char sel)! t+ D+ l9 K7 S
/ W6 x5 V4 Y1 }2 `! B5 O5 e9 u{
+ h' \* S# x9 T- M0 ^' q5 n3 U return (this->*(m_sel2TetrisMap.find(sel)->second))();
" x& @3 |6 L7 Z
" M1 n1 z Q5 X6 j9 H# F}4 W1 c& {! k, i/ h
private:) o: M' ]$ Z+ k- Q1 M1 l2 [
/ I5 ~1 u" E- B! B
8 a* J4 M$ u# t( P1 S: }1 J: O7 V7 f! V4 Q! T
Tetris* CreateOneTetris()
4 P( T8 f, ?. F8 L, f& s; F
% R4 L: a* S# ?5 { b5 @{
8 I8 N7 l& R% m3 v* H" x& ]% g& o static OneTetris tetris;
, a+ T# U1 A" Y8 x& U6 V9 }$ e8 n5 V3 w! k- {1 F8 R7 y: `+ \/ z
tetris.InitPos();
/ }6 V4 T% R2 k0 \ return & tetris;
% W7 Y1 t, @+ J# i$ }( q* L! V/ {; O/ }) A/ @' |% v
}
- j9 \8 I0 t& O/ ?0 ~$ U1 r3 @, i: \& ^. I4 j( E
) c+ [" l, X$ I& S' A& ^. x9 H, m" H
9 Z4 F: i- ]) R% b& c LTetris* CreateTwoTetris()
: t) s2 g3 _- G6 @- \+ B) i1 |5 u4 _; a) w; d; Y
{2 `4 i6 R7 H! }2 d6 }
static TwoTetris tetris;
0 m4 R! X" A' ~8 V, L, k# G7 ]* l1 l8 p& _! r
tetris.InitPos();
. b0 z- s' S% y2 @* h9 D return & tetris;* a; W( q$ r8 x- A: k
) \' y6 X& u' M: d0 P}
: w1 X! J+ V+ R* l+ p
, \- n! W- D, R3 k1 I+ @2 H x# R e2 R3 W3 }4 N
- o, J# {* `5 o6 ], V
Tetris* CreateThreeTetris()' l2 J7 T8 s. H. o: E
+ B- l' X+ M% I2 R' W{
9 k/ `& `- X4 ~2 ^& P static ThreeTetris tetris;" N1 m# b9 ?& A i# f
/ x- a. D6 T2 x& W, dtetris.InitPos();3 i" Q! |0 S3 d+ f+ K0 D" F2 \ p
; z# X; k* L& [" G4 G( `8 O! R' Z, }
return & tetris;
* M0 V& M E. S$ q B- b
5 y5 |; T. p4 L1 _) q+ x, _' w$ _}
+ D) G3 X) A$ s! h. p0 v5 s7 @! r/ u% l
" R# U6 [9 g- ~2 A( }/ Z3 p0 p
/ j; `; c' I# T' j$ N5 Z- qTetris* CreateFourTetris()
- [ A1 C1 l# o2 M9 h- L6 w, R& |( n) a) l/ u
{
7 }. n+ _0 F2 @5 d; ^ static FourTetris tetris;1 m) Y: u9 m) W H) x
' d d. n2 [0 S2 U) u
tetris.InitPos();
: _( b+ @/ U3 _( U4 O return & tetris;. N. T8 E6 v0 U k: R" i* s
0 v* p% K* @) h2 L% n: z ^
}
! J, }( M( _: O$ {( u/ X+ e
+ C! w& [0 z3 H2 q1 ~% \" G* T) D8 X8 J
- R& K# G+ _" ?+ r% |% J3 w, V2 e- s
Tetris* CreateFiveTetris()- W( u: i7 u0 \, E
' L/ k2 c! x/ {8 o8 a% d
{
/ J7 ^" x3 e$ b/ y/ H+ Z' L- z5 A! \0 Y static FiveTetris tetris;8 `0 B4 O; z! t4 w
, e% y* R$ Z( Q( Y& k
tetris.InitPos();/ E y8 U. A- \* D! u5 j6 f
return & tetris;
6 L2 k/ t/ I9 a2 C3 P$ C
9 G( i+ O' q0 M+ U, @8 s- I}
7 ?9 p+ [8 T* y ) m. @# s$ z) k* Y3 A
1 U! Z+ F( M. I3 \- f( C0 A7 q2 TTetris* CreateSixTetris()
% I" [/ ?- W( C1 o( b2 c5 {
# P- q3 R0 Y! |{
2 K8 h" {" R, h" I static SixTetris tetris;2 U$ f$ _% O: z( j( G& d
" K: e) S( I; D8 _% R# e
tetris.InitPos();
! c- X5 _$ O8 L. n; F* o3 w& E. v3 B return & tetris;3 z, w W' B+ A& C
4 R+ d1 c! }; c}
/ I; `9 O$ |' y1 q1 w4 Z9 H: A " H0 h \1 D, ]" @7 [. K+ e+ e
7 ^$ p! B" r; h1 X6 B
7 N$ h2 ]) a& B, v9 f8 X& J
* P* W8 o$ a+ C( ]% Q& @0 KTetris* CreateSevenTetris()' ~# q2 c# s7 m( K( w! P6 c& s
% S* R1 k5 V: ]% N6 C{+ [# E8 k$ h6 |" V6 `
static SevenTetris tetris;: t4 C" x9 n0 t% x9 V+ q$ p1 k' I
) @+ R' z: A$ S/ K7 M/ e/ K& F/ U0 F* j* Wtetris.InitPos();
% O* Q) g/ {. U! @. f+ `4 c6 Q: \ return & tetris;
, J+ K/ d5 Y! W. M, v O
! l6 u0 [" I& ?' }}
& o! F5 h: r. g7 K; ^% X* ` 5 e# l- q% ^, l( n4 u
private:
( m6 W. v$ r9 B) k ( o" ~- |/ T1 w" o
typedef Tetris*(TetrisFactory::*PMA)();
% t4 p- w+ D+ Z7 E; T% Y( a9 ~
6 e% ~# B; \0 {. p2 Nstd::map<char,PMA> m_sel2TetrisMap;6 T: C' j; L; L x* ^3 }/ K1 t7 w
! J$ z/ V7 V5 g3 h. ]
- Y$ Y; p8 ^/ [) s, r};
! _# o2 o$ W: J % h' F$ F9 J# c5 x! f
有兴趣的朋友可以下下来改改玩玩。
" y- t) g }4 s# @. z, z B: l+ S5 g+ N, b
That’s all!
$ C2 C0 F# u! } ) J) u2 p; o* E B9 I
Peter 0 \2 p0 C6 r) d1 _9 C
9 G- ^# ~0 i' j* Z1 s8 s[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|