找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 9581|回复: 0

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
, z& R# t' `' j% I5 \* p" A0 U# J
1
) b( C0 `6 H5 j0 X$ ], k% u$ e完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
; x- \4 V0 H% e# I- U3 S* j3 C; D) c

9 T4 ~% ~) @2 ?, n+ cFactorycode如下:" C/ ~' |( k+ e  u; [4 F5 i, ^

" m+ b# F% J$ ^' {8 K3 H/*************************************, @' s2 x7 |8 X+ i

: ^8 L! v: G! Y1 [* author:hgf_starlovecpp@hotmail.com
+ d+ U! z  I/ D

3 F; v9 y* R* i6 F6 w3 {* version:1.0
: m5 a( I, {. \0 ?! j2 Q* {

- d7 g2 O9 D" {  `" x9 S* description: just for fun
# z% I) }/ o$ v4 y9 O: O3 F

! v6 b- i5 m2 [+ A' F# K  C* todo: hard code exists need to fixed
+ ^/ C: \. Q: A3 z3 m

8 f! [( r& o. u**************************************/
/ _# n3 Q( u+ H  W  h4 a
" L- o1 Z8 z+ i, t
#pragma once
4 v7 j* q- R* R3 E+ c2 s6 l#include <map>
6 ~+ [- |7 L! @3 |+ D. O#include "Tetris.h"
0 h6 y" y3 E& U) {/ w) W#include "OneTetris.h"& E2 f/ K+ e# ~* n
#include "TwoTetris.h"
  g& o/ e% G* ~  R4 j! `#include "ThreeTetris.h": ?- ~) `' {5 w5 Z; f4 C5 n
#include "FourTetris.h"
. r! Y' x4 _6 r. E/ {9 I#include "FiveTetris.h"
2 c4 m7 I- w5 r3 S#include "SixTetris.h"9 p9 y6 e/ q/ {& d8 R3 p% I' |
#include "SevenTetris.h"% y1 C+ T% K  A' D8 W* k# U
: O9 l1 q# l7 R1 i8 i
class TetrisFactory
" f3 n' _. Z; Q% j3 Q" E, ~2 r6 c{
- M8 H6 h$ k3 u/ e: epublic:9 s, D$ F5 d% g& @8 U
( g+ U, s# v+ B2 Y" x. k* o( a

, D6 |  j/ B. J! d1 B* ]TetrisFactory(
void)
# f& V' \5 q& B& C7 W7 q

( J, k3 C$ A  w{
% I& i% \9 m( g& ^

" D4 T7 u/ H) e" h& u; hm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

9 _% @9 |+ e( n9 i+ l( _
" E# d9 y9 r; l: O5 Qm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

2 z( Z& F. e' @9 j, V! d
' h& S$ z+ `" q5 qm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

5 I, X! g" s7 S6 k3 u9 u! j+ i' C* f! m$ Z
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

6 g; D; n7 w# p2 W' U& l! S3 k+ w& S: ]! V
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
) I+ R* M4 ^6 }) \
6 _( w! U+ g. Y* D( G; }: p
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
6 p# ?# d, Y9 \* a/ r$ J" \/ z

& k( ]; e' H3 N3 o3 D! C6 um_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

3 T. g; g+ i' [7 V' B& y& a' ?" [- ?% d, W8 A! A/ j: @
}
/ S  i& ~$ ^! P, V5 F, z
public:' q, ~( x- }7 N- c* O1 I/ F
/ b2 ^; Z- o& ^+ K  r/ {- a' b
1 b8 B; W6 u: v. h4 X
~TetrisFactory(
void)
( S9 B' n# Z5 F7 ~

+ w. ?' ]- V' @$ s& d{
5 s* g  x9 {1 R
0 W2 N; w8 e% Y! A2 F- @7 N  u
}

9 M1 }) k9 Y0 j. ?# K- _% B( l
  Y  j$ R' ]8 c9 QTetris* CreateTetris(
char sel)

; R: a' ~6 Q5 s: u. |8 M$ `) r8 u: n8 [
{
' d, ?1 Q+ o7 B  `5 x
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
) n  E: ~9 Z: g; A! g" ]! Y6 h+ P* v0 d0 D* U9 Q, y8 @; f
}
6 s4 p7 Q  @; N0 Z( @7 w+ P4 ~. s
private:
' @- m8 [+ `6 Q" m8 |0 x* b( H+ C$ \' W, t  H% z
: E( G' l( B" m! S* ]  R8 @9 \3 F

  X. Q3 j2 `$ Z( L+ S( A5 H5 eTetris* CreateOneTetris()

3 f* S& Q8 g& B! R+ z6 \+ o6 |! z5 M' o$ Y! Z
{

3 [) Y. l4 w5 Z, L! V! t" ]                        static OneTetris tetris;- v( n  Z" R9 @) G+ K0 ^& A, [

) B" a* |1 Y* R4 dtetris.InitPos();

; m& I, m5 f  S1 g+ o                        return & tetris;# I( p& z9 i% m4 l0 b

& X( _; r2 A) s: j) _4 ?! j& W7 t}

8 b  r  Q% c! o0 ~; ^+ {+ l+ J: t) J8 K
7 {% m( D& v% l8 d
; X$ c, d) z, ~. w
Tetris* CreateTwoTetris()
% D, }# }3 w& ^& w" W2 R
, {1 F' b5 F5 z4 E8 P  |2 a
{
: D' i) T/ I/ I' m, k: A
                        static TwoTetris tetris;! }$ m* d( |% ]' R  k1 p' @
" X7 O2 q% J" a5 Y7 a; j$ g1 o
tetris.InitPos();

& P8 O3 I* g: @                        return & tetris;
9 y" X* n# I+ j' b, e6 P/ P
% L4 P( j2 s/ B9 Y}
0 q8 T* Q9 n3 `/ y( V6 y
1 z" O# k/ ?! y$ M: l" q

9 i, E$ A, l- s8 V
; E) D  K, `  |% G0 n, q5 ETetris* CreateThreeTetris()

) a0 y" o* t" H2 l; g3 L" d: x3 W( B$ P/ u& }8 L+ b9 p: E2 z
{
8 T9 q2 S+ x! O( O' i9 q1 S* ^
                        static ThreeTetris tetris;2 T" |& [( w; f- E

6 K7 W) H1 D( S# g( A' X5 }tetris.InitPos();
2 F6 B9 M" A2 q! a5 J1 e

" ]8 u" e9 G7 D. C0 G
0 {/ E* P6 T; ^1 m+ v! X4 m9 ]
return & tetris;
, {/ l' J/ D; B. H& U2 a
& |1 ?5 E( X9 X: n9 I1 I# c
}

6 s- C! ]5 J% E: q, V3 a. I# z# ]2 o0 }

( _  l2 y9 B  |% B! w
1 L% T  c! k  l' }Tetris* CreateFourTetris()
* b' h0 I- U* i: B( X1 c
3 x: }3 X4 D* a; M
{
; U1 i0 [: c+ e! {2 ~
                        static FourTetris tetris;
# N. j: R# p5 W' ^8 L, d2 s7 C) r8 |- U! U8 X6 k$ n
tetris.InitPos();

, T7 m$ L2 {( S1 i/ N" `2 Z                        return & tetris;
! A( [, b( |7 i" w( `( k  o5 }7 J1 l$ A2 A0 C1 g7 r! Z; Y7 b+ J  I- R1 t4 ?9 W
}
+ @) t% u% K5 a9 ^. Z5 F

, O- c5 a- k7 ~5 J2 o) i
8 P: C% K- v1 X3 u5 A6 B- F
$ S; n7 H: v! l( E6 q4 i5 A1 V
Tetris* CreateFiveTetris()
; T2 z( Y& A6 D7 f

6 ]( B) m$ J5 R  H3 ~' K{

  t6 G/ ^! }8 |. ]( L( l/ N                        static FiveTetris tetris;2 h) F) ?; R7 _( G3 l

* {& x( K# r/ A4 I6 w3 u9 Etetris.InitPos();
) ?3 R9 H9 P, |% H7 V. \( q
                        return & tetris;
& ^& q5 f$ {, O( J9 J, B
( [# m7 K  h& m}

8 H  H( N% n: Y# ?( Z" i7 d& A
) L6 N/ h3 u( W; Y2 p; ~) P# I  K& T) j. |
Tetris* CreateSixTetris()
2 ?. B4 g, R0 A3 G5 M% z+ ]8 @. g& ~

  W$ P# O1 L" B" M0 t{
6 s$ U+ o% p5 R- L8 c
                        static SixTetris tetris;
4 S' f9 b; ?7 ?1 |. R. F3 j. h$ x2 H$ ~
tetris.InitPos();

. j* G* |) Z! ^( e9 L                        return & tetris;
, d) S+ E* P: W. s0 B' [
( o3 N9 l1 R1 K& J* d9 f6 y}

( }9 ^2 x* I5 n! L' |: }
7 B2 \) L3 O  N0 W
2 K- {7 e' J# `. i" }& A6 P
* T8 w+ S+ h" Y, l* ^3 c
: ?: k( s8 ?5 i! |+ F
Tetris* CreateSevenTetris()

1 e* P1 v: N2 f" r, _( x$ t* f, B7 z2 c2 M1 K4 ]% o: ^
{
( e/ B4 C4 T& N, P  e
                        static SevenTetris tetris;. e3 B: \. l* d) s! Z: u+ g/ T

$ k) `( p  f- R8 rtetris.InitPos();
. G# n! K1 D- M4 b$ s/ ~
                        return & tetris;( c9 {$ o% B6 g+ i7 d

9 v5 |  w" s5 {1 j}

& B& A; W  @" |# K
, l: E4 v2 i/ K7 dprivate:
5 P, ?7 P1 }" Z" D, S) O
  }7 K. y' h+ g1 w3 \" ^, n            typedef Tetris*(TetrisFactory::*PMA)();
- P( A. w* {0 C* k. t! @" U
! I# T% c+ r- P/ d: q- Istd::map<
char,PMA> m_sel2TetrisMap;
1 [  ?. v, [' p. w

5 C0 d3 s7 ~" T* ~! b
- z: K. G" I: r! {
};
2 \$ E3 }& n7 W. J! ]
# W/ I4 i8 \! U  Z- L有兴趣的朋友可以下下来改改玩玩。1 ]$ b0 o) X. I1 D8 c3 S8 ^
1 X. v5 q/ c9 i" C" Z
That’s all!
! a" Q% o9 F& |4 J $ D% r# ]7 i; d
Peter
' T, h, n3 H/ ?. p0 T$ w' X
- ?# X: J% w' v# N[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2025-6-17 10:38 , Processed in 0.041975 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表