|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
/ Q) I6 ?, ^; r" ~$ U: @3 Z图 10 d" L1 [. W. B1 |9 b8 T
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:' m& I& \" r, ` L& ~" n& Z6 @
: |' N, N7 _/ C
5 }" X7 F* f- \ `. H( X
Factory的code如下:/ A) {7 n- f. L1 G& Z) a% R
% @% Q9 ]$ j4 L; V. S" M. |9 s/*************************************4 V. ~* b+ B, M/ D
. {8 m& Z0 \, L! t2 c# I" r
* author:hgf_starlovecpp@hotmail.com! }4 X# _: A1 H1 ^/ k
4 p6 y$ }5 u0 m8 J
* version:1.0 \: ]/ I& l/ O/ S1 G" c
7 [; L$ j5 g+ O, |1 F4 ?9 i
* description: just for fun
! d! R* t5 \3 @; |' |% [- K* C s+ d0 K
* todo: hard code exists need to fixed
6 j) n$ P3 f4 y' H+ R d4 O U* C& Z5 P# F% q
**************************************/" W: ^5 m; b2 u8 a
" A4 X1 i5 i# j4 y. ?#pragma once* x3 i# D$ i; W# _
#include <map>
. R# k) H7 K/ A#include "Tetris.h"1 Q7 ], J/ F( G* q# q' L
#include "OneTetris.h"2 i/ {1 v7 H; u+ X" g, Z' |
#include "TwoTetris.h"9 U, v6 T" i7 H! _( @! S3 X( }
#include "ThreeTetris.h"- J$ X0 ~8 ]3 W; {
#include "FourTetris.h"( l9 Y2 C1 z/ {3 }1 b- [9 c$ s
#include "FiveTetris.h"
0 T0 e% L% l* K K/ g0 Z#include "SixTetris.h"
! H$ L0 y( k4 U7 M4 ~3 g6 z( {; [" j#include "SevenTetris.h"
6 l! _0 N. Y( r
$ b, b$ I! K8 Z# t" Zclass TetrisFactory
* Z- W' U8 `, j- C0 g0 o1 [* {{5 z' j- D& B7 Y
public:! g5 O8 w6 I1 v& j% z
3 {, z* _1 ~! T' N7 d% c
" ?# ^8 K* ?) y
TetrisFactory(void)
* Q7 u4 g5 [% n+ j j0 i- |- h' g8 ^$ n6 y. ?
{7 S; Z% ~# A! K& |( _
$ X, y1 [/ G& j6 mm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
* D0 C/ x0 b8 v+ |' a( X2 k' P4 l5 \5 B" f T$ ]6 d2 E, V
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;- F' i. ~! T+ h+ c! W. `) C4 q
0 p- S2 L1 y# ^6 k j# \m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
" p5 c& q# @& K) r/ b4 I1 V, n% O' @1 m, u) B& t4 p
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;6 }- v& I" y9 y, r8 n, B a; r1 z
# ]/ }+ \) D1 }) N. \0 N* u
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;! ?) B- j8 X8 Y% h6 U* |4 O
9 Z) X0 X/ K& @" `' _/ F/ M; U
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;) V- A7 i1 c$ a6 r( F( d9 W9 N
$ v, C3 z. A0 T& }0 U& S; t2 nm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
) I' N) v/ k; x, a/ U- u
1 A4 H* N% \+ V}
, A9 M( q$ b# X0 Q; gpublic:
# q( `' e. ?* _6 z" h + L/ k1 a& U7 ~( x2 C+ _5 Q
$ M! N* ~$ E4 G
~TetrisFactory(void)
, X* l1 F+ I4 W" k6 j' e7 `6 t/ |
7 E: c8 O7 u. X8 {{
8 k' K( E: ]% o6 r3 X3 J
+ r+ S* N5 v; b4 K}9 _+ e) j7 d% K' W* Y9 V
! d6 j! N5 Y2 WTetris* CreateTetris(char sel)
$ Z% k* V7 O! W( R) M [; r8 u" _/ y1 q) e2 g/ H9 f# o
{: x8 M8 E+ A2 P- f, V' d0 z5 E8 M
return (this->*(m_sel2TetrisMap.find(sel)->second))();" N! u. C6 a; ~' ?( Q7 J% c
) {+ ~; |8 q8 }% y9 n5 i. Z
}: f7 a1 K+ a$ x' b
private:
/ E( [7 {6 z1 g, N% ]+ e1 Q9 y
! Y, O) n& v7 \6 m( G% U& u f% q+ l, y; y+ q# \
: t% F6 M8 g6 d4 f1 W4 ~Tetris* CreateOneTetris()
) j. ?* z8 H+ a9 I
R- d" A2 J# P3 r( Q+ D{- i9 L n: _. U7 H9 O" o
static OneTetris tetris;
9 |/ C4 J; j$ B9 G. C* L% P
+ R9 m% C' {2 s0 n8 Otetris.InitPos();
& T! `# z9 c/ Y% H8 \" F. n return & tetris;
" n8 n! l8 l( j: A% S% T8 ?$ M3 ~! f& J1 W7 O) }. B8 u x
}
1 x4 p' W- L$ x4 u. t% }* F$ V0 S& S
4 a9 S# n& Y# Z7 q
$ d4 K, {5 C- y/ OTetris* CreateTwoTetris()
7 w& G: D5 Q) R: |) F$ `( G4 D# P n* `; [% G
{3 _4 d' i C% p6 S5 m$ P
static TwoTetris tetris;
0 U% v& z2 f. I2 y/ z% [; _& Y3 O2 ]1 j
tetris.InitPos();
" B* q, i3 H k$ T return & tetris;
- S. t e8 A( g, \* y, S& V' e$ X
}0 `- S4 s& P5 V) S0 l* M
8 [8 t9 G" j% v, r! j+ I
7 t1 S4 K! z& N; [ F
. O0 A0 `, g6 A9 tTetris* CreateThreeTetris()1 `6 X& d1 p1 f' Q
3 T; n* v1 Z( |& @5 r
{
^/ s# u$ F. |* f w& f static ThreeTetris tetris;
. h3 K# W* B1 u* X# B" G# G8 A2 p$ A3 G% f
tetris.InitPos();
( G; A: G* l4 t1 m. a- x- b. k1 g; T( i: g; w( j& B
: F1 v0 C' |! n) g- n3 I) ?
return & tetris;3 P8 j% y, ^+ R' f/ S* @
( ^1 X0 ^- } o2 J: w
}: y( k7 d1 W; M0 j
7 R* M" r5 F/ f5 e, W' n$ v
( {8 K, X5 V m3 E0 E! q, Z: V, R8 U! i/ q F+ H* [
Tetris* CreateFourTetris()
- i! S9 |6 | L6 @: y' S& A8 P% r/ f' u; ~3 l- e# ~- l; a
{" B) R$ D3 x6 h* m& C7 r
static FourTetris tetris;8 s' o. n& r$ i* u7 ?) C$ Z2 X" f
4 t7 Z* i1 K+ Y- X( g6 Q" C3 x
tetris.InitPos();2 t8 a. w8 I6 H7 C ?
return & tetris;' F" m* |% Q: ~3 E& g+ R& I
: a9 t& {$ k: ?/ O" P, o}; }- o: F; q1 C1 A! {: E! m
: j, b/ u: g N: C) g: T6 K
3 ]. q! V# d6 x$ ?% p' Q( ~
! W8 a$ M9 m. r1 I3 z9 Z
Tetris* CreateFiveTetris(): k0 \ E+ `. ` \4 b& m
+ _; u+ O9 ]6 |0 r
{0 V: q" J/ P' E8 X5 Q
static FiveTetris tetris;* a6 R+ D. H/ h) N8 u6 o, B
9 j9 ^1 ~( g, y
tetris.InitPos();# l6 J/ s1 n {% A! x) k; E
return & tetris;/ [2 @. [; J& T' {
/ u+ M. B# s( o; Z}: b% p3 N) D& P, D* Z& U
r/ U9 T2 w A. P* `- W7 m* T6 E7 T) B$ |3 U
Tetris* CreateSixTetris()
0 I' H' g/ ?/ \: {& p' ?$ W3 p& I' q1 n/ T! _) Q A
{ n$ P) V3 K5 g3 e, n8 }
static SixTetris tetris;! ]( c+ ?5 `2 o* N2 j
/ l' r! r/ _0 G) c% l% v( C `
tetris.InitPos();
% }+ U2 T. B1 P- E return & tetris;
% U, s" z" ?' u; w* V2 m$ E
1 t- x; F9 }! ?- ]! @}% H0 i+ P4 E! r. g
% b- ^7 {8 Y" L% b/ N4 u' u2 \: @- }1 l& f. c
6 x: q* t6 Y6 R
! R4 l5 r! P. E1 V# ~
Tetris* CreateSevenTetris()7 z" R/ s. z8 {
& B4 w. U& H3 s( d
{8 D# g/ H, E# }) Z! m5 a3 V, Q
static SevenTetris tetris;
6 d& Y! t" i- {$ \2 c# v+ I. D m9 D, I1 I+ M" S" U) G/ m# @
tetris.InitPos();2 B4 L# x6 b1 g) f2 L- o. }
return & tetris;
7 @7 a9 y% H+ T* ]# f5 c# X* M3 e$ b6 o" C5 ?
}
- e: z* J: \( ?! Z
$ d& g1 Q I, ~0 T* ?' yprivate: G- p/ h9 D* u: S$ @8 h
2 l6 ?/ K* Q( \) Q4 ~* H+ j
typedef Tetris*(TetrisFactory::*PMA)();
9 B$ Z% A+ `3 y( P- ^
$ \6 Q' T& E2 v3 gstd::map<char,PMA> m_sel2TetrisMap;3 l6 U( I9 d( G" _9 ?: y4 M
" } a0 v& m& W. I* T( t: K' }/ a$ Z' Z# ]9 s
};
@: ]# I( Y3 \( I% p
' @7 n9 b* u- a# V8 ^" z6 Z有兴趣的朋友可以下下来改改玩玩。/ r F, f7 n s* d3 X/ [* M
8 z, c+ C. c+ y% h
That’s all! q: u1 U* d+ y" U& _
- ?" ^0 |- T5 t# g* t1 \
Peter " J0 b8 s; _1 @' V0 c. x9 F3 P" H" e
# I* K h5 V0 `6 ^' l1 r4 Y) g3 @. b
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|