|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
$ Q) v3 p7 l1 }! `( }图 10 z+ @4 E# C! d& V% C
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示: e+ U6 p$ }1 H& M& I5 ^/ A. B
% T' \9 E+ _1 h
; A; V: O% A! F' ^- sFactory的code如下:
8 I' c8 {0 T. A$ @0 k0 {( [6 X 4 U$ `7 V. @2 x' n7 c
/*************************************
$ f0 ]) M0 s# ]$ _" U- Z4 ~. Z
( F: t$ o X% v$ l% T. D! S* author:hgf_starlovecpp@hotmail.com9 y# P m- _+ ]( Y& |4 {& F' g
4 A& Q9 ]& n) G9 v7 S1 g4 n* version:1.0
3 I8 m2 {) ?5 K! V) Z9 M9 @
6 L/ W: F& j8 d/ z* description: just for fun N a: ^# @/ P* Q4 ]
* f2 u9 c1 Z/ ?( P1 |$ H0 c
* todo: hard code exists need to fixed; M C- N0 S2 D- ^# f3 m
' b1 J6 _4 ~2 C Y8 Y. o
**************************************/
: o/ t3 L+ Q1 u0 Z, D* B
% d5 y9 D6 Q7 y! G#pragma once- u0 F9 O+ u( Y7 X$ c& }: ]
#include <map>
5 p* n4 h& j1 Y#include "Tetris.h"0 n5 Y. G; O1 R I: H) q
#include "OneTetris.h"
7 h, @0 H# U2 k( T#include "TwoTetris.h"! m/ S) q5 R' M7 s/ }+ n
#include "ThreeTetris.h"
. }! ~! L% I2 y+ x#include "FourTetris.h"
+ m2 y0 n, B5 s( }#include "FiveTetris.h"
' {1 x# a& K6 X: L$ {& {) X+ A#include "SixTetris.h"9 W n7 J" g5 s1 i4 d
#include "SevenTetris.h"2 r! g5 J1 L W. b: Q
; K1 x W$ q4 |4 b4 Oclass TetrisFactory& k1 L) G& S0 O7 _# g! d2 v/ H, t
{
2 i) A6 b" s# n) o6 n+ fpublic:
& a( P; C/ L7 S
( l7 {0 A4 t6 {" P. P! @, |/ d; j1 d+ A! y2 t. s- i) A' U
TetrisFactory(void)
* z( n2 h T9 s% B. A/ O7 D) u* ~" \+ c
{
+ y& I6 ?: G2 l1 N% T9 n: [: a5 \: ~9 |' t) A' d
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
/ W, D$ k# @# [- {$ A* h2 w! A. v5 n& }+ |! }
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
4 S! d: i* j# g% C( S) ]
* ?0 L/ [+ [$ R0 K% }% h+ Rm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
5 W# `1 o" [" L; \, F% z, U0 r
' C) _5 ?2 Y+ l9 ?9 Sm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
+ T Y+ J( ?" ~4 \" q( w4 [7 B( C+ t9 t% F( J/ w
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
7 O8 S2 |( S/ e* F: {" J* |1 \0 [8 _, \' K
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
# H/ `9 \" |. q2 W- c1 V5 d; L( i( s- h+ Z4 R: l
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;& [/ @, c: n2 E, A% v, m
9 ` `9 D, C* M9 O: r}3 A8 M; f, I' |
public:: `) ?' p- f, e, S( k/ x8 `
) [) j Q" X! ^6 v; j3 n% e4 Z+ I
~TetrisFactory(void)
0 `$ B J# u1 O# u1 t. R j
( M4 [9 ` }0 ~{4 A6 q4 _- I$ U8 j
# T& C2 H( M8 j% c& P; g
}6 F( A' Q( p8 D0 f: l7 ?: O6 `
1 e f+ D, g/ }$ J% o
Tetris* CreateTetris(char sel)' M) j; O* ]" Y6 x! q
6 I* d- T; }( u; I, u5 e, f1 }
{$ i. _% `8 L8 I/ C8 f" h8 L+ S
return (this->*(m_sel2TetrisMap.find(sel)->second))();
6 y' z) X! v8 W5 b. \$ W
{% z& N- _3 P1 N6 b9 |} l3 n6 Z9 U/ h0 s
private:
; {, ^8 }" z" |. H' A" E
0 r" c5 H: }+ \2 F! u4 O5 |: X) r3 k" t# z0 }/ g
$ E% z5 M, M/ O8 {) f7 K) X' lTetris* CreateOneTetris(): z- y2 w0 Y$ j* O& _
! ^8 E( x: d- e& c* V{
, ?; `' f; ` `: }" x static OneTetris tetris;
5 z0 }, z/ s2 F) I/ }# \0 ^: W9 F; I5 b5 A0 h
tetris.InitPos();- J( c* [( m- o( |' g, F# M! @2 p7 n
return & tetris;" _# I' Y$ L S8 m e; {0 Q5 i
7 G1 N& u0 c3 w) g
}) L/ n8 s; @5 s' R6 E# I4 e3 d
2 b5 p/ a, s7 R3 S0 h5 K5 X! w! ?* ^9 q: \
/ `8 Q0 N! E, N" w- J* d2 m! k6 I
Tetris* CreateTwoTetris()
4 C. y" a+ n. u z2 n
0 G( }. N# Z3 J9 W{, t: `# x& {. m7 z" B: {$ H0 r
static TwoTetris tetris;8 B5 z- V ^& l8 h0 @7 f
8 S/ ^# o/ J* H, @; \( s
tetris.InitPos();
1 M$ B$ \; u' W% [7 x: S, ?4 W return & tetris;
( [$ J! p6 s( m$ @7 r& m# E
. k" h$ i8 x/ e+ y2 E}
1 F4 k3 x% o9 x5 q6 H$ H/ O; o: O4 _3 u+ P# u
9 a1 y. p2 S. p) P5 Z7 p
! P* i3 X3 \4 [Tetris* CreateThreeTetris(): s* d! V. D. i: ]' b
9 w1 ~) \2 J0 F+ k
{% r/ h' m4 J$ U1 l0 V; s' K# ?
static ThreeTetris tetris;
d) n+ T: k: U" l# D/ T; g! ^- X, N8 I# V: g& L
tetris.InitPos();
7 e9 R$ g) ~. X& l3 A& u
5 Q5 m9 \, U" m+ K
4 Y, [: A# A- K1 ?return & tetris;
% b" d+ H; D! w& e" P X, k$ `+ [6 ]; X* S0 B8 j; p& D: V# R0 \
}7 H, U# t3 u- [ b" f
; D2 @+ J0 Y& r
/ T8 ?7 d* m3 g% c* F4 V9 @; U
/ N' o; ]( c# f4 T# [2 n6 DTetris* CreateFourTetris()
) Y- U( i( {$ F' f
; A2 ]4 R4 U7 w" x{3 v: |# [* K+ {
static FourTetris tetris;
: ]. G3 l0 O6 F6 Q. e) I) c0 Q; ^9 Q. ?9 [8 n2 e4 y
tetris.InitPos();
- p" ]; Y: e0 O. ~; h5 V6 K3 K return & tetris;
1 d5 I0 J$ E3 V5 r* P& h% ] j1 a2 }5 M
}
+ f$ ~/ o. }2 t; j- |% o
, t+ B1 H( x& T% o6 @7 C9 U7 R
" l5 P# o6 {/ }/ ?& o, A3 u1 j) ]8 t5 d# o
Tetris* CreateFiveTetris()5 j! c4 B. Q) z* _
* l/ h9 U0 ^3 y& r5 u
{6 U" Q u+ f9 L% f; t( A- \( m
static FiveTetris tetris;7 z+ ^& A8 D! |" S; K1 }5 ?5 |& _" D$ b$ ^
* t) f6 T( C& B: Q' i, _' o
tetris.InitPos();
0 n- V4 K/ s/ o% v4 h1 D return & tetris;3 F. z' Z0 m- K2 ]- m6 K
* A# N n" S1 q2 i' i9 d2 G( _, E
}
4 A4 K! G# j' w' b$ _
# I8 W. r/ Z( q& W' g7 y3 F$ i8 Z* [
Tetris* CreateSixTetris(), Z: Q" E, a6 |
* @7 C6 ]/ o1 b! x' K{
3 e! N6 x% C9 T; l. l9 A$ C) O static SixTetris tetris;* S4 t R' Z4 N6 F2 _
. G: o0 E. \- y1 f: S; Z. V; Q$ T
tetris.InitPos();# a; ?6 F$ k# v+ [0 @
return & tetris;) }+ u- E- Y- ^& ]1 m; V
/ k. k2 ?9 z8 n% g5 B! n/ M
}
, d0 Q0 R2 |6 w, R j
) G" d0 d: G; X! c3 A( g4 @
6 U9 _# V1 n5 J& h9 u D8 k3 K5 |3 z! i& Q
" k( V2 t' M" F" Z$ Q- z
Tetris* CreateSevenTetris(): v* P% n0 W$ A& F: p$ V0 R( A% i
1 J9 V# C5 ]+ C+ R( D2 E
{$ `' ]& T( n( x! C
static SevenTetris tetris;3 S! ?& q' c( _/ n$ ]$ b+ G
6 ]+ H$ ]0 ?- y2 q
tetris.InitPos();
2 _* R: l, y; _% p9 \9 ? return & tetris;, I" ^( |5 } Y5 ?5 D0 @' ~
7 o# q `' ?4 w8 J
}
|! {/ l" n. R! I3 j; @5 p6 Z; a * H g3 }7 @% d" M, d
private:
: t% n" U) Y1 i * [! F) I1 z! v. p, ?$ O% K
typedef Tetris*(TetrisFactory::*PMA)();
, c/ R9 ` a( G
+ d Z' w( T6 Q8 S0 J* Xstd::map<char,PMA> m_sel2TetrisMap;+ x+ @1 Y" K! O- Z l
2 a5 N( f6 S$ B5 }. N1 b9 T! ]7 ~. R
};( B- K! y$ Q$ o: n6 _
5 a* K$ b+ r6 j+ Q8 l: |0 m+ i有兴趣的朋友可以下下来改改玩玩。! B w4 G! ~+ r! N
( y, X$ A/ p. U. H! FThat’s all!
) E/ t; k) _! v% p r : j j$ @- z$ N- f P( h" `
Peter * R/ n' z' V% ]0 u' C
5 F l7 a: K/ n! H& N( w, N
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|