|
|
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示: " {( V% D ]- T
图 1! G) D3 n/ G* E% N
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
9 O3 y3 w! a4 m
8 Q- W. \" t6 Z/ p/ `) y& R/ ?. J; x- W
Factory的code如下:; c1 N+ w$ o$ B1 ~: `; T
/ U! f. O. s' b) g) J
/*************************************. l5 A" G" F$ U# y; q/ E
" k! d0 `( _ R/ j
* author:hgf_starlovecpp@hotmail.com
, c6 {3 e8 t1 E/ b8 F, ~+ o1 o, q3 D, A5 e$ L5 F( i# t3 q
* version:1.0
! E4 _# s4 i! j! W% L2 t2 c0 `1 Q1 S
* description: just for fun
1 W1 K8 n' \; B+ H0 |. Q
* ]. f4 A+ G* y1 Q/ r$ ^* todo: hard code exists need to fixed" @1 C( ~4 z, |& a5 v
' {/ `$ y, e1 v; Y**************************************/4 X' ^( C- Q% w
% V( z. [3 r* W# A#pragma once' N- K% }* ]9 W* k# n8 M- k( W( b
#include <map>/ U2 s6 C$ Z& H+ \6 J
#include "Tetris.h"5 X0 Z+ g( z7 Z: F
#include "OneTetris.h"
# Y! Z- N3 T+ u1 c: Z#include "TwoTetris.h"
0 c! M# [) ]. ^3 t" s#include "ThreeTetris.h") w9 K9 x1 s u* u. c
#include "FourTetris.h"
: d h2 r9 B1 r#include "FiveTetris.h"3 z$ N2 N |; t- K3 d
#include "SixTetris.h"
! L/ W& Z7 B- N4 e" r+ L#include "SevenTetris.h"% C, v) O, e; e
3 L6 Q0 X; u! u& [; D! ^: H( iclass TetrisFactory) ?; C Y; k0 r! F. C
{
! @7 O1 y0 K2 u7 R4 _' Q$ j h; Hpublic:
% X6 Q5 d4 H2 f A; C # g0 I+ q, V2 b
- c* j& |: s9 O7 ? d& G
TetrisFactory(void)/ [! ~; w2 E: X
7 C; ]- H/ V: U1 _/ b{
/ ~$ I5 F% Y0 U; B( {9 I2 w
+ |1 \+ ~+ h" jm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
$ H& r' [2 \! A) t( J7 J7 } T) [) Q4 y4 V
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
! z# q4 _ Y$ }5 M( ~7 j+ @) C7 A. j: p2 D1 h0 m. J
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;3 B" V3 [) p+ H8 \$ U
7 K. `2 D4 l! f# |5 k
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;* w* h+ `1 ]! G* h" b7 p5 v3 h
& T6 N! [ f2 a. y
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
( h, U e& H. L5 [% {/ @% r. {0 w$ |( o L8 \- s H
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
- n# \; m S3 @) `1 Z7 M1 v7 C7 Q" F5 J
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
; W; j8 C9 p1 I# \7 Z4 G, k: t. P
}
6 a5 R$ f3 ~( i9 N- c& I/ [public:" z7 T; I5 f; n* I z
9 U( ]6 l3 I- ^0 H3 X
7 C0 ^3 Y6 _% J4 u
~TetrisFactory(void)! r& Q8 l/ |- U$ Q& p
% P2 P2 t, g1 B! o, l6 S
{
% P! M, s$ S- M2 C/ p8 Y6 x5 J" H* J/ @* l: @& z' B1 n
}
% G. l( g5 p ^5 X: D* f& q3 q* S2 p2 X, ]. O3 _
Tetris* CreateTetris(char sel)' o/ Q9 [, @2 E- C( ]3 U
* C. ]! _2 c: {4 k: \3 M# q5 O
{
4 V8 H. e, ]; j! ? X w" N& m return (this->*(m_sel2TetrisMap.find(sel)->second))();
5 Z2 d: o I% N( [
0 F6 k7 a- Q" ~+ _# Z}7 g4 _/ C8 r( f, _( a
private:
6 d7 F5 G; c3 y. _, `% J% {) A t% h N' k! \; z
! @1 y, O( _7 l& r( u( _ a
) r( O; N3 w! L G! T! mTetris* CreateOneTetris()% M: O h& w u! j. V& ~* G
0 A1 E0 F. d% t{
2 G5 D( q% s6 I$ a, ^ I7 T static OneTetris tetris;+ \3 R9 N0 d0 _& v I
9 Q, S" Z5 D n, d# [tetris.InitPos();
1 H1 N' I/ T/ c# K. I8 p0 \ return & tetris;' [) g- ~: [. Z5 Z- f3 S) v, y3 w
% ~( y/ A+ ^* T* w}' G# F. r; Z2 }9 `) E5 l- G- h" `- ^
" ~* Q( C; @ Q" [! q% q3 C& ^
; a! W% b( |0 l+ q% }
. V7 }( J8 K# s, yTetris* CreateTwoTetris()" I# ?* w. J4 A: j# ?. k
6 ` m+ J$ j. _1 K4 Q{, O- x# ~" J. j4 ^: {5 b
static TwoTetris tetris;
# f7 B U2 @/ ~, ~6 N9 t! _+ g0 V
: D* e. }0 o4 ktetris.InitPos();
0 ?4 ]% B* \: i+ c2 E) U return & tetris;
6 O; V# s+ X6 _# [
D7 ]- n( A0 g) X4 O6 W/ O4 [" f}& F- L) ^( y9 [0 u, P4 `
% @: z# C- P _! \$ o
* Y- N3 l1 n& [! q- U" e9 B* G
7 d! s& {3 j7 T" d' F; hTetris* CreateThreeTetris()6 v4 ^+ ?9 f, \, H4 j
0 c8 h3 ~/ T6 @9 o$ _3 {: {{
7 x" \. @; A! e' x: E1 @1 \5 j static ThreeTetris tetris;
2 t w9 _- d# q. b: K! w
+ q; i/ r4 I xtetris.InitPos();, l& z6 H$ |0 M3 l. S0 I& F
) d7 s4 i* c# t# p* q! Z
0 d+ A. J* C6 b( Z% yreturn & tetris;8 u. M( h$ w$ h7 P
! H7 p5 O6 o% o. X; J0 {$ d; _}
# j: t( t! J: T" e" s" f& \& |' o4 E2 j" Y( P9 v
! A5 g' {; i/ n" P' j% [* ?
/ {9 u9 M0 h& y. [9 i- X
Tetris* CreateFourTetris(). ?7 I- ?. O) u3 P1 _6 i
* y" s1 q# V+ F4 E{
+ z( s a2 z* D" b static FourTetris tetris;0 o- x# o' _5 v
$ i2 a& ~. O) g0 U' n2 a- Ftetris.InitPos();: H& L! U, a" o8 O) ?) T; t3 c9 Z$ \7 B0 l
return & tetris;
# m, B. S0 @; @" ~( [7 h
2 H* r& J+ S0 P}# Q+ m, O8 N ^6 |
7 E' v, s- v7 C9 W/ ], G$ [" E- q( L4 V. \: Y$ p2 M% F9 G
2 c( S5 T# O# }3 ]& KTetris* CreateFiveTetris()
# A+ k6 Y; i5 M* _, V# h F% W' K" K B8 S5 E }
{
- R; _0 r. g2 G, u/ D static FiveTetris tetris;+ p8 [+ ] {5 x
7 I9 U5 r) c& ?) ]# Jtetris.InitPos();
" u2 l! g/ ]) u& S" z M return & tetris;
2 z' h( u7 G0 n( E# C* p& z* f w1 a, O9 w% `9 ?
}6 {8 r& U2 m' B {
' p# U1 ?- Q. Q0 V) T8 F. ?- G
9 h& h H0 b, S/ E2 L) Q
Tetris* CreateSixTetris()+ l9 `) a; k9 } P" G* B
) S8 F; `7 j/ f) c# x8 |9 u
{
6 L; O+ q7 y! V7 d, h# B: D static SixTetris tetris;, A1 n' q1 G# S& E! w
5 O7 F0 B$ U) L! D0 S- J6 O
tetris.InitPos();" w# R+ {5 n' I# O A; C
return & tetris;1 Q( z$ \" r k3 C
" W' A) z; a/ n+ |# ~7 E
}
8 ?9 ]* _6 _$ k% R/ b* Y/ J- D7 g ; H$ T6 A2 Q5 \$ H& p
3 u8 Q+ R6 V* v4 F) g
+ {4 n$ L# |, P+ O& v
- N2 q2 t. Q; l& _0 w2 j
Tetris* CreateSevenTetris(). T6 b; r4 I9 B; I( p! c' Z# R9 p
9 V0 ^$ \: I2 V6 f* }- [{& g4 t5 x1 e+ D" S9 x: x# e* u/ A& B
static SevenTetris tetris;
. }. z6 S+ O" g
! e$ M& i# _" p G' ~/ _tetris.InitPos();
% U* Q3 r! r3 q0 N return & tetris;
- A% l8 P P( I( F
( J6 }5 P) g# L- p- L}# a; o1 T8 N% d- [
) Q4 i# G! k s( L. ~3 ^
private:
! a- a9 g- \6 p4 |! s& w
; o, A- z; _+ i) D* {' W6 T' s typedef Tetris*(TetrisFactory::*PMA)();
7 r& c2 S9 H. j0 z) `
# R7 ?+ v5 M4 T; _9 u$ l4 Cstd::map<char,PMA> m_sel2TetrisMap;
5 Z- K. T6 Z+ W
5 m k; o* u9 o3 ^" H& z4 U/ ?- e- X5 Q0 E
};3 t, V. p& B' U; `) i9 a5 n, D7 u3 X
9 H5 X' b5 a, t+ ~7 _ S, ]
有兴趣的朋友可以下下来改改玩玩。
, h% [: g" a# J9 k" o* {9 I( Z9 I" ? 9 _1 J. ~) N( o- [
That’s all!
x/ O! I) p1 \
0 V% O1 X) E. w7 N/ BPeter 3 F) t. g0 r8 Z; O t8 i
5 O: K6 e* w0 t. Z[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|