|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
1 e- x# e% n" S1 t6 I$ }( R$ _图 1% o5 H% w g; o8 {, q0 D0 E
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
* z3 C+ V& k* W' g8 z F. T b0 l ?8 _' i! q/ i$ [ y0 F
" d6 d% I& T8 y* dFactory的code如下:
7 f5 o7 R% d3 Y7 V , f1 ^1 k, L# h% `" m
/*************************************/ g% P: |1 Z& Y- G9 W1 v) X- I
m+ I6 {3 F5 K0 Q* author:hgf_starlovecpp@hotmail.com9 D! Y! f( n+ b5 n$ K" Y b% y
( f+ { G! B! h' Z; {3 _' C
* version:1.0
J! L0 v( Q4 i$ c9 l4 R3 a0 |7 W$ I) @/ y( z; J- n
* description: just for fun
$ R4 i! n3 b9 E. W7 q( R* w2 a3 b( a% w3 q
* todo: hard code exists need to fixed
/ U9 i7 @2 i+ d& Y! {
* b! Y- L' ^ s" ]1 S**************************************/
( Q4 S) M) @( n E) z 8 Z! j- h( n8 m$ [0 f+ G( k
#pragma once
" z: v+ s1 ~9 V0 r/ l#include <map>% T0 R5 z, J+ ^2 S
#include "Tetris.h"3 E& s+ r; z+ j+ z
#include "OneTetris.h"
* P' u- r8 R/ u% L/ ?; Q# U#include "TwoTetris.h"
2 c9 T% T' g r# r# k$ p#include "ThreeTetris.h"
9 y2 U, Y. |- H( `2 L& I4 l#include "FourTetris.h"7 A/ @$ g. m" \! ~! ^0 m0 a
#include "FiveTetris.h"0 ^; c. R ?$ L/ t b I% k
#include "SixTetris.h". H. v5 B. c( U# ]$ Q9 E u X
#include "SevenTetris.h"
) H. A4 p: g/ L; U5 g F- q
' m8 v8 Z/ {% g* \7 s- Lclass TetrisFactory: T$ @. p! k6 C6 Q* z
{! ~ O$ ~* j4 @1 l0 @/ {* X* ?
public:0 O) C9 I0 P1 p5 r, ?2 a
! q+ ^9 ~- U, w6 p" P
" d( D. O$ `" L4 S8 f" q0 jTetrisFactory(void)
% @7 Q+ C6 r. k# R; n
0 x* w3 { P/ x# z! J2 O% Q' f{" z2 g* q1 P/ N9 w- G
/ L g: {, B1 J) c$ ~" [9 sm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;3 I$ ^1 n$ l7 k& K* y
: |6 l5 ~2 c9 u, G0 n! _, `% |m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
. W3 ^2 l( i/ f! W6 o& [& l; i) R! K, h& i: N
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;& t, [1 L9 H2 n5 U
% |( r2 M0 C; o& Sm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
0 Y2 E# f0 u3 r: d2 V7 ]9 O9 f
$ N- C5 |9 ?+ l4 gm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
6 F: v7 a q( y) c0 N7 [! y* F1 H6 g- h: H1 R/ f
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
1 P# m% U ]; O1 m% k+ q- i' A% U
$ b6 y& u$ w+ @% ]) x+ c! C5 Q; xm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;% L# m) o7 u: O* d: ?
% u+ `+ m; {. d# R0 H
}6 Z" M: A% J4 X* n; O' e2 y7 _) f
public:
; O% p0 }/ ~: P
6 }; z8 c( l4 Z4 e `+ F: C0 Y) B3 Z; [
~TetrisFactory(void)2 Y1 h* F7 }5 H' x1 m6 d
1 \& S, P9 F+ j; J+ \% B3 i
{. d) c& U( B* w$ ?4 S. X, ~
8 Y c5 n6 H9 R% F1 ^, U- R+ U}
% t% M \ ?4 M& x) M9 ]# J$ |# y; I! _1 a
Tetris* CreateTetris(char sel)8 Y z0 p3 h0 N$ O, F4 l$ O
+ p7 G3 r$ O! ?{
. n. I& f( z9 M m. _ return (this->*(m_sel2TetrisMap.find(sel)->second))();
) L3 \; B1 C9 O+ S" a! w: P, _
5 j @; a. {# Q% j T}8 X8 B" J! C4 I, H! V9 c% o
private:
+ T& P( y% H$ T8 t6 C" y! ^& r: a9 X" Y- d6 Z( p, L- W
& V# I+ D0 K5 R+ ?6 L
' k0 |) b& B- i& y; G+ a: aTetris* CreateOneTetris()4 Y5 d& b, M2 W& ]! D
3 v Z7 i& X. }4 m3 L/ D- l
{
; C: I+ P; I- W: b' ~ static OneTetris tetris;
, @' r5 O, A: {0 Y. @% N
6 N% ?6 t: v# _+ L" }tetris.InitPos();
W* C! r+ D D ~$ l0 b return & tetris;5 X+ ?; C+ y7 c6 B$ e/ X& Y7 p
+ E1 C4 k: d# y: q$ m- D! Y6 i}
2 I, `5 s" W' w! L6 G; V! n, x# N! }: u6 O* W) P/ a5 z
! L v& i" X. ?+ O; ?( k$ l2 ~& ^: B
& s' ?; ~% y- w* r3 _Tetris* CreateTwoTetris()' g' z: |7 o7 ?* @9 g
p0 T ]* f+ ]0 B6 L1 }
{4 {- k' O9 s* ]* i
static TwoTetris tetris;/ w; E. d) M/ v# F/ w5 j9 ?" c$ L2 Z! u
! h+ S) o. M. i- ?) stetris.InitPos();
/ {6 i4 K( N# h w5 G return & tetris;
+ I2 s) I9 n9 \+ Q9 h4 P4 N! \! `5 P( [8 p
} n! Q% T+ q* N! P4 v- G
7 q" {/ K9 v3 l
7 J7 S& Q4 O* ~4 k+ {' O: S- x q: h' @
Tetris* CreateThreeTetris()
- v, x- B" m: T+ G4 @! n6 n8 s! R6 F8 |2 ~' B
{
$ f7 h$ T% v8 y0 A$ \5 N static ThreeTetris tetris;
% W4 W1 n% H2 i8 A) `& L5 T/ O' r5 y. ]5 Z, A' U
tetris.InitPos();
7 a, R1 w+ c6 b- b& j
" a h. j$ Q) N7 P1 u" q) f: o* j( x8 {# E5 L) J% U# `6 I/ P
return & tetris;
8 C5 F% S9 j$ o% v& R! f1 W- r* j5 m$ _! o( Q( c+ y
}% d1 K0 C1 D1 b& C! V
! H" W% B& [0 @
/ U" T" j' M b0 w# g8 W8 X6 }1 y
9 y+ ^' @* c8 k8 s9 H1 pTetris* CreateFourTetris()/ Z2 B" q$ [( A/ Q! H( I4 s
% z4 K" g9 o+ S" a
{
7 Y @3 Y# F: |# |9 _ static FourTetris tetris;
- J, B. f8 ], u( C/ d8 s8 _- [# f: G4 l3 w1 q
tetris.InitPos();! c. ^, c/ g4 T* j% f& t
return & tetris;" \+ \( V9 C5 H/ ^) }
3 M, n- j" i. y7 K}/ G) o" W0 F' T
1 D% T6 x5 X/ v; U. R' `8 E X
0 N; g' V/ X( U6 N; O# _/ h6 e
5 b3 j. t3 W1 L" |; t0 r. T! F
Tetris* CreateFiveTetris()5 A! C5 @! o7 @7 u3 d
5 H+ M0 k8 N0 X: }& G{
* J. k: ~; V' f6 j9 T* _ static FiveTetris tetris;
1 D7 P5 `+ c8 i0 a& Q8 ]
. c) r* S( S1 b: ?9 U" m2 h7 j Wtetris.InitPos();
- @, z3 }; H1 s* L2 G, w0 m return & tetris;
4 ?( b, J' ~# p& e4 F* m- s$ K5 _, P1 d2 @) y, W
}9 U, g8 \" j2 T- b3 | L9 y
. `8 l% V' s: b! T+ L5 h7 \6 ?& u' R" p* o- v" {
Tetris* CreateSixTetris()/ v& f& b$ g$ A' k( ?3 o
0 _( s# W1 Q c. Y$ l; i F$ @3 z{
1 B9 \! [' @( R: b" i/ j% y; e static SixTetris tetris;8 l g7 m6 ]2 ?9 d3 B, k0 M
, ~$ k1 s, Y. _6 D5 c
tetris.InitPos();. A% R4 H, L+ P: Q7 C
return & tetris;+ W+ n5 r4 k3 S/ T
\4 D3 Y# f) Y# C; m5 Y# t; l
}
6 K. v, ^2 `$ z" t7 b: u / ~- \0 ]0 D: c8 I, s
. G2 d' Y/ P! G7 j' w# i# K
* \: O% K0 u% K# [9 ^9 e
7 q" w3 B; c4 H! J' x$ v( wTetris* CreateSevenTetris()& Y: X# b, U) D1 ?9 Z2 m' a
" G! _* L/ A9 d4 ]4 J
{/ N: T% }. R- E; d" B
static SevenTetris tetris;; q( M$ r0 V2 E6 ~6 _2 h
. {' _: R9 S/ t2 ~! c, ]- V) d
tetris.InitPos();
' y) `) a7 F8 {, k' G; Y return & tetris;) |- O% J9 M, d5 v. [, U
; [+ d, u3 F2 c% |4 _ D9 \# U
}
$ z* p; N6 ` v. d ; I$ u" j: T8 q( a0 R
private:
* ]9 Y* s5 A; Q1 m# u& N I
9 }; I. g" u ?6 d7 x typedef Tetris*(TetrisFactory::*PMA)();
2 N, V, ]0 u3 v& s0 k+ D' W1 y& J$ h3 b+ b' Y
std::map<char,PMA> m_sel2TetrisMap;6 G- o: Z7 Y. `5 F% w+ O ]
{' m/ J$ M- \8 z8 L
% b$ G) x5 l2 i. ~4 ~1 v};! G, E' Z/ X; y3 F f
# F& H5 r' S! Q% X" O
有兴趣的朋友可以下下来改改玩玩。/ X m* s) @6 h: B" R" \
+ G @: h9 D) ~/ S. m& c& tThat’s all!
( F/ g2 X: z! _5 { ) b. W, }) I4 p9 L' i# v1 t; o! N
Peter $ D7 B3 o+ d0 C
+ u% [3 H5 {# z$ D1 O: h3 F
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|