|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
; @# F+ o+ k0 @5 ^图 12 e9 Y7 a$ ]# B; G [/ K* l
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:' Y2 _; Z0 f7 g* @) K8 k
3 Y% b$ ~( c. @) B% z$ _" L3 U) Y( a1 E+ z5 h9 {
Factory的code如下:! G" O1 E6 j! Z
5 N/ ?* x$ ^, U/*************************************
9 v) {5 A6 d. c2 g$ ^/ u
. M" x+ Q: R8 d: |* author:hgf_starlovecpp@hotmail.com F! O1 o; v W5 k q
) X& |& H# i2 X5 m* version:1.0
/ j; h9 R) k8 f, R# Y1 n
/ L5 i! ~8 g) m- x+ K. f" j' D9 L* description: just for fun: `6 p1 f' d$ e+ T
! j: u7 o! o, y, t
* todo: hard code exists need to fixed
7 Z3 _& B; O; Z7 _' ~
$ F. o! e- d' T& c+ r7 c/ l9 {**************************************/
' H8 E; o5 }* {# c
! ]/ l9 s8 H0 o# N9 J; ?. O, u#pragma once
! j8 c7 b& I5 z2 ~+ b2 q" w3 S#include <map>0 w3 c) O. p& S3 {$ H
#include "Tetris.h"0 Q% x9 n& o7 V( ]1 V9 n
#include "OneTetris.h"
) P B+ _0 M o* z; O#include "TwoTetris.h". ^" ?7 `; j( d' O1 p2 ^
#include "ThreeTetris.h"
. X/ W2 C7 E( C#include "FourTetris.h"" l7 x+ i( ]- r b. z0 k- g
#include "FiveTetris.h". Q9 F3 ?9 \: i9 v, v( ~$ ?2 s6 y
#include "SixTetris.h"
5 `( s4 s8 h' R4 a6 ]7 v d#include "SevenTetris.h"5 r: w3 l4 S1 d+ m: T. ~
) e& N% ]6 [, I G( s+ xclass TetrisFactory
1 @9 |: Q! z; ?) ^% X3 U{# s" W3 \* D0 @5 y3 Z+ T- ]2 v# N
public:& g- {9 k1 _! f. {
2 I( Z$ q5 Y/ \( Z# j6 z. ]
1 {5 _+ ] W, S- n% T
TetrisFactory(void)/ e0 u8 l# [# U8 F' E. C2 Q
# }3 x2 O/ j9 M! h- n& O{
$ {$ y# a" A* p7 k9 ?5 X$ }) t6 x8 {
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
4 z" I: X; A$ ~! O" x: T$ ~ r. Z/ j' c5 L, S* Z. ^0 `
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
. [9 m8 C) h/ ^( }
7 D. G7 v# r+ q, f! pm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
! T/ M/ X) {; V; f7 j& G0 ~6 A# w% e" H# @
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
2 H( l. }, d1 B( g- V
1 W- n! \/ t+ l! D! v5 ^: v1 D& Vm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;2 R7 x2 U8 N4 h3 y# x1 I- ]- D
# f* m& t) j2 w1 d, `& l
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;! ^5 W# u7 g, k/ O2 g# |: C
0 r% Q3 s: v5 N: S. L( k
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;4 |4 Y& F8 ~1 m
, l6 H; o6 {7 Y6 R' ]
}% w4 {8 C5 {+ _/ z! b& V& o
public:
- S6 ]0 s. Q* t7 b# Q0 a# A 9 y( E/ b1 E s4 N+ b/ o
; p& D, w3 c! u$ C. ]5 p# W0 I1 I
~TetrisFactory(void)
, g5 B' q) T! C( d! f1 ~9 m1 B! [" Y/ x
{
" ~% w& G+ i; k* O
3 z& t8 A! `( ~# [! o5 t2 z5 z}" W, n! p3 R: @$ B' z1 \
) d( D% r! p" p' q; KTetris* CreateTetris(char sel)
$ ^% X8 N+ @1 J3 G" \ s
: |7 R" Q3 O& g, o0 w{
; b( y- X0 r2 ], S$ x1 m3 C, e return (this->*(m_sel2TetrisMap.find(sel)->second))();
( C3 h9 L/ B4 ^; r3 ? D9 d D: y( j: G/ L4 x
}
5 K# t/ I& p& L% f9 bprivate:# e4 \% N" i" ^% C. t) t8 h" \
9 W+ D/ }2 u4 F0 D
% E. ]0 s t |% h( l
2 x9 ]# s Z' r8 x+ \) j& z& l
Tetris* CreateOneTetris()% s5 K3 b8 _! m% G2 }) i4 h
% D, q$ B7 W% l1 g
{+ I: l8 C8 N; W: y+ ^1 M% h# O; [
static OneTetris tetris;
: M7 B' D* Z/ n
: N: }! w7 }) a( @ l) }$ p: Ztetris.InitPos();6 m( |/ x' l' U" V
return & tetris;
. ~" L0 {: j5 V0 @
, g. P, s: e/ A}
/ V% }/ r7 b! i8 Y0 U' p+ w7 F; o: g. E. W. K
5 B3 I i1 W' L5 D: E$ B: {
+ ~/ I( a8 J( j0 J7 P
Tetris* CreateTwoTetris()0 q% w0 \, S0 ?2 F% ^
5 G7 d6 y( s9 b# n4 \{
3 T4 Y+ c8 n8 I$ k static TwoTetris tetris;3 X( g7 z9 N& H* e2 p* Z) e
) N" {8 i% `+ T# S6 r, v" ?
tetris.InitPos();8 B6 C+ G4 ?! D
return & tetris;. u( w2 X, c1 @5 x6 u v- `
9 i6 o& a* ?# S! p! m0 A4 p0 `}
+ `( E; F8 U& n/ _2 s1 x1 P
% G" {0 |9 c( R6 P" l8 {- p- B, ^" I% i$ M- r3 a" L+ d# \; L" p, x& `
2 e! R- {$ l8 o; F" z. ]4 a' kTetris* CreateThreeTetris()/ m1 Q( f+ i& J: }8 {8 v$ E1 q% r k
: j1 w1 v/ a5 y8 {{
- H$ G, \5 f+ C5 n# J! \ static ThreeTetris tetris;
; k3 c3 i0 Z" O3 R
; ?) X/ J! U- wtetris.InitPos();
1 P( l! g9 B2 o: E Z2 K. m
5 O/ E- d4 ]/ J ?- m" p- C5 ^
: C) u q2 g, L+ X, I# A7 S0 Greturn & tetris;! y8 n0 Y" m/ c/ }2 V
/ q4 M a8 B% `( c0 f4 K: P
}
; r- ^6 j& D& h/ z* W$ J* _5 s o& E; _2 r# U1 w) o' x
1 Z! G+ a3 N# q0 F* T3 u* ^) W9 H1 e( u1 s/ J
Tetris* CreateFourTetris() b4 C- z0 d9 @- D8 z
1 E- H$ N; O- h3 O% P8 k{. J$ z+ q; O+ c% \/ {
static FourTetris tetris;" v( i! J* V: N: A* j
7 G. l9 n Q, U6 |) [% D
tetris.InitPos();5 `6 z- J+ Z1 y" b- m9 r" R
return & tetris;! u( N$ W8 V) W) k# H, {
) o4 P7 ]; O6 a}% u/ J; s' G3 G1 u' |; h3 g% ~# d% ~0 ~
( J% D1 d0 U# i9 s( I4 y
8 T- i- e6 ~5 E6 [- a$ h
4 L v& X9 Q/ [, ?$ x9 p8 h
Tetris* CreateFiveTetris()6 R# c, Y u4 _
, P7 c' Q, u t" Q: F# o2 P4 t{
3 F7 G; P- c" d static FiveTetris tetris;3 ~) s/ r- F8 x
2 R' K' R3 i J* E3 ^
tetris.InitPos();5 Z% C, f6 r/ w' W v
return & tetris;- n5 s6 \; B# b
5 _% n7 y- ?4 H
}
: ?4 Z8 f9 @# z6 E/ d7 w* a 7 |) K5 j; C3 [: G* ^
) i: O7 I8 `) m5 a
Tetris* CreateSixTetris() N% H, N- \2 K2 l& H
$ I4 b3 c$ }6 n# n5 x" n{" n4 ?/ h0 m( M H2 O
static SixTetris tetris;
" N' L1 L+ P) M/ b. _9 b8 f( U; [6 u# x6 I& L6 v! z
tetris.InitPos();
0 ?) r) ^+ d: c; v/ @ return & tetris;
# j0 U, J* C& `6 J: G0 B4 }' }: O8 \0 U3 P: z; y; R
}- S/ R) u& S. H0 r3 m
8 b! b* E$ E: Y. E
9 h6 _) ^2 q- Q! ?; R- ^
T2 f4 x, v4 z& h! a# A
O- K9 ?5 n$ {1 B. J sTetris* CreateSevenTetris()
8 F& D9 u! W. b+ J* D6 U# D
5 ]6 i9 j% h" f: I{" l6 a( l) }" G: p! l0 m6 G& w
static SevenTetris tetris;6 k/ [- n, A0 F. M
* S7 o; `/ f) |- B5 M* E! ]
tetris.InitPos();
6 k1 M! l0 G% j0 f# P* B return & tetris;7 o7 B. o( d8 d$ S* _
9 L8 S8 e4 m- U; B6 _}
9 f3 h# c5 J5 B) V" W& \- p 5 [9 |& b5 `1 `; j; D5 I0 {
private:/ a9 v: e, F! f, e$ l7 K
, M- p1 A- \# z; `! [3 c typedef Tetris*(TetrisFactory::*PMA)();/ k1 u" P. ]4 S3 @8 ]$ P9 K) I+ @
2 f5 \$ ?0 G3 X! b% e; wstd::map<char,PMA> m_sel2TetrisMap;
# x) u9 i& Y/ a& n2 g+ ^, E' ~' b( p* |/ b/ S( q
0 V* {& @- i3 T3 Y! l1 P. O};* a* C$ J: w5 o
6 F. G' z! i& x/ q: d4 a有兴趣的朋友可以下下来改改玩玩。
( S& M( i8 B$ ?* y. m! u
- P. s" X0 m6 Q4 nThat’s all! s2 T) k- G( N, ]( J& i' I4 h0 Y1 j
- X! ^% S" l3 p6 z6 Y4 bPeter * X, G9 D. W" `: N# l, O' H
- F6 T# t- d; Y[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|