|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: 7 X% L4 m6 C( A0 r1 H8 w
图 1- {- ?- {: b( m$ F6 x! s
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:' O3 F }8 r, l
; d: s; v! q# J: z# s7 I
' O+ {9 r) v5 ]; |* F# K1 v* AFactory的code如下:
& E% l" y5 _+ M$ E5 \9 j" t7 ~
; g4 |5 u1 q* e. C/*************************************
1 Q4 @. v# B4 Y; S" R! F7 J% x1 {3 M b7 W! r8 B" g
* author:hgf_starlovecpp@hotmail.com- p* `0 n: v' C& _% K8 t7 E
8 e' \0 z7 o+ `% n
* version:1.0
! K& H$ H% n+ P3 m& ]% N% g6 f0 J# e
8 D* E) E d' Q* description: just for fun. F( n3 p. s6 q1 C
1 ]7 ~, D r# _4 i3 N Y* @: S
* todo: hard code exists need to fixed
6 t9 |2 p) x- U% @: W5 S) j: R0 i4 D
**************************************/' X# r" h9 j# c+ ~7 E
a+ j1 X. S) x# B! q#pragma once9 a9 k3 A- L' x9 Y: W
#include <map>
% G% z& A- _$ Q" X5 I( G6 b#include "Tetris.h"
! x, e% Z3 o8 h1 v% D5 C' u#include "OneTetris.h"; l! k8 a# T# G% m3 G0 P/ ^
#include "TwoTetris.h"7 D* n$ |/ B2 c/ ^
#include "ThreeTetris.h"
6 w# f f& _- g5 {9 u4 H8 B- A3 M#include "FourTetris.h"
! G2 U. W3 C' A u( I* Z#include "FiveTetris.h" a# k3 w7 L/ q0 ~5 ]$ Q
#include "SixTetris.h"
8 H" m0 i: x6 x1 w4 e$ O+ E$ Z. M1 p#include "SevenTetris.h"& Y, S+ O: v" G3 j6 Q: ^
6 t& l/ @( a/ U- T' S. Z
class TetrisFactory
+ b. O! @/ D- a [{
$ V& q" H, b/ y- T% w$ M" spublic:
- v8 [) P& q k+ K' L ! W* N9 z9 l" d8 ?1 M$ Y: i& @
: T1 V9 D+ q+ K/ B/ d8 qTetrisFactory(void)
6 h9 V5 ]4 ]) X) l, ^% W# e( D* T+ P3 T) X7 E( K8 ?2 s7 D6 N5 y
{) i; v2 y; {0 x; J4 V! m) B
; v, [0 n( k1 \, d$ ^* q; Hm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;4 \6 g& ], ?- G" K2 ~. Z+ B2 h
5 a$ \8 Q! q) ^$ \' X8 ?m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;3 y9 l1 u7 k/ ]( i3 }
- K- ^% a" ? e; X3 b% K. P& k. Vm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
; W: [) y) {7 N" X1 w# J% l: Y7 K" t6 `, ~+ U
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
: p% l b, s+ d% k+ I: U' X" x" V1 Q% s$ O
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
/ x0 ]% G1 Z" B5 j' j, _& p2 N/ C; L% |+ S7 m/ S
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;) c `. f6 K. \% d# H3 a v- V
: c# A6 S4 h* Em_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
" [- d; c7 v3 G4 w/ R4 T$ x) R
7 M5 ~4 H% B6 s: Q/ l}
* Q- O+ `3 O' g& O; s. p: hpublic:6 o; G6 A0 Z3 ~, W+ i4 d
1 u2 U! J: d s* h6 I7 ^
, c' e+ e; g2 X* X~TetrisFactory(void)+ S0 `$ `% }! i- B7 |
, Z+ B) B& E1 t: i$ ?
{
! F; b1 U5 s' e. R
( Y+ [7 P6 C+ V5 ?4 X2 c/ U}$ o( {( e& G. [
& j& t+ m) u6 s1 I( ?- b
Tetris* CreateTetris(char sel)* K( T+ m. `; }7 E
8 A n" k4 i& l5 N: p2 e% r{
/ b9 t. q4 h/ G) s+ i return (this->*(m_sel2TetrisMap.find(sel)->second))();$ I/ V+ C7 r2 f" L; C- ?) f! t
( B2 R+ B% {: X' z9 u
}
/ V% A/ Q* S! h4 H, b5 gprivate:
- k5 N' T5 {& d1 b0 d- c1 L
4 @+ s) F4 v7 j6 N, `2 x2 |; A4 r& _
' E" M: f* A: o5 n9 RTetris* CreateOneTetris()3 J/ n3 b$ ]. [* u
! l& j- {1 x/ k$ i5 `; Y
{8 Z4 l' N! M ~7 |: \& p
static OneTetris tetris;
+ d" b7 i/ d, N
) x. h/ z1 @ R p5 y3 htetris.InitPos();/ G( W7 b+ J$ \
return & tetris;
7 W6 g0 K+ S# h L9 F* k5 [$ T1 Y: y+ R' l( J4 k0 i9 d+ l! g# X1 C
}
* R% V! b4 v0 Z( [' P- ~1 y+ K" I/ k: t. \
2 b9 E3 X) B! M: q$ {4 }4 \- U7 M7 N6 `/ \) J! z# K
Tetris* CreateTwoTetris()
; ]& [' q; L/ f. ~# m- C" |: c! W) L+ R0 V9 O+ T/ r/ E
{5 x3 I) ~! F3 J% N) G) v
static TwoTetris tetris;
. \8 Y! L; I: \9 ]% ?9 X
9 `& P6 a& H& D' z: c, o0 ^3 vtetris.InitPos();
6 |6 F& z3 f3 E: a1 t return & tetris;2 L' O7 D$ G8 g" X
# @0 S: Y. `" X}: i3 [& f8 M& \2 S5 _ m
* A& J1 E2 [ B5 m
$ |# `0 S3 X1 a7 s! b ]5 h" t$ c, v( m. n
Tetris* CreateThreeTetris()8 N/ _; b- W* y8 B1 Y* v) q
6 U; F4 v: W F- X# t" M{, i" i Z2 }. b: |# M! m
static ThreeTetris tetris;& a2 Y* E4 p; a4 O
( V E. g' O* X6 ~# wtetris.InitPos();
4 r# E4 X' U3 N5 e2 q* X3 ?$ }5 P5 ]! h. Y% V5 D, s6 f7 R
( d$ A. x7 v( A/ J& ^2 ?# n
return & tetris;+ I' F) w: {/ V
" j' S( e/ p7 [8 x/ q$ A}
& g% A: j9 Q$ ]% d" S$ A" K# B; D! K$ }7 j& f
& ~! l6 ^0 r4 t" M/ @2 [0 a3 r' X# i9 e( a
Tetris* CreateFourTetris()3 U' B; d+ X o+ A
8 a% L) [% z% s. O4 }{3 `) S: ]5 @5 @9 x! x( g
static FourTetris tetris;# i& s- d$ p0 t. y
$ z6 I) f8 N+ g; d' Z
tetris.InitPos();
/ f' Z! [+ |' c) P# B return & tetris;5 w- E4 w5 E$ J& _
/ o: `1 }& p4 x6 _. s6 t
}. K1 R8 a, R; d6 m; F1 L0 y: r# u% h. {
( _- k% X* E# L
+ w6 `' k$ V/ V) X w3 O7 G
, Z7 [7 d, |; t0 iTetris* CreateFiveTetris()
$ I( V# `, p, T6 R( t# o0 C' o% g& A7 f) u9 x
{$ J2 k, N* |9 F3 p3 F$ c
static FiveTetris tetris;5 r( C! g, t1 W4 G. b
. f% J& Q( W, j, L$ Y+ Y
tetris.InitPos();
" P2 T" _" S6 [ return & tetris;
* W5 I& V8 ]1 h- J* T+ B! p3 g! c! \0 ^- [
}! ^! b- A8 f" ]
3 R0 n% ^. W9 `7 J- \$ P; U+ E/ e: t. l( @+ N
Tetris* CreateSixTetris()% k* Z% m# U5 L: M2 ]
" W$ Z9 [3 w% c{
7 N& ]% Z# L' n static SixTetris tetris;4 e8 ?3 j; F# U+ `4 X6 X9 Y3 V
+ ?* E- Q. {% e. I* E; L6 l; E
tetris.InitPos();
, X3 _+ ?9 o; \6 t9 g return & tetris;+ V+ [$ |! C+ e3 u h. B Z3 \
4 o3 \; n) x; u _
}
( g# ~7 }* y! }' d" s% Q
. N' n% l1 Y0 A& j+ }: p" l" ]
; c# F' d3 A e3 i; ?0 ^$ z6 z
0 C' K" V9 ^) A1 G" D! ~
, d7 b' x0 Q z5 o7 s+ x# G) y) g8 V* o$ qTetris* CreateSevenTetris()
! |2 W, a4 M0 R1 B& g: V
' I. K; o O0 n{1 x& K, P8 d1 W& p+ J8 i, y( g
static SevenTetris tetris;
5 |: ~6 ^5 p( ^) h, f$ U9 i. J" h' J+ ]8 k5 M
tetris.InitPos();0 K6 v. u; S. k) Q% f
return & tetris;
6 n" V8 i. U- s6 q* v3 I
T$ m' \* o3 N7 s}( p/ X9 {! {' j- S' V& v0 ~
. |0 e0 S# ?+ _! [% y" B* |3 Xprivate:
1 x" y' K! d+ k. t3 i* s! c% @4 ~ : a8 `) `3 [8 V7 o& q2 n. Q
typedef Tetris*(TetrisFactory::*PMA)();
" H0 b3 _2 |* n7 i& |4 Q
9 q2 I8 E/ z( g, y" a3 |) Tstd::map<char,PMA> m_sel2TetrisMap;# f/ \! _( ?, m& _) L1 Y" a/ F) q5 J
: P5 A. E& J- a
+ X5 c; C% G Q0 U7 Q! T" ^};( G3 F6 i3 o: @2 v
5 g( u$ G. i% p; V/ |1 G" M: k有兴趣的朋友可以下下来改改玩玩。 }. E T2 |1 y* q+ G) a% H
# V) B5 c4 I1 a4 {7 b# y
That’s all!7 t; D( U8 z5 |! E1 z" p
* r5 o+ M5 i- e* jPeter
. W) Z! ^ ]( G* [! O8 `+ Z- ^+ ?2 a( s, k
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|