|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: ( g/ S: m: ?, S0 z
图 1
6 ~' ?8 Z! b# [6 A0 X7 G; k+ ~完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示: | u" |9 d# H" k. F) k
, Y6 w; r' X- [! ]$ V' L
7 D. @$ ~ ~0 X% K r4 l
Factory的code如下:$ ^* m: R0 [# G
6 @ G2 [2 z7 h0 s6 E8 k4 b, d, m" N/*************************************
0 Y3 |7 A* J" `$ R6 h* V/ s+ P( v& B1 `/ U
* author:hgf_starlovecpp@hotmail.com( p. `( A! X7 v% \
- V8 ~: v" I* s' B J9 H
* version:1.0* |' X5 A% G- s' X/ E( E& {
. v7 |* X5 _9 B' W2 N1 G) K6 H* description: just for fun
8 H, ]7 c2 x* G" n6 U
/ P4 V; ^" |9 F/ d; y/ ~: z0 z* todo: hard code exists need to fixed
% v+ V: { B L) T8 A! a% @5 d7 J: \+ a0 u, ~0 q$ v
**************************************/) @ ]$ @$ p# C; t
1 \3 I% j# M0 L) p* m h
#pragma once
5 V5 ` o$ P8 W+ S#include <map>/ \% f% P* D- W1 O4 Y( x' S2 ~
#include "Tetris.h"9 i! }8 d. ?( A: J' o! M+ R
#include "OneTetris.h"4 `* p" Q# Q" N1 |8 i2 h J
#include "TwoTetris.h"4 Z+ e! M+ H" a1 X, e: N& V9 p
#include "ThreeTetris.h"
: x6 x( B$ n- @+ H! K0 L- J5 J#include "FourTetris.h"
4 ^# u, _" ?( j. h, R& D#include "FiveTetris.h": ]+ R' v* k/ _- a4 E) O" c
#include "SixTetris.h"
; ?! y- l3 \! ^! |#include "SevenTetris.h"7 F8 R* x3 q6 v5 I+ j. r0 Y
7 D6 L+ C- O4 `) d
class TetrisFactory
# g* @6 f% p& m/ }{
+ @5 ~+ v$ U* u, n$ t# Rpublic:& P6 n9 G2 T u, Z9 Y
; c P$ k/ ] G7 b5 P
$ x- d# ?1 p2 V K8 Q" g
TetrisFactory(void)
, i) j/ f; B% q+ x- p0 w4 s$ [9 {. Z' L# R6 w0 k
{& q; F; k/ F' ~' _. e
; b$ E* R; m }: p& e7 c
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;6 W5 J4 M3 C6 ]( u! ^- ~1 z
2 M( [- C) R* ]# ^m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;$ d- x, g' s4 Y2 y
) O! `' ~7 C& a1 p+ |m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
1 n4 o. {( b K! o6 v1 u3 d5 {
! P! \* Q4 e% \$ @. v( ~" om_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
6 ]0 E1 L- B3 y9 ?- U- H" @. G+ ^" D5 t" h) f* G5 t0 y: c
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;9 X+ f) m0 w3 ~
3 k6 {6 j- F2 Y& f& \& d* Z' Sm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
& p, E$ D- Y. X* H& p$ c
6 L" L7 z7 N/ b. _8 a, o7 Um_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;0 X2 V6 X1 |4 m. ]8 m' Z
4 r' e: F `: R% B}
5 j+ H$ W3 Q+ {! N4 Upublic:/ ~% B0 H, o, u
% D* A4 \' J, n
$ M1 n; m) V# e+ t6 O7 [4 `0 ]~TetrisFactory(void)
. O2 A+ m1 n C$ E M D7 e2 P: q/ \
{
' }$ A! E7 H7 V( a1 {4 p9 Q6 H
5 a% x+ D( i1 N |7 G1 t}
U* ~5 V% l" D1 `8 g! }1 q) S1 S& e7 @: \* V$ ^
Tetris* CreateTetris(char sel)
2 L4 q/ C8 T3 T! E- K7 i* z2 {5 W3 n0 M; e
{
( l c4 u" F( r9 ~/ }& Q# f return (this->*(m_sel2TetrisMap.find(sel)->second))();6 @1 K/ ^% ?$ U( Q& H0 d( u
7 t' J8 v, E$ C5 n& t5 _* [
}
; M, ?7 b& u6 Wprivate:8 ?% S# C1 L, w' P3 b0 H
8 n2 k, t( r( X; \+ z: W6 U
' z% `# A1 j% w5 b% a8 q1 F+ R! ~$ h0 t- `' [% e$ y
Tetris* CreateOneTetris()% d( E$ h( J4 r
" k; q/ e9 ? F# E! c
{6 C- E+ u, J; X9 R# \% t
static OneTetris tetris;5 w Q% S# d3 ~6 g3 G$ r
0 ?- x: F& e: E8 t( v0 Z( Ntetris.InitPos();2 `6 ?7 b0 Q' D1 X
return & tetris;
- i/ O) L. ]" b3 F9 r
c& |, [5 K/ g' s$ {* s+ U0 D} E4 t3 z) z2 F( B
* o) J8 L# e( O, j7 r! o! ^" s7 \% W" o5 Q8 O
$ a8 z* |7 K6 f) d
Tetris* CreateTwoTetris()* U& z- w( ]4 l0 B! c8 n7 t$ m1 b* k
8 P/ G8 J! H" l! ^9 D{8 b9 b% K3 x/ T$ o2 K: z0 u
static TwoTetris tetris;3 X3 B; m: n* W1 w2 V9 S+ s
2 N6 J) p ^ p& y2 r' }3 Y7 u* G
tetris.InitPos();6 Z5 @+ L, Z9 P6 ]/ J! g- V# ~
return & tetris;; A, i. p8 E0 P% ^0 I6 K. Z! p
; w1 Y" [( v& k
}* L% z, x2 ]0 d/ Y
# _: x$ a/ |- I! g
% q4 I) |4 c) w$ [" g
# A+ s1 `: I* a- `( c# W% tTetris* CreateThreeTetris(): f9 e+ D1 m; p) c
) K- M& I9 @7 T
{
, Z# P& ]' Z; E static ThreeTetris tetris;
% Z$ W4 L2 F* y& C) A2 ~* y4 r% U% l; ~8 f: e- b/ G2 e# q4 R
tetris.InitPos();
, N7 k1 c: q7 {0 _9 F
. N9 ~0 u1 Y+ _. ?0 ~. I6 \4 ^
* x. ^: j z* `# t4 {. Freturn & tetris;
4 b8 q& x& ]# f) c6 ^$ I
. H/ e$ f6 b, `- h7 P}, ?0 H( I( P. H/ o% g: c2 S& {
/ ?% i3 p2 |3 r8 z# _4 A H/ f
$ b4 A6 d( Q# {" S; m s
. K; }6 a# T+ t. x5 ^. K9 `5 Y/ w/ qTetris* CreateFourTetris()2 y& ?9 o+ D, m( {/ o5 m
3 J {" ]& @) ]
{
3 Y( h. k t. o' h9 w) k$ J static FourTetris tetris;
/ }- C3 e7 W' C! W2 d/ A
& A/ U0 J% d% V& Ttetris.InitPos();
; z; D0 R* W3 N; { return & tetris;0 }; ?' f' m% J
8 F3 Y4 c9 M% o, b5 v" |6 F" Q+ t
}8 l4 X3 n( b6 z, x+ w1 I4 f
% P' `9 C5 L) X, w) j9 f- K& R2 ?5 E$ @1 o6 p Y: `: A2 g- q* m
. }" I8 s: S Z3 U3 I9 g, v& p
Tetris* CreateFiveTetris()& {' i( Q6 g* Y" M1 U- b
8 ? g& Y" \2 U& ^: d3 F: M{
" p4 {( n) J+ `: a9 Z% W static FiveTetris tetris; x- O. o+ j c. k# ?5 q& }, a0 }7 p
- H" v* E. u% Z7 \1 a
tetris.InitPos();7 |5 w0 s: y6 r' [+ r$ x& ^" i4 e
return & tetris;: x* s- u' s' [# h- {" E
$ d& ~# X2 _# K1 P$ I+ o}
6 d4 y+ t o' k; l! H4 N% ^ ! |; q: j% ?% I8 I' {9 j
4 c9 p% y0 h; c5 s, t9 T" H
Tetris* CreateSixTetris()9 }' M( f6 s5 Z* h# t. w$ F8 F
9 o4 U2 v( n$ y8 y+ d0 D{7 v& r/ T4 b7 o- m
static SixTetris tetris;. @+ H1 p, R9 d8 ~7 |
/ @. X& P1 o, U$ q. Y7 M9 z
tetris.InitPos();
" Y: l" d& c" @- k! b* Y; d return & tetris;, C! L( I b5 @
8 ]) O5 ^. m: ~+ j. U
}7 M. s, q* v3 C6 P& I& N
8 F6 H& |" {& Q/ s! x
- D" |* d) B! `' S2 }
" R2 v; |; q' z9 [1 Z0 B- Z
7 k6 G. j, c% F4 v4 i( c; w- q7 x2 oTetris* CreateSevenTetris()1 ~. B4 |5 Y5 e3 ~) _2 q, v
1 N( m/ [7 Z1 d# d{
. v2 l# a! ]# A/ i static SevenTetris tetris;
% k6 z1 ^7 v/ z9 w5 u# B, x
; J) E5 r; S% ^tetris.InitPos();
1 r5 `. _4 F+ E% t0 | return & tetris;4 C2 x0 `5 W& Y# m
+ g( w8 j. f% o) x5 V}: D) f2 j: K% o' ]2 B& h% w/ f
5 s _* P. @+ c3 Iprivate:$ W" C/ V' e, H% L) h* l
2 K7 p& G2 ^9 M3 k typedef Tetris*(TetrisFactory::*PMA)();
' k) c) g* L3 ~4 R+ ~: ?0 F3 G+ a" W+ H
std::map<char,PMA> m_sel2TetrisMap;
: j' L9 n. {0 ]1 b2 R+ u/ t2 ]/ x6 Y X
& X7 M3 h6 K4 S5 r: k};7 a$ u( d) u: h+ c+ t1 \2 u
4 l4 R$ B }+ U/ q" G0 Q6 X0 j
有兴趣的朋友可以下下来改改玩玩。9 l4 z0 g5 q- o7 t5 G
! Z+ h2 X% N4 C7 j
That’s all!3 v$ J# `3 A2 w
0 e# b( H' E4 Z: M
Peter * |2 \, k( D! N+ }1 k6 X
{* {& s6 S" q1 I8 m
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|