|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
8 U" c8 B% b/ O图 1
: {$ r0 c* c, h# w. h; V9 U& y完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:6 F/ X2 w+ K( x
+ H# f# C" }; A! `" b a# K
2 z/ f# q" p) S# ^ U9 OFactory的code如下:
2 a7 i- c2 i: k! ]6 t ' s1 _9 j) u" U0 ?9 e; Z7 U$ Z% N
/*************************************8 K$ X. |& b8 `6 P2 N; E
8 E" l" m) ^8 y- a' \: \9 }
* author:hgf_starlovecpp@hotmail.com
: U3 ^0 v* o$ T# B. S; T5 ]) V; ?4 P `; ~
* version:1.05 e9 V0 P# S) G; b7 U. f
% r# [( u7 \( R& v$ p
* description: just for fun
1 d3 `# ?5 h: Y- M# O9 E9 {, a- L
* todo: hard code exists need to fixed
/ e/ F2 C3 |4 D& | m5 G" _4 ?/ }6 P" {% [
**************************************/+ w4 S: o% D/ _6 L+ }: b5 c V7 F
& ]# v$ s1 M+ h4 U6 J$ a0 a
#pragma once9 B4 |# |# f! z' u9 e3 ?. U, o4 V
#include <map>- Y3 t" a# a+ Q2 I( z) [- [2 ]
#include "Tetris.h", {$ L6 ~8 W" g8 E( W7 A) Z6 r
#include "OneTetris.h"
+ r0 F! | _9 D7 A* a#include "TwoTetris.h"* k$ K( d2 U8 p2 U+ s1 _
#include "ThreeTetris.h"
: |3 H1 V1 B# k/ r& c#include "FourTetris.h"
- a+ z2 U+ ~# N8 a#include "FiveTetris.h"
7 \0 q, |: Z. D8 ~6 o2 ?& n#include "SixTetris.h"
, h! k- X$ M5 P9 i: _% G0 s& C# Z#include "SevenTetris.h"
. ?/ _1 A' \, X
P3 `& q7 Q0 Y$ k( Q1 ~class TetrisFactory
. v* \- z, m) N6 r( R{- K+ C& S1 L8 u6 u/ H q
public:4 b- |# c5 c- y: {; X9 i
; g7 J* g+ v& x1 u2 G8 ^' v* l
* O# a0 f- \) h* [+ ~
TetrisFactory(void)2 ^1 f1 h9 ?$ N+ ]" V
# T8 l8 X- ~2 I( }6 d
{1 U q# P5 v* v8 i8 Y( w
) [/ I2 ` y* T: e( E tm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;: Q3 l* g9 G y) I' |
; o& g" h: R) im_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;. a9 {, f& P& q# @ N" L
4 D* b! [' v( ]* j1 X$ Lm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;! q) h! U4 ]0 B" x
- G% p$ j- ^& _& P( j' t' C! q/ b
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
9 d; d4 h' z" X
, H# x4 \0 z- qm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;' I* s! X i2 ~* d
$ h2 q1 L& x: Fm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;/ S0 K" L! Y5 E9 d! }
5 q5 r* U, `2 G2 Z; sm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;- E) z) W- @5 P" M; _/ U b
7 K, p Y/ K2 Q5 k
}4 l6 W+ |% G& t+ ?) s3 ~; s7 w
public:" P7 ~) ^8 d! ^$ [; E2 O
O, X7 C' P, D' f
% A2 E y' c7 B* u& v2 t7 o' o7 }~TetrisFactory(void)
8 m: b) }- U9 a5 U
. X$ E1 `* q- O/ i{. N# R2 w4 K5 C2 a: c+ P3 ~
9 r$ A/ s; D' R6 @; n7 h- w. B}' N& C! x7 @/ \. G+ l Q
4 @3 b8 }# H! j+ ^' P/ I+ DTetris* CreateTetris(char sel): q2 Z6 v' N+ c( {2 x
: ^9 I& O9 ?8 t! M; p7 Q8 Z. z
{2 |9 K3 b& g2 I% P6 h1 x
return (this->*(m_sel2TetrisMap.find(sel)->second))();) I7 V! f) V# e& k1 G+ Z' h5 i
0 { F4 U5 {) j. ^}. B6 L" @+ |& Z, x7 P0 k- x% T2 i
private:' ~1 ^9 t" I6 X
( s% G& |' W1 T) ?
* I8 i+ o6 x$ ]/ ~) T
7 m9 z3 C; z& H" x
Tetris* CreateOneTetris()2 ~& @/ ^9 p4 N4 ]$ c
4 {. M8 `1 Z9 T5 r{
7 \1 ?/ r& u5 p$ Z4 K static OneTetris tetris;
; E% l* b% ^( ]8 L6 k
& g8 {! ?; y6 k: W4 xtetris.InitPos();
+ O: q) m" g* O, j' A: T( F return & tetris;) q1 _0 { a, [- |% i' u
( g* C5 }: J2 A' D; i6 m% h, a5 ]+ N, q
}
- r- v. g9 |4 @% {2 U$ U8 G; B# l4 r. C8 P Q
& A& [7 @! `; a: Y3 w/ Q4 R* g7 M
4 |7 V3 ]0 S% ]) C9 c& |4 ATetris* CreateTwoTetris()
( G% _4 g2 U) r* ^6 g* Z# v( C: R) W; V O z" w2 v: V
{
" z8 F; h5 s# y# m static TwoTetris tetris;
6 q3 |8 O6 R1 u/ f+ x' ?
$ X, P- s+ D; d4 |! J% j3 R% ytetris.InitPos();4 R ^2 q& y+ U) f# A
return & tetris;
h/ n* N e( x
( d" i& Q/ \* `0 p2 N}7 w3 J) ^0 j( ^+ H
" s) ~9 I% Q6 W' U1 ?* w
4 b4 Y6 p' i; Z+ D( q3 ]
& g8 ?# x. C3 g8 U! Q9 i
Tetris* CreateThreeTetris(); I- \) Q9 i* c0 x
* ^4 w# X5 p; ~6 z. `6 C
{
2 `' I2 w5 ~# R# ~8 I! k static ThreeTetris tetris;
* q% y2 h: `5 t" H8 y" d# P: `- H3 o! T$ A/ x
tetris.InitPos();
$ U* y4 v! R+ n6 G* _0 \3 I) |% g0 b5 {* Q8 N0 f. n
! ~5 w+ @8 _1 L- a9 Nreturn & tetris;
1 \0 x* j5 b! X% ^) A& E
8 G$ G: g- f" ^; ?& v* M}
1 E2 |; ]: q& k, c
4 s6 k: m- ~! U9 l
( f3 W; k# @8 C! }' C7 E0 L$ f! g) N
Tetris* CreateFourTetris()$ R, s' c% C0 n8 P1 M+ ?5 X' t9 ~
- k& Y: Y6 D4 }1 n5 }9 m{
- V0 `: h( N% q# g! s- K$ {9 }& i static FourTetris tetris;+ g$ V- k4 v! s$ R0 M
1 Y& G* F" T% E0 m$ ^0 rtetris.InitPos();$ A- C' {; q0 ^$ [1 u+ L8 b) w. Q
return & tetris;
$ \( Z# r3 }" ~. M# d) U' i9 p: o6 B' m
}
3 t, p& Y$ L& i1 d: l" c+ }# H; Y2 m6 L
$ L7 r& B. r5 K1 j9 {0 Y" P5 h' O7 P
6 P0 U+ @. T9 C4 f" P5 h' MTetris* CreateFiveTetris()
: _/ ?! _- \# ]. Q, b! G$ N& n6 ~8 N, Q: `( k! M
{
% e* u. x8 P- ?8 h6 L0 i' g static FiveTetris tetris;$ q" ^( J9 Y3 O( N4 W2 G" n
3 P- B1 i! z9 W. t2 K! t& Etetris.InitPos();
+ U4 \! i B2 P. U! E) i return & tetris;( _4 u+ ?+ e& [8 _6 [, Z& f
, Z2 ~/ d6 u# q: A
}
0 V) u( d5 N f, C9 l9 J
6 f* F, }0 o2 M1 F7 Z+ E- U; Z8 V8 k/ ?: R1 x% @- [: f6 G1 c7 }
Tetris* CreateSixTetris()1 Y2 F8 j3 {4 j7 H4 z5 w& T+ N
- M$ k' N- V8 h: j( C{
$ F7 t! d- b. p" X, J/ ` static SixTetris tetris;
' \9 _9 q" e4 U+ _' A) b% }: q$ e B4 q' e& u( D
tetris.InitPos(); w& g' |) j# e) N9 Q! A6 W
return & tetris;
+ }; s7 @- m, U$ X ?/ J' r/ x$ H* |+ t) E3 L
}
1 Q. a- ?# y5 B: ?9 e% A! ~ ( R" _, F( G$ F+ o9 L# D
- a- z" |' j4 ? \0 U* _+ g* B5 u3 K; M* s, }( {
; ?; _! T" ^ y3 o4 C6 dTetris* CreateSevenTetris()
" K. b8 f! t& i$ E6 C9 G* C8 z4 f. L6 x* j5 S( z+ C; {& v, }
{
( }, T4 @& @- O; p7 o% b static SevenTetris tetris;& q8 j; E! f8 A9 Z& ? n8 ~
( }/ J& q! ?; j& M% s0 @& p6 R& _
tetris.InitPos();1 M$ W( ?3 [/ J4 L; `5 F/ W
return & tetris;
( l0 W' n w* e
5 F" i! w9 ?/ o}0 A, D' r7 m4 K, }) V
" ^2 g) c+ G6 R5 ]* ~1 R# r
private:! B9 ?& S5 z3 z. ]% y
1 \1 V0 K7 a4 @ k" f& }4 j4 N9 ? typedef Tetris*(TetrisFactory::*PMA)();5 o. b) {2 k6 H6 Y* F" M' v, w/ J
* w( I$ v' g$ k) q! H2 ostd::map<char,PMA> m_sel2TetrisMap;
: D2 o6 T/ Q: M( Z
# H3 a2 Y- X5 @( m( U. H' A/ ^3 L" ~9 p( \
};
6 l& y/ t7 v/ T- a, q! {% w8 O 6 b* q0 I2 V8 t# ]: Q
有兴趣的朋友可以下下来改改玩玩。
- b4 h* M! T/ P8 n1 g0 L ! `3 n4 V" c# t6 _6 \2 z2 f7 C
That’s all!
9 C+ T7 C- A1 g" d2 \ P
* l6 \9 ^3 L, i& p9 T0 JPeter 3 a3 |( X2 w: J# M$ I
2 Y* u8 R5 j' b* T! A d
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|