|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
2 M4 C6 M4 t# j6 \' p图 1
+ c. {6 J+ a) O) f. w完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
2 g, f9 f# T" i( U% j& a" B2 S7 X2 C" H: Y
! D, Z4 f4 B9 R |1 L2 V' @ [Factory的code如下:
+ k: t+ c' s# r7 Y0 V( w
8 i$ Z! @ \* E; Q# K- K3 `/*************************************
9 u/ Y0 O9 j1 c( b' C* \# I8 X0 T1 y7 {7 n6 R, j% f: R4 a
* author:hgf_starlovecpp@hotmail.com
7 X1 X& k2 S* \0 h% D
' D* N! J0 M# Y9 m8 F: W" Z* version:1.0
% o" R, I/ o" _, E* E: x. J
. t3 f7 E3 \. C# p* description: just for fun
6 p: O- q: }* Y7 s3 E5 w5 i
" N; {) O# _, g/ O* todo: hard code exists need to fixed
$ q3 I$ R2 l# z% ]# Y: i* a% Q% x" d
! v$ A0 U6 b% J; ~! V+ \" U**************************************/3 o6 u7 ]) F* l# I
9 j U7 A3 l$ L2 u#pragma once
8 L4 k& X7 h6 g, i. @! d: k#include <map>
# w( }% f l/ S u; G2 d#include "Tetris.h"
% g' u. e' u" l& \% p' _3 S7 I6 x#include "OneTetris.h"
5 v# x! B0 S6 }7 S" B4 C9 q# [, _# H#include "TwoTetris.h"
( U3 a, i/ r9 I8 [#include "ThreeTetris.h"5 }' {* K1 D. `1 W
#include "FourTetris.h"
" g% n/ P+ \9 }9 A& O! p#include "FiveTetris.h"% x1 i8 {# H& K! ]
#include "SixTetris.h"; C2 U) o0 M6 a" m8 u
#include "SevenTetris.h"
7 e- K2 v8 K' a& u$ E3 F& K + Y9 _+ M2 B% ^. E
class TetrisFactory) X( X, w8 ^8 \: K
{
: q) n% |9 W. e) P }+ p; }+ ]public:
' g. ~) K0 L* t
! Q; H: @# p, K" d6 N3 S' o. i
0 |* r- U. ~/ ~) qTetrisFactory(void)( |; Q3 S5 a) ]4 d4 B
' h& C- Y/ C7 B' H, [{
( l( X5 l5 N; f5 a
8 K0 a% o) n4 q2 Fm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;9 [6 R2 A( }! z9 h" D
- z# u9 g$ _& R: am_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
' g+ {8 \* v1 M9 d$ |9 h w7 W7 U P/ S+ T1 A. Q
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
; Z1 M! o2 F6 y, _" i! e% k& v
! e9 A; c+ T! c, @1 g' j6 M# _3 J1 Qm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
$ m( k" K4 J4 A# F$ I* }1 X# C* E, V6 `; p- E, V; N1 F
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;/ w4 d/ b$ c3 `4 z- m: Q
9 N9 K( S$ N2 {) rm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
" \8 v1 K. U0 M, f/ e$ L1 I" x' g/ X9 W
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;) {4 Y- J J6 o% j
2 o$ a: ?7 S* j6 q
}
! e7 [2 ^5 F- H+ O0 J2 E' p6 W* }public:! e9 g i' I, ^$ t
6 q1 _7 I6 o9 P& I3 U3 r8 W6 P
* r9 q/ S: Q) q H+ w+ @0 d~TetrisFactory(void)
2 L+ _ |$ u2 @7 {1 _; K( R6 f* J) I5 N! z
{/ M" _* n( O, K: Y8 r+ v, v
" l; t: F' |3 K}
5 Y2 V, `1 g* B; U2 R5 a% Q5 f
8 O+ x3 v+ Y# i( E0 c+ j0 tTetris* CreateTetris(char sel)
2 r# u- j1 r1 E: n0 n$ y" m& `1 I
, f2 q; V& B! t2 K" r{7 r: j1 b/ |) N0 y, f5 A; o/ i
return (this->*(m_sel2TetrisMap.find(sel)->second))();
3 U8 u' E$ h; l* U( g. X. f6 _0 r/ X: O! L
}' v* E& o/ w; i0 n* \
private:* V1 P' t: \8 y
5 r' |) L; [, w. @; z& K/ a6 v! t; z" I6 e( r; _; [! c" e$ Z
% I1 t# S6 |/ k
Tetris* CreateOneTetris()
& r$ }( Y4 G" }7 |% y6 k) ]1 x- G) x0 L: w& B7 h' K
{
8 x- i, c! N3 P* n; }. C static OneTetris tetris;3 r, b) A4 R) G2 V! m: C6 C
' ~& N8 F7 U$ {5 U( ]' K5 M
tetris.InitPos();! F- c( U: O5 ^: w/ j
return & tetris;
* q5 W; u4 F; a) {' O$ }+ D
. K# G- i2 l; F( ^}8 `( ^3 z0 N* L$ o8 i/ r
5 X c5 v( `9 K1 G* m( ]" Y1 V$ @, W6 t1 t E) V0 w+ `
8 _6 U! _9 H$ c3 x1 Z; }- U* a/ J) cTetris* CreateTwoTetris()6 ~; A4 j* W" C1 H" u
' `( ?1 a6 T# G3 D' f f
{
2 T# Q* ]4 W. `& }3 \; f4 _ static TwoTetris tetris;
7 t5 {1 w2 A, d$ b% L* T
3 ]& d" D7 D+ T7 O3 V/ t; mtetris.InitPos();
% {2 ^( Z g& X. d7 J) y' i6 j q return & tetris;
4 H' A: q7 P* k. ?- q1 I# [/ p
; Z( m) P5 _, H8 Z& h& E Z9 s}1 H& [" ]2 i/ N- Y5 Y8 v
" Y6 c5 }8 X9 b5 ^+ p; V" H8 r, K# ?5 C
3 q, Y. X' u9 m" LTetris* CreateThreeTetris(), T& L. @' K5 d( W) q' ?& b2 g
6 ~# q/ h. e2 n z1 h% u
{
# g0 v% v! b* {& L! ~- f& @9 H static ThreeTetris tetris;' S' p7 \# g4 F& o% k! I& Z
$ l& g" ~8 a/ o9 c/ K4 Z% Btetris.InitPos();
! M$ E* \/ t2 ]$ I1 d' G
, r p% {8 ^0 G- _( p) A% p% T. q6 B" t4 M+ m
return & tetris;
$ M2 [; v' s* q2 u: d/ A+ w
3 y" m5 \8 _( `" { _}; l" \& t8 @+ |" O; p; A3 G& c
% I7 s# `( k3 V& ?2 }. k8 o! G7 d! k$ w: U
/ j0 n3 Q5 ~) R0 O* c o5 N" sTetris* CreateFourTetris()$ U8 s6 j$ H6 C$ U6 l) p
% B1 I0 L/ K- I* G2 l
{
. n8 o6 s+ z. X& t& v static FourTetris tetris;9 f% r5 n u" [2 ]0 T3 A
1 |" g: ?$ M2 o2 l6 r6 N3 s; I) k4 c
tetris.InitPos();4 z9 L1 m7 B2 D' q) a5 e
return & tetris;
% f, z& `- {' V* e/ {; t8 A& }: c: ^, u' E
}
: A: `7 _7 P b, H5 C; D9 n
& U0 Q% C1 a9 m2 }' _7 g+ g. F- T0 i1 v2 m. N8 @
- B" x5 z6 X b; V J7 ETetris* CreateFiveTetris()
~4 h; s* p* `: h# r, {: C
3 D4 q0 ^0 I/ C{
% G9 P+ M, ?) W3 V( H6 z static FiveTetris tetris;
1 s( e) r' ?6 R" O
3 }2 c, v& q U2 Z p) X: Ptetris.InitPos();9 _7 f9 n) O, P9 v6 P: U1 z# F
return & tetris;
$ ^' L! [2 P- p7 @, O; ]! Z. u
$ C) U' q1 M7 P( @}
( w9 ]# U0 @- \
. I# \0 {+ n% v7 X L5 r3 \8 z% W( |4 ?
Tetris* CreateSixTetris()2 M, H4 T+ x& }' c
9 N0 G' z5 d. t: h" o
{
! a) R/ k7 i6 ?' Y* a% B3 Y static SixTetris tetris;# S6 m* v( R- T/ v# c5 K0 @+ L+ u
1 v' {9 }& U) B: a" V. }/ g8 `; K
tetris.InitPos();
3 T$ b5 ^7 A* Z8 T/ X return & tetris;
6 D6 { U) V+ b1 J. s- S% l2 i) G8 p" ^# A
}
' {. m- i0 g. K' A, K6 T - E8 j0 I* C/ `
9 m( |( H) r3 P3 s5 O* F( ?: r& M* S
% s+ `" ]% V/ x- z- X) S' l" v5 W/ {' @' x5 X, S9 U8 @9 a( E; Y7 z0 g1 y
Tetris* CreateSevenTetris()
& l& }/ C3 R: f; u
. w6 ~3 l8 {5 k. ^3 R& ?{- u: ?+ {+ ^& g& I" F9 ^5 v b
static SevenTetris tetris;7 r' r$ w u* @( r* @5 _
; w$ O6 Q6 ~+ U9 U7 Htetris.InitPos();' L3 `3 m' z4 s" Z8 T# b- ?. I
return & tetris;
0 }# m; N% ~) U0 m/ m3 w# G- ?
/ g# }+ @2 m. G( \& g' E. Q1 D}5 W {! I% N) C& O W
; o" G/ z w3 m" t/ ]3 R$ Qprivate:5 t7 ?+ g/ s- W' b3 w" _: N- y$ F
; f8 q, @. k5 t8 W- Y typedef Tetris*(TetrisFactory::*PMA)();
" p; M `) G$ c) U" Q/ s/ t7 z- d' F4 Q) {1 u" a1 n3 J" ]
std::map<char,PMA> m_sel2TetrisMap;
3 {* a4 T G6 _$ k; F9 `+ }; O2 u3 d s& U$ }* M; E0 j0 M
& _3 J: C0 y, b/ f& Z
};
) w/ G/ P6 |% g0 ?' N2 ^9 i
4 @+ D9 _" N' s t" G' R# S2 P有兴趣的朋友可以下下来改改玩玩。
# }% y- ?' n4 [+ z
* i% S2 _8 q' g# r8 MThat’s all!
4 G! f2 O0 {1 S0 z
: }% R( l! K; G: H. n% Q7 ~; ^Peter
7 N+ H8 c7 Q0 S( B
4 i# L( j# h; e1 \8 N4 N7 L+ d[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|