|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: 0 @5 p2 {( w! }9 _# S
图 1' m% ~$ f8 F I$ F4 H3 j" j
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
+ U# V1 _2 f% j+ f: D+ X' b6 R) o- A9 ]% c
/ L) R+ |9 L9 o, n H( t7 I
Factory的code如下:& R+ A% e6 T1 [' B7 ~9 h
% `1 [1 S# q0 [- l5 C
/*************************************
! o) S" ^8 j/ \! v
8 j% A8 i9 Q! n/ A) J* author:hgf_starlovecpp@hotmail.com- V' L5 F8 P% L& _' ~
' F% s1 {, \2 C1 l) A
* version:1.0& D5 J- Z4 r( I
! b. M, _" v; Z* v5 P' {6 x
* description: just for fun
+ U* r$ y- y l2 [0 z( A9 \8 `) l8 z" e0 j# T* j8 {
* todo: hard code exists need to fixed; a$ n/ I8 y8 ]* q, ?
' g2 ?" o$ U- E: a0 M
**************************************/
/ K5 f, P- v( C! x) V V' j0 v 2 {! s4 ~: b" O
#pragma once U5 |8 ?, N; g% Y
#include <map>" p* ?" H* p( `+ l- C9 F0 C3 i9 t
#include "Tetris.h"
6 S% Z; e+ u- h. K#include "OneTetris.h"( H& q4 w6 p) f- m. D
#include "TwoTetris.h"# s3 K7 r% c/ B g
#include "ThreeTetris.h"# M5 t4 H# `7 k6 l4 A8 h3 u
#include "FourTetris.h"/ E( W. F! S9 b- q
#include "FiveTetris.h"% o2 Q' V# b( E% F0 }* C/ L
#include "SixTetris.h"+ n0 g8 ~% u3 i3 ?4 @; i6 A
#include "SevenTetris.h"
8 ]- c1 D5 V" d5 ^- b# F8 ]0 V+ z; I
% f! w- m2 @( pclass TetrisFactory
7 |7 b" [* n Q+ K# s1 S{ U( M8 C7 `( w% b
public:$ p% c) d5 V+ H: |
; p) e+ ~+ y6 h' {* C* i' S8 v
5 q, _" A: R6 }( I# y, p- mTetrisFactory(void). w3 e7 _# P" D0 d
* |# k _9 ?. D{
1 @9 B% p' x% p: A/ d b
' P$ K& V1 n7 mm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;% U1 J) e+ ^( {( `5 T0 l' u
$ _ {% `, z) L* d9 x8 o8 q3 h0 P1 k9 v
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
5 y1 h) ?2 ~4 x7 J6 F. w! e8 f5 W6 B4 {
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
& }/ g- j& q6 d- l, ?' ?8 Y4 M: R! X' c9 l
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
: R2 h* L7 Z5 {
1 |9 I" F4 }4 d- z$ em_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;, }: z) C8 i% P0 k8 @/ t
9 L5 p6 v4 y0 {: A8 _! e7 j
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;2 w( y5 v* }) r# X8 o# T
6 F1 o: |1 |* L% _m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
5 l$ O6 L/ e+ c# J9 h7 P. Q: _' s3 @8 c+ g
}
/ Z/ }, s" w8 m1 R, ^# r1 B6 zpublic:
* L) p A7 a& t# U: W 2 B8 \6 A4 |5 U8 \1 V* ~3 M
: c* \1 m3 P5 x
~TetrisFactory(void), _" {4 t( {- A# a# u: @
: h! U9 `3 z) l5 p1 y
{
9 U! c: L" Z% L
5 Q* h; x9 s6 r+ [}
% [" k& L6 l) Z: m- \+ J
; c- t% f# d) U" I( |+ STetris* CreateTetris(char sel)8 N& c" l+ ~ v; M
J$ l7 p. n1 O6 m- R
{' k7 V2 {& i! D# g2 |3 e
return (this->*(m_sel2TetrisMap.find(sel)->second))();
% h1 z, h# t% k" {) z+ H7 g( G6 ~ X% u z8 p/ k8 Z/ B, l
}* W/ k0 V b5 `+ b! T3 o
private:4 w$ D' u( x1 @; n$ _+ [
- {+ R% v" |. S7 o' z. \; b( _; U" A! f0 Q I: n3 e
/ ]# }+ I, J# D
Tetris* CreateOneTetris(), i' l" p# s2 K3 Y7 ?1 e) J
) E8 I: G+ @0 K{9 _4 N/ ~; g6 U, R7 u
static OneTetris tetris;
# K2 t3 ?5 {1 v( _6 @7 D V# i+ Y- \$ b8 T `6 f& ~2 ?. i6 k
tetris.InitPos();3 a# s8 l3 `% s: Q* w: o: a. B
return & tetris;
8 {0 }% |. G& s' q0 n$ L! z; a5 W2 \! a; \& c$ q
}# ^9 |$ {" y# _) a1 c- X# ^
0 @7 u9 R2 D& l2 f% h( D
2 n+ V6 b& ^" j0 }) C% x X8 i8 R. a. P1 I* h$ {$ p' ~) d8 E8 Q
Tetris* CreateTwoTetris()# |3 J4 S9 d; s# U1 }
& F* ^8 V& W+ |. ~6 J{5 M% B" V* l6 O: o3 a
static TwoTetris tetris;
* Y5 e5 u# c" S6 |* \& n: L8 d$ F& F+ P9 k9 o& R
tetris.InitPos();
. z& ~$ G7 l7 W! j7 l$ ` return & tetris;
, |+ D& Q" p# \- }0 e# Q9 E% w8 o0 ]5 m5 A! I% ~7 T1 j
}
3 m7 z' p2 f( ~% [' F7 h
; Y$ V" b/ P+ t0 w
% F% @- J2 x+ N1 m" b# j$ S; q2 C( U* O0 f/ H G. G
Tetris* CreateThreeTetris()
$ F% e' X& r% n3 o
+ a _# C b. x& z{) S! q7 }+ V" f9 {+ f( b. N
static ThreeTetris tetris;
" d7 F: K. R0 q) ^6 M) U {* `
5 H* ~9 p7 ]" o. g. J7 P( X: e! stetris.InitPos();( U5 Q5 W+ i) }5 X. h6 {
2 z& C2 `' N+ E9 ~0 T% d
7 B- s6 y% S9 |; s. d7 _5 L" I4 vreturn & tetris;
* }! z' I8 _; M6 C& J/ p' G" i( H+ ~4 A, X0 `4 R( p
}
# D* Q9 r5 e' @4 q' q. o3 v, @; @! I) \5 G$ k& F. K
( c# y5 D" Y' {
3 _! k. X9 A* @Tetris* CreateFourTetris()& i' \4 k8 ~, q' d6 j% D a$ h$ ^
W, R6 j5 K5 T" ^ v
{$ x) Q/ A q! s2 @: T6 r
static FourTetris tetris;
* N- ]4 B: a3 F% R, _/ p
$ S6 ]/ ?( o5 m7 {tetris.InitPos();
8 }# ?: ]6 m$ n( O) A2 X; m return & tetris;
4 [6 J$ e/ H, a' b
, z' k0 H4 l# p}& I( ]" a( H$ N
0 N) D; b+ `3 w6 w% n9 n1 Q
" K; P; _# P4 h6 X
5 _7 M7 ?4 B) H4 @' X, pTetris* CreateFiveTetris()
9 f. W/ q3 k1 V
- C9 ^8 k4 Z& p4 G, M/ C{! W8 h! y7 Z5 O4 d, c6 Y
static FiveTetris tetris;$ P) D) f$ {& s! [
; X, {8 T: Y. c1 ntetris.InitPos();, Q- K3 O% A K5 N
return & tetris;
( [* n4 M; }% v1 r7 }9 i9 ]! X( q9 X& m/ E' B7 g
}$ r) Q& v3 C& ?3 R4 E
5 l! g. J; h4 P, c- }. i& h0 e3 d
0 A' U3 s& @/ @/ dTetris* CreateSixTetris()1 g4 [4 k" g+ l$ `: C
i3 O& _* }9 @{; k- y% J6 }$ \! P2 P
static SixTetris tetris;
/ \: p) K9 t2 R n( I i. a% x5 t- s1 N
tetris.InitPos();; Z6 a$ y" \5 r$ {7 m+ l1 o
return & tetris;
. S) n, k1 Z6 C% Q3 c* S; F& _7 D
}
# \/ d: R, |! G/ A
7 V2 {5 N/ X) ^' d5 Z+ w# t( U! |1 O" l) q7 q I5 {0 A
. X! D- P( I1 O8 A1 ?$ f* @- L8 f0 U8 t7 V+ w6 F$ I
Tetris* CreateSevenTetris()
. z. L) b* V5 K. |. t3 I/ V
9 b! I9 N5 t0 B5 s{
5 s( e8 X( J$ q4 g+ I static SevenTetris tetris;
; W. K0 ?0 |: L0 v2 g a3 u& E5 A7 d9 ?: c
tetris.InitPos();# }$ D# [7 k& h/ [
return & tetris;2 @7 M4 G+ [1 O
% V7 p8 U7 A6 o& u% N}
: j8 u. N; W4 Z6 F* O + z6 X2 _. l& B0 g' J
private:* O# w) r' g3 ?5 S
4 o& {6 v0 p! ^2 y: J
typedef Tetris*(TetrisFactory::*PMA)();
' S8 y' u+ f. `( D7 `, ]5 _3 G" v6 O% s! U) B9 u
std::map<char,PMA> m_sel2TetrisMap;* W1 E& X* v$ w, e
: W2 c# }8 X4 n' E5 O
- k/ O+ p4 D. J0 i; g
};" b% Q' k5 g1 J5 l+ j, t9 `% K
! `+ p/ \ k/ y. m+ c有兴趣的朋友可以下下来改改玩玩。
9 k( Q1 v; w1 v k, d 8 H6 k! R0 v9 u) Y! i J) g! j
That’s all! z; o1 Z& A0 K+ q' s6 d. h
) K" _4 H) W7 s, r) N- d0 M
Peter
3 E/ \+ U$ R1 r) ]% }6 `' z4 X5 n- L q4 V; D+ L
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|