|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: 2 Z, p5 c4 \: K6 a
图 1! u) i& G) O% {+ v$ e* q2 M
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:# ~6 c% U# m0 L
) h4 S7 L9 ]5 ~3 C I4 o8 @% u; N' G2 X
Factory的code如下:4 o) t2 _6 T7 H5 R$ \
9 w/ X* y+ V( [. [* z2 M3 P7 g' M( G+ N4 E/*************************************0 I5 P/ _6 f: e) X. `* j' J
- [8 Z% Y, _ D* e/ }1 z& U$ s
* author:hgf_starlovecpp@hotmail.com# S, g9 T8 \' L
! k' M0 R% g/ k" c5 a9 {* version:1.0
1 \) {, X2 f0 X8 B! @$ g0 {
4 b H- r' e" t/ h( E, r$ E' Y* description: just for fun% C: s4 e6 E' r
" v& _5 `# v# ^6 J; }
* todo: hard code exists need to fixed
! r; Q# p4 ]8 q5 f
5 y+ C" r% K# W9 K7 V+ [+ J: {% b3 [**************************************/ a/ x, @0 E _1 ~" R9 n7 f E) m
|( ^- w6 {$ ?. R2 X$ o
#pragma once6 C3 J/ F5 D3 W
#include <map>
& ~4 R, E, V3 y% C( M#include "Tetris.h"
/ S7 K$ |0 N! a* g( L# P+ C#include "OneTetris.h"
/ l0 V- I$ y4 M# [#include "TwoTetris.h"4 }' r! V& \( v4 w8 a. w
#include "ThreeTetris.h"
l+ x* f7 n! u#include "FourTetris.h"
+ l& K, k0 v3 D3 T1 }#include "FiveTetris.h"/ C- L: l" C& b- q
#include "SixTetris.h"! [8 v% \% \6 u) e
#include "SevenTetris.h" h* t d2 Q" U3 u0 I1 D' O5 p+ m
7 p& x- S D! ?$ |+ S* J. a' N/ F2 U' ^
class TetrisFactory
, |0 n& Y, C W* d- o* c5 `2 j{6 M9 e2 V) c8 A7 L. F- B# ^7 `
public:
4 k# m) S" x, B0 u ? 9 T3 H6 P$ @7 N2 S! `0 E* A6 z
& q' b8 g @+ ?9 ?! C* K: H
TetrisFactory(void)
0 A4 G2 c$ z% A; P+ w0 E
1 X: a' f6 K4 [* y# t{
0 Q) [+ N/ l6 s* R9 p3 v) k& `" s0 x: F; V7 M/ } B
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
- Y6 A: F g+ ^8 z0 b+ f- x# `9 ]! ]
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
; e) q( |1 l5 E0 N0 o. s0 M
6 i o" W: x2 Q3 Sm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
8 H1 t8 T0 I, f9 g' X
9 Q( y" h- s, `8 @6 n7 {2 c& J5 Vm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
1 o+ D0 i2 J; s. }" c- k+ [" w& q* _, L) H# ^# a4 V4 E
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
( `- a0 r% B8 f# _/ s7 L! h/ V4 J* x3 E: Z( z! C( e
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;' ~6 X( L' |0 l# |
/ q- d6 y) J5 K. s$ qm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
5 z7 G' u1 c" B2 N
. a! W& U7 n4 R- {7 L5 K}
4 _8 o. M2 ~* ]1 S( g/ Jpublic:- A. P" Y* N7 `
5 g# k5 v' E2 r! g8 f) t
# \' P3 z$ I* Q( a) e. L7 y3 g~TetrisFactory(void)- W1 f: e# w, a; @
0 \( W1 n7 l+ S9 R% H1 X! g. A
{3 t9 s' W4 q. F" P, S. \
, D: s3 _$ c. }* x H# \/ t
}, e4 r- I% W# U; E- T0 U3 r
8 A; G! F+ U4 ^, s" D; [Tetris* CreateTetris(char sel)
4 x! r) N; J. Q& H
! L6 q9 ?% }& ?: U3 w3 `{* W2 b( r% a6 I: N }
return (this->*(m_sel2TetrisMap.find(sel)->second))(); C5 a; J O7 n1 ]6 A6 s \, n
9 }; F6 Z+ |' L- ^; h. a
}9 L. H( g8 {( z
private:3 a4 F7 W1 |/ Y1 P+ x& w* B8 k8 S0 ^
3 K- D2 U B. N1 S i/ F0 @) ^0 @9 U* l3 D2 P! `
4 k9 b) z* S. Y0 [5 x% w
Tetris* CreateOneTetris(). q4 D ~1 W7 q b; w
' _7 T- {; H) D2 V; ]/ P; d
{0 `! K/ g1 w# O$ N4 `( n
static OneTetris tetris;. c: G s* z4 A+ j# X* G
2 V: f& e7 V" |; k' R$ h p, X* l1 Ltetris.InitPos();
' b0 d4 h" m# A& b- N2 [9 | return & tetris;
7 e, C- w& Q& R! q- C$ P* U+ j
5 k$ n# G& P+ J}# I' |; H+ g- p
4 M' q' H) ~" g; `/ f* g, q
: |, _' w7 Q! M8 e* ^! w: d# c, Q
Tetris* CreateTwoTetris()
8 B9 a3 G* p, C& h! d% e8 i) @+ d* B& ~7 \# o U
{8 f3 M! Q7 q9 E( P; V; e7 a# a2 |: X
static TwoTetris tetris;
4 G3 m8 G: k( l( s9 N- D: n: h, h. a/ r8 C( [ E) ]
tetris.InitPos();
6 F& t) y/ p, l @( G return & tetris;
& U# `9 d/ ?# {. k7 |: h
" S% W0 ~- P, I}
( R1 J$ B- \- r5 V6 x4 n* r' l
7 ]6 ?& y8 \: m1 ~; { _4 v
9 l& A/ ]" x, K. W" N. G, w
7 r! k0 k+ ?, ^' F3 [, X8 lTetris* CreateThreeTetris()
8 |; H4 h; O* s" e1 C8 n* e4 ^3 W
{1 K4 \9 s3 v* n0 q' \* F+ H
static ThreeTetris tetris;% Q# {/ s- \2 A( W
5 B' \# G. S6 m" H' F% Ctetris.InitPos();2 Y- }. w( {1 V) \
8 x, Z5 f. Y$ C3 a% F7 \* c( v* x/ j2 y
return & tetris;
! y) m ^3 r% F9 p0 J" R
; R6 H# z' k. M$ j}$ n3 Y' d% g W* {0 ^2 t- S
* x+ V4 b6 M3 H; {; {2 S8 Y; x4 t* L
% H; E4 N3 P L: R
1 _" H) M# \4 @, g8 O' KTetris* CreateFourTetris()
7 r+ n8 \" k' F; z* q: a+ t
; A2 t; J, U+ g' E( R- q{
5 S% I7 @! h" s: P* _$ d static FourTetris tetris;% Y2 B5 {6 f( H* D V+ A- U8 w
/ i& l: l, e5 r- `; `tetris.InitPos();6 l+ l6 j7 T+ \4 c
return & tetris;
+ c; C+ C9 \2 b9 ?) H. ^
$ K) b: N% K! j3 h}5 ~* p' p$ }0 \* j8 w: P `0 [
3 |* U) D" C9 R8 ~4 |# X! `! i7 G9 Q. }$ a Q) t
+ L" X4 G [$ ^4 l# {
Tetris* CreateFiveTetris()) u8 ] S' w+ ]8 D( G+ D
' O. o$ c' y; R- I% e$ Y: @! [
{! Y$ v. @! |2 A r! T+ s& w2 {& _
static FiveTetris tetris;5 Y* U4 v% d+ k! A1 G' t
; X+ A6 x3 P# }
tetris.InitPos();
+ w, z) ~2 M( p" D7 L9 ~/ W; n return & tetris;
* A$ L: p, Y, A2 `6 _' Y6 `) E' K. O# J# f. D8 h8 `
}. d0 `( o8 y. t
6 @$ {! E/ Z X! o7 z
7 T/ s% I: v' |$ b* J
Tetris* CreateSixTetris()& T7 [4 t6 n' q
( H( k2 H( \. G$ ^
{0 G e2 }" }( G& M: i2 j/ Q
static SixTetris tetris;: ~$ T! S" h; \+ |6 Q& r
) A& m1 i( s6 g: k: F$ Otetris.InitPos();; W2 K& O' k+ o9 U' Z$ T* y
return & tetris;" t6 o) ?. B# w6 E% k% x) h
, b) z0 q) B) ~}5 Y/ C/ j# H {2 |
) D3 X" _6 L; U' @1 D
* g/ V. w2 l% ]4 b) B3 l% F
) h0 x1 d, l: T. u3 o& B9 h$ f5 O/ g' K3 | _
Tetris* CreateSevenTetris(). V$ k" C4 K' D. E/ {: R6 r
x# \9 i: I% t6 Z- {
{3 W$ k8 u; @0 G6 s" g, G
static SevenTetris tetris;' d( C# P& D" T
: x. Q, j2 s$ t* E' Y }6 Y' Mtetris.InitPos();% P( x3 ]% G9 ^, l' M* T% p
return & tetris;
+ \4 L# H1 Y; P' r/ P. Z
3 O) U+ Z# M X5 p3 h}" L2 o& B# h& b; z- B
) w' z/ T# G2 v2 o+ rprivate:% h( Q9 L1 X& T' j) F
4 Z. k8 u1 l$ N0 n typedef Tetris*(TetrisFactory::*PMA)();5 l7 V% r3 ?6 O Y$ N: a- ]- L
" p3 |1 u- R, p, [: T6 h; Tstd::map<char,PMA> m_sel2TetrisMap;
, x# x2 R* ^1 e" D0 O
/ ~' V% \4 p" L* h! Z% h0 O
9 l$ r" e* y! T( R};7 r) H$ g% t& j G; D% [* D
; u8 R" Q, ]; w
有兴趣的朋友可以下下来改改玩玩。1 l% j/ M4 _& D, G- Z
" O1 e l+ x! M% ^9 n" lThat’s all!! c$ @; \; ?1 V! L7 y E2 E
7 B4 u$ {5 j8 ]5 Y, j$ k. l4 _+ OPeter 5 J3 H$ Q9 B1 {9 o
$ c% l7 b+ c2 `; m
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|