|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
1 d- I$ Z: V/ L$ {3 C图 16 W* h# H6 [7 _8 m' s
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:7 G1 A0 y$ G7 H) w3 E$ |" c8 c( D
7 L/ B4 o. z. x4 o
4 P$ y' o4 Z, b" {/ _) d( |Factory的code如下:
$ R7 e( Y$ P5 V Z$ X ( H- k# S" O$ J0 c
/*************************************
: j7 ` L/ [7 v, ^$ k. h* B
' ]/ N+ H$ U7 d6 C1 l3 y% I* author:hgf_starlovecpp@hotmail.com5 t, {& @; {9 R* @/ C
V/ Y+ ^4 n4 f+ B- e- L F* version:1.08 v' ~ \- k: U' q: [
* n2 V( {3 p; s0 K
* description: just for fun7 s' v% ^& ~! O' r: O
X5 \) T8 d0 ~; W
* todo: hard code exists need to fixed
1 a# F( o, w; _8 c
# ~2 p* ]+ @$ h- H# ^& T/ B- Q' n; ]/ M**************************************/" [7 \1 P+ p, d# R2 r
' m& L" `( ^: Z' o; Z5 E* H#pragma once9 K; ^9 `# j3 I
#include <map>' c; v3 [* @) i; ^4 |
#include "Tetris.h"( S- b' ~4 X1 i+ @7 [$ C
#include "OneTetris.h"* z: I8 Z6 c. m7 L: ~
#include "TwoTetris.h"( R2 w) i& q/ L+ t. I# c% d
#include "ThreeTetris.h"$ s4 V/ u% l* |4 a
#include "FourTetris.h"
4 |+ U* t& {" Y8 c! M P#include "FiveTetris.h"
& w. I, p j, A#include "SixTetris.h"
8 B+ Y# H: \' t. r# _# s1 ^#include "SevenTetris.h"% L! W1 I/ ~) D
& o' p1 ]: f: v9 @
class TetrisFactory8 }+ f5 ~9 N0 ^: n) |! o! b4 L# z
{7 x1 Q T* I3 Q2 v" ^" `* R
public:$ p. B6 g5 N" Y9 O1 M! _
2 Q% z1 y: P1 ]3 @
4 k/ a4 H! Q* _7 d& K% WTetrisFactory(void)/ p j$ W! A2 Y, M( |! Z$ {
/ J0 B) M; X( v
{
# J' D9 i+ Q) n3 D# M7 P" B' r! Q+ P
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;- |1 a9 h* q- F/ I @- _- [1 c, y. N
1 _- d. F* @' r" R& D
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;$ N" _, [# L) |4 ~% V' C: M1 v
4 K+ g3 ?, B7 r d1 C0 nm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;# [% ^8 K! _' P/ h+ x
; K* ^( M e6 M4 h9 b8 ?! a
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
9 J( l+ {$ [* ?) C) g* r' \
- J" x9 v1 E* _" d, m7 Um_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;! P, f$ J l3 S7 n- i; G2 D$ o1 w
) ]1 {4 _" s8 R8 e! u9 r& B) F& ^6 tm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;3 \* u; }7 F1 {5 F7 o1 ^2 r4 b" `
4 j3 e$ f0 N2 w8 Pm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
# E) k4 O. c; n# e; G
$ b; G% u- v6 j& @}
/ S0 E' q1 p0 P; `public:% Z- X' R. p/ p/ o
7 [0 G, i" j, C, k
# p! p# i1 `6 l~TetrisFactory(void)8 K; k. h% C4 t9 E* X
9 D7 }2 \( o7 N
{
8 Z% j3 i' x5 J9 |
8 S- r4 u S7 V2 ]$ `9 k}
7 h% h! q! p3 v* \9 V5 U% O
5 M6 r3 T6 K! K. JTetris* CreateTetris(char sel)
! w# {6 a1 D" ?8 ^# _% T( b) `: Q& h) g/ @9 Q9 h3 W
{- Q5 t1 o/ d2 m- z P+ b
return (this->*(m_sel2TetrisMap.find(sel)->second))();" j# J* h7 M: I) F8 y0 }& L
g) ~% p0 Q- a R. k# l% ?}) P3 ^$ P1 h1 f# } x8 @* x$ y3 C7 e7 f
private:
& M7 ]: w* K2 Z8 I; I" h% w- Y( \# [
/ b5 A8 b% H7 ^, c% r
! F* M: @# u1 y9 R4 sTetris* CreateOneTetris()* f3 ?5 s* A' P6 }
' {9 o: W4 n# I
{
: k5 `* k! `! H) D2 |/ D0 M; } static OneTetris tetris;% A9 i3 v. q `# t$ [! f" ^
4 l! r( i+ T! j* Gtetris.InitPos();9 F, ~% Q& [" ?& z) t4 i7 Z
return & tetris;
* t. c+ i/ g6 V. ] ?" n# K8 g0 L& k% A# H. Q3 I( w5 B5 I p
}
' _! ?2 ?: X- l# F: Z% ]
3 Q. {2 g7 R* D# G( ]! y8 C" L
4 Q$ d8 t7 \/ B% Y; m: B$ A- G3 p
Tetris* CreateTwoTetris(), E' p8 |* _# H: c; g" Q: g. u
4 H, w. X1 L5 r7 _6 z/ X8 W{- p Z. \5 H/ a% {7 c# i4 T$ p' {$ g
static TwoTetris tetris;
L; k) [% r3 ~4 L; K5 I
6 [; O4 q6 G& Y$ O. D$ @# R6 xtetris.InitPos();0 |; c2 ?+ T3 T Y1 P0 y4 s0 u3 I4 [. B
return & tetris;
8 P _# [# ]/ s8 U8 `
* S& z7 R2 T5 X}% W( _: K1 ?5 g6 H- f; C; s
+ U! O4 g0 ~) n" A" s9 m
6 o, F1 t" c' {. s9 [5 S" _* p2 f. i" q' y0 k
Tetris* CreateThreeTetris()
9 c3 b/ v. h/ _. r, T/ S- a
! c) }2 j4 p# G: J, t9 j{
% z( e9 u: b; \; j/ q _1 z static ThreeTetris tetris;
) ~5 m' L4 t* r1 G* I0 i- U+ Q& }! u
5 e- g( }( l0 e8 Qtetris.InitPos();
; H& a* T. E& H1 ?* Z% s" h" A+ N
7 T! ^ N1 l3 @, n+ H6 r0 g
+ s" f- ^) k# breturn & tetris;
3 M: ?+ k& E: e( [5 ]# T6 d: p; A& q: J6 e* A( e7 _2 _" S
}2 t( V: l3 ^2 |+ ]
9 _- [" r" R3 X; k
6 ~( V" H2 C+ g; P* I0 j
4 c) a. X" b$ H0 j! \Tetris* CreateFourTetris()
) f3 h) P8 U2 H5 L/ `' ]8 j3 S1 l/ z( [! N) D
{: b# i/ b! s' E2 e9 r- r
static FourTetris tetris;! h1 f" [( I1 x3 D6 f |( N
( K5 V) Y+ l$ Xtetris.InitPos();! u% ?1 l" d+ N5 t3 @: X5 E& Z
return & tetris;
5 w9 X0 ~3 l6 k8 v7 h# S, r! v+ n6 Y3 u: p
}
( t |8 u1 \& D! a8 u: [. W. s0 U+ q2 `7 z! y) T4 e9 C: W
% X+ D, I8 m* C3 L E
5 a! `0 f& W0 O- m/ O; m$ mTetris* CreateFiveTetris()9 j5 E- H9 R% d u8 p }
. o7 a* U6 [+ u7 [" l7 b" q/ u
{' W' T; e4 [; R' w4 F4 k
static FiveTetris tetris;
$ _# ~. a% K3 M: Y" ]
' U" Q$ D9 z: W6 p6 Mtetris.InitPos();" d# n7 c5 _. u% B( ~) O# u
return & tetris;) D! Z ]" y; Q& Q, U
' G) l% {1 s( T# j}3 w3 @0 K; K. T4 ^& v! x( I
# f, E3 R5 \' Y3 z e; B
/ k, v/ t' j" f' ~) C5 \
Tetris* CreateSixTetris()
" v3 B! `0 y0 ^1 {: d8 ]+ e( m) N
3 q- V8 A6 f# o8 r$ J$ e* _& x{9 U" i: @1 Q' M* t1 J
static SixTetris tetris;
& n' r ?2 f. `# C- Y4 S. Q
" H2 p" G& e( y3 jtetris.InitPos();2 Q. W. C/ M) D# P. a# m
return & tetris;
0 L7 f; B% X: a" L, u2 V k3 D5 [2 ^8 `- X6 d
}1 f5 W9 c' ~# |) C9 g
0 r/ y) K M( C4 m7 }- \' n1 h* R: K
5 F/ g% n1 C* [# t$ K; S" q3 i8 ~8 h# {& Z+ z
5 Z s# @, X/ O5 f
Tetris* CreateSevenTetris(). h0 X: s7 ]% [5 G& B
+ [0 a+ ?0 A; ?8 E! e$ j; x: _{
- N Y1 @( ?# Q: x4 V& h2 U4 e8 R* Z static SevenTetris tetris;
" ^2 B) y2 D) @$ _' S" y4 ?7 r+ X# p+ m. O. k
tetris.InitPos();
8 p$ L/ M3 w. F2 F return & tetris;; D4 c6 t. b# O5 b
e" \. {0 }: \- D% r
}6 t; [$ b, d% J/ a4 z
& e5 a, J2 }" D6 K7 [9 H6 ^ E" fprivate:
* e4 X3 B# f' `+ w( p3 ^# Q
$ h. }* ~$ @2 X4 y7 U typedef Tetris*(TetrisFactory::*PMA)();
" ?& G. f( a$ Q5 C
- ]" `1 W8 h* r' e* y2 W( R' R" `std::map<char,PMA> m_sel2TetrisMap;( J F& z, O( O6 J6 K
, g2 Y4 Q3 b, u$ I9 g3 }7 s8 Y
3 l! T0 v8 t+ c% M};
* Z) V' H4 x! i; y( _
4 ]. ?! j& s! S- m* q& q0 @有兴趣的朋友可以下下来改改玩玩。, W( X4 Q/ A8 K* @3 j
9 _ r# O; M4 E# P& y0 j* `/ J: JThat’s all!
y4 ?) ~1 n2 R, S# ~3 V
+ }( {, l8 @) T, G) oPeter ! {: [' V1 U/ y2 D, i
9 J0 E& z& e3 R[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|