|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
6 z- Y2 t9 A1 i! k9 w6 h3 d图 1! y+ H0 X8 X" k3 d
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
3 S n, [: e& C" x* r9 E1 m) a
2 g" t% {, F [: S6 H4 M& D8 q+ _: {6 P5 F# L b3 x8 Q
Factory的code如下:7 O/ V! ]6 e. C2 Y# q
5 t# b0 K, Y% A" a/ [/*************************************7 z0 }/ q/ ~& A
6 a+ N$ E- ~6 `1 c, c ?: X3 f* }* author:hgf_starlovecpp@hotmail.com
2 ]6 w+ N4 i2 j! B# E" G- c+ i' d5 q; F3 j
* version:1.0 b* g' ]# T4 |4 @" G
0 S# C W% p! v- D, d! l* description: just for fun! a7 [9 Q0 U: |; ~9 f$ J
, B; c2 R' B5 w1 e, f& k! o
* todo: hard code exists need to fixed! A9 C: W& [; p4 A2 L
2 N$ O. L- ~* M**************************************/: z1 p! w" M( i* i6 q! F
' D2 r. a5 l5 P9 a+ V& p#pragma once' W& [$ a0 m; _& W0 z' @2 Y
#include <map> D* r" w `; i7 @6 e2 g7 i7 ]9 v4 h
#include "Tetris.h"+ q p7 {% M- O& @. ~
#include "OneTetris.h"' O# i; e3 P A* x- U7 U
#include "TwoTetris.h"" ^, i0 K8 e2 L- ~$ |3 v
#include "ThreeTetris.h"
% y* K4 t- X9 G, Q7 V#include "FourTetris.h"8 S: t) Z; {* w( f- a
#include "FiveTetris.h" {7 D- ^. W( |0 {1 [6 h
#include "SixTetris.h". I& h' X) `: I8 b& C; ?( L; V/ x
#include "SevenTetris.h"
+ t* _1 @ D6 a+ j( _ ; E3 n: z6 Y3 R+ l8 X5 k( b' P
class TetrisFactory6 Q: V* L' o4 X* a( Y
{
& T& U1 `0 g/ _7 G F$ wpublic:
, U$ |9 N: p$ ~. G + P; f) G& O# R) ]' W' \
! f( S6 p2 ^, n* W: z
TetrisFactory(void)
7 q) Y j2 j% h3 b
, Z" N5 G2 \4 @4 L{
, R7 m" Y1 o2 C3 {8 h- g5 A u; h. p( s$ ]) ^8 {4 o
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;% Y3 P# ?+ \1 Y `
3 ~2 h5 s$ U5 A" b! t# @m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
$ }6 ?0 \- A3 j' p+ t. [' g& q7 X8 R4 j6 e* m. h
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
$ i- e# A5 W5 h/ _9 ~0 j0 M) M
5 G0 u! W/ [3 Nm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
" R& ]) H1 R5 f4 k; | m$ J6 {0 P- w9 [+ Q
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
3 p- A7 G" L# h% j& S$ A
- d$ u! T$ F, r: I$ ]$ v3 jm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;* e" T+ t) s. \& j
1 B ?( l, h3 H8 Z, H- z. M
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
% t3 J( c2 f& C; K. x3 M" |+ }5 o8 a" R. l% L6 k
}* C W* d$ N% y
public:% F. o" I x4 O! C/ W' U
+ O i! m9 E1 B* a' t3 Z: k q) u
) N2 Z5 s$ U9 A; N% U
~TetrisFactory(void): i; Y. O# J& G
w {4 {4 ^( \2 v3 `) d{8 {! p' R* C9 W, k Q
" k7 S# g- Z0 q9 J% o: O9 L7 p
}
! X' l' Y3 u+ I0 e) j7 [% j
6 r( J. D8 C2 C0 ` ~* _, JTetris* CreateTetris(char sel)% `5 R6 w# M3 u2 W& l7 H
6 R: I" ?' o/ r7 [
{. Q5 M# {" N: J6 _, y s' H3 J8 C
return (this->*(m_sel2TetrisMap.find(sel)->second))();
" y, [; y% y L2 z8 G9 a; W9 r; t& s9 q& i$ t8 A
}
1 ^$ p, Y0 @. w$ Z7 \private:
8 v+ n- ]* r# B8 U
0 v! [* S& X; T! V2 [1 H
# J! y/ q0 o) h( `" T& d) @
% Q+ V5 E$ C- g4 f0 s8 D' OTetris* CreateOneTetris()
; }! g8 a+ C( E4 g8 ?9 p( k3 X' t8 ]) z* b
{
( x! |0 [- M, P3 X7 ` static OneTetris tetris;$ K, }1 e; Y2 k+ l t6 j
( }* F, h( z& \; F9 y; Z: vtetris.InitPos();; e+ \, d) Z3 j% `" y, L9 j2 F2 e
return & tetris;
G- X9 C) c; i2 ^" N/ P: j5 K7 k% o7 h8 R' p; {- W; z0 p
}* i. j& @7 e% x8 \2 F
) M- r, Q8 Q, k# Y: C% `5 W( a; E9 y' g: m+ [
: [7 r4 d ~( b# A( E hTetris* CreateTwoTetris()8 n" R% h% x) ]
3 e, m& {: U2 {1 K5 d, n9 L% Y{
* s. @8 R; o9 V: d p static TwoTetris tetris;
8 l* p$ l4 }# m: _. x( I3 [
5 G u. S9 z% G* otetris.InitPos();
) @0 o1 m9 \( g6 B9 v+ s: v return & tetris;% e+ S/ [2 O# |5 l+ R
, q. o$ I3 ]6 O: f6 |. d T
}% l, r" [" T) Q) e. N p
% g( k6 W' O) M9 R4 l# V3 [$ N# [
; I5 x) P- u+ d
7 k4 L2 c8 \5 z: M. l, p2 Z
Tetris* CreateThreeTetris()! o# e: r+ p9 k% U) a
9 w7 X7 W5 X# K{
. d7 c% k4 n& F8 V, ]1 e static ThreeTetris tetris;! I$ C0 ?6 g; A( P
. t) \$ s: T( h, N7 R: A
tetris.InitPos();% S2 q% K- ~2 Z" ^- F3 U" [
. t; a& r: L2 L4 z) `6 y# C6 p' y m1 y
return & tetris;( H7 I; }. K; b2 J( m
2 [$ n1 L/ {% Y/ [" z7 }6 F6 y0 B
}5 \2 e x- ~ v$ E
5 a0 G2 I$ W. M- n1 p
9 o- q9 M6 _( c, q. {7 J
) M! }+ T* [1 m& I' RTetris* CreateFourTetris()3 ~2 H) }) s5 E, w k1 |/ k$ o
6 i2 X+ L5 Q* ?1 l/ ^9 h4 I' B p$ ~{
3 E( O# x5 J, F1 Z3 C' o# b% { static FourTetris tetris;) u6 I4 |4 ]7 W( z
' c% n- `# _" W9 ~- }tetris.InitPos();) v) f& }3 p3 h( b+ i0 _- b
return & tetris;$ {3 T- [$ c7 F' _" p; B/ K9 z" r: S
9 X0 |4 E" a6 j
}- n" @- F- w+ O7 q8 `" w
0 M/ @ P% H4 n1 z/ B- B
% Q: L% I+ ]2 a, F5 {1 V g6 b
: D8 ~: c* N- E: o1 cTetris* CreateFiveTetris()
3 x" `7 N" Q* T9 h6 d, l- q
+ y* _; N1 u9 H( [- ]! Y- g. l{; o4 F& S; \. ^
static FiveTetris tetris;5 v4 L! _. a$ H3 N- T* s2 M$ I; {
6 i) d+ W W$ T m! ^) T$ p
tetris.InitPos();
% V2 Z x2 m1 J' M return & tetris;
6 N0 W0 D# S1 z7 _- l: x) K; U3 @, m6 g, ?* y" Q
}* T; C. ^6 e. I2 d* j
1 r( c3 z: j& J2 r, r, ~
' C" S3 ^, r% k' d0 Y
Tetris* CreateSixTetris(); I o N6 L5 q; R6 T
/ l2 x" Q) ^1 I, ~; t{
! w, y2 J# a8 k( X static SixTetris tetris;
% M7 W; Z+ C" N( g) d
) v* y, Q4 G8 Q; vtetris.InitPos();
" k+ [/ y# D9 s return & tetris;5 H5 L4 z+ E( c5 W4 M* q s
6 J6 L& M4 u# [}
& N6 U" A: B+ K" E2 D. o ; B5 v' r0 Y# }. I; v; f
! w5 c; k, \ x i, n( M* J$ q! J2 @/ d
8 W0 C( I% f* | X
Tetris* CreateSevenTetris(); q! M' w; n! N9 a
6 ?" ]* Y+ M& h1 V. g* y: d8 h
{3 A, A/ {, o# h7 ^% `# d% b
static SevenTetris tetris;4 ~; [' m7 i- U* l- b$ ^& t
; g8 s6 o( ~! T. }( l7 ?: Y& }
tetris.InitPos();2 W! \2 ^) ^- L1 S/ U; h7 ]( I
return & tetris;
9 n- Y: z$ S- R& B; P) M2 l" U5 n, N, `
}
' K6 k! G9 K% e3 ^" s5 n; e) r2 s. V/ C - s8 `0 t9 ~" {! o# R6 }! O- a
private:
6 a3 U% v5 a3 K4 t# t' ?
0 ~7 G* R8 J$ T3 a4 x typedef Tetris*(TetrisFactory::*PMA)();3 e+ @" ]; n1 E) X0 T
- q/ O# R7 K9 `# _+ Lstd::map<char,PMA> m_sel2TetrisMap; R3 u+ \5 g+ A$ M
& {0 F; S: m! r7 _9 }5 |5 u2 [. a
* b* D; ^& m- K2 K- E( L};
) @( |2 M$ v. E( c# J
9 Y, O" B+ Z# m6 N, b; t# F0 D9 b/ A1 s有兴趣的朋友可以下下来改改玩玩。
8 X& K0 ~ R# V; s4 M
. w5 s; z- v& w4 N5 i9 NThat’s all!
. {" p& @$ m: x' e; u+ u6 t
# Q2 N" V5 _0 K! `Peter * l/ ~2 }/ D& F2 K$ _3 ~; \' L
$ H5 `" t8 n" f) l. I$ _[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|