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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
" o5 z6 P0 A9 b8 H' r+ k
1% U& R) {' N* X6 q# P4 m$ D) {; E
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
2 K* L: f9 N% u& j1 l9 j5 r- e# P) r' h2 _) o
* o2 z7 P: g  }5 v) \9 L
Factorycode如下:4 i. T$ S, Q) |) h
5 K0 Y( t) e$ x% W# r
/*************************************
5 }3 X6 H0 d, M2 O$ s
4 R! G; X" r- j" d( u* author:hgf_starlovecpp@hotmail.com

5 N+ H- f: @2 |6 o% v* s2 v
: o' T) I; L0 N* U' R* version:1.0
* x! ~2 Y9 M/ Q7 U. f" x

: I8 l/ ?' y! @* description: just for fun
% q6 c% t! M: z0 S

# _" C% F; l1 E3 Q1 W  f: y" g* todo: hard code exists need to fixed
% g5 U1 _, L% a- g8 ^, Y

0 T7 h. V" }" Z' h# w% q**************************************/

6 N6 J* ^" \; `: e: b& c% ^
& e; \' e% O5 f) L+ j- P" l# A+ b#pragma once  ]( N# b# n2 q7 v: R5 |
#include <map>
& E8 {0 l7 @$ \/ l' q  Y) q0 Z#include "Tetris.h"
: n! o* x& }- h2 F; B5 `# z) V! ?#include "OneTetris.h") h: ~  ?9 g- r4 }6 N! R
#include "TwoTetris.h"* {1 U" q* ?' }. q+ u
#include "ThreeTetris.h"
, f4 M9 J7 Z( `6 F, C#include "FourTetris.h"
! L9 y0 X* F, r; R2 _1 g#include "FiveTetris.h"
& p6 t6 }. b# y) b#include "SixTetris.h". c6 y4 [$ I* A8 _
#include "SevenTetris.h"
% N2 x' @0 M! H" w' J
( F) n) b5 v4 L& U/ S& z: L  {class TetrisFactory
4 k& i4 @, ]/ y) e{
; U  z  _, N; Z: I7 R+ \- Jpublic:
4 X/ h* b' o6 l1 H. a. t
( B8 z8 m# n+ D) J7 S( `' m( }9 }, ?' _0 m9 Y
TetrisFactory(
void)
6 ^& j! J( v  x$ b& J
. o0 n) d  `5 Z, O- G4 k: N
{

" n( o5 a  l: q5 f
6 b6 F. c6 \0 ]3 ?4 E) f5 K$ O/ Qm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
6 U- b: _7 u/ ?2 }( ~6 a3 z
, a" U/ X% s1 T  j+ V# _
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
9 C1 M# f. }* ^( U$ h/ T) ^1 J7 f
& M% ]& ]3 {( ~- ]
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
9 ^6 W' F4 {( y

7 w' @0 e5 [+ t0 Mm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
' r$ b; s+ P! ]3 e1 `* [

3 i, r  u- R: ]. S$ I$ fm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
- t! N8 q9 h2 D( X  [7 _9 b
) y5 ^: [1 |  [+ q) j
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

) f& W$ Z2 t9 U8 V  J, M! Y7 f' H
7 Z( ?1 d1 J! Y/ x& |m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

, x' B* o5 f) r0 O! U: [. w) S5 M+ k$ P7 e
}
% _* z$ |* H: O/ I$ V% i& _6 S/ D
public:
/ w: L' P8 G; Y   w1 R+ b) p' ]

5 ^' K1 _: v5 T# Y~TetrisFactory(
void)
, j9 _" e8 o) L. c& E( U% q; ?
1 B! W; a! D4 |5 X* G, g* u, z
{

8 `: f6 {# S: {: l6 \
$ ]4 y; C" Z$ \* o# F* m. ^9 H0 [  Z}
- p) v3 `5 J6 d% r4 q9 ]

( w% C4 K. u; _7 aTetris* CreateTetris(
char sel)
+ t3 e4 \# J; R. I
' h) R: b* k7 \0 ]/ V
{
! A" k: e& t9 {. z& V3 j" _
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();8 j4 m' e: N4 R4 p4 P3 {5 n

/ r+ u4 V$ L; M+ v3 t3 w' [" ~+ T}
9 K% X: b# A4 k4 _  q
private:
5 \4 c3 ~* ^" O# u! A8 m) y! x8 a: p0 P8 `, |8 \

! k0 d# U8 y3 u$ m' [2 I) I
6 }; M/ o3 U0 {2 |Tetris* CreateOneTetris()

/ @7 i7 h; t! E+ h6 B' ]9 R% S! `/ v$ i& [
{
" @  f2 V. D1 z* I
                        static OneTetris tetris;
" }/ v1 V2 d0 w( p8 q+ L  i! a' k# n1 D- ?& T
tetris.InitPos();

6 f: u- _8 u% W' K: Y0 d5 L9 c4 z                        return & tetris;5 E/ X+ F) L' j+ c& x: H% F# L$ m8 |

  P/ L0 |8 G7 D7 ~$ k}
% c6 K  Z6 v/ T& q6 S

& U# a4 C4 a- w
+ x7 c, o3 M- g) K% n6 |: B

5 ]. k2 U( M( U* UTetris* CreateTwoTetris()
3 Q& }9 W4 {& H( G' ?
& R! z( y& |4 \1 P0 _$ U0 M* O3 K/ f
{
3 V- g( L# T) T
                        static TwoTetris tetris;$ j4 j3 W( N: f. X* c$ X6 D0 X! G

9 K# W  t5 T. f" ~4 c6 Ltetris.InitPos();

, b/ w5 D4 M- U3 ?) X                        return & tetris;) p0 z3 F6 Z+ M) r  u

' ~" a+ ~, S! C}

4 `! S2 _& }5 F
1 O2 o& J+ z3 C: m- ~' ~# q

0 c, q* D3 a( T, h+ A
1 Q# t( d2 v6 `7 [2 {7 J4 rTetris* CreateThreeTetris()
: V! F4 O5 J; s% F6 e8 N
* p+ p2 ]- O- I1 l" N
{

4 ~' r% {/ o+ d0 J, G                        static ThreeTetris tetris;
) R4 @  Y4 r1 L) ]6 z% T  \. p9 o1 j* W" P7 }; x0 u0 V1 M
tetris.InitPos();

# T3 h1 }) l: z( n. V0 I2 K0 O3 C; v9 |7 K  d+ k
& t" ]% H$ c8 u+ H& Y. R/ a  Y
return & tetris;

) t1 c" P0 `% ?' q
3 U0 F* |) Y! O8 _. ~9 i}

, t( z% }% x; r6 Y! K( d+ e6 U$ V0 E- s  @4 D1 b+ Y7 \
" q- t. L  {- a' z
! W) O# }) @7 C2 z9 C1 y. A  g% F, X
Tetris* CreateFourTetris()
5 C) Q- r3 I5 m3 r( K! B3 G

; ]' s9 V7 u9 I  f1 D{

" I1 y' I8 I( _' x) L* l( U                        static FourTetris tetris;
, v! Y% |) P9 T) l* m# L7 n! Q, i6 }! }
tetris.InitPos();
- K' [# @' W# N* O1 \- D) E3 M
                        return & tetris;
6 {" _( H! j  C% L
" K& U: M* ]# ]' _+ j}

) m6 {. J$ ]  t* A* ]. @8 n8 j5 x" `: H$ i

7 a$ u* \1 `' s5 T. w  Y
# ~4 m4 V' A% |) t. d1 N5 pTetris* CreateFiveTetris()
3 [% ^# f$ K" _" s$ p7 L3 f; E3 g. b
' J/ F3 H- N; r' d4 ^4 O0 D& D
{

& e6 m/ i9 R( R! w7 @                        static FiveTetris tetris;
' m$ p% t5 d0 v/ h( `4 u7 E  p3 x: q0 O
tetris.InitPos();

, _# p* ^  Q/ q! i: @+ Q                        return & tetris;
/ X* |8 \9 l; Q2 h1 W9 b) s& m
' t; p. N1 ?# R6 R$ [- e}

" t1 K4 p2 v! M# N4 O( o$ ?. I 8 G5 D3 B7 U7 B6 f2 \# O% Q
( m. ?" e6 ^) \. e
Tetris* CreateSixTetris()

& J8 [$ S, M& z6 f, r8 |
) j0 r, D0 L& w{
; l! X4 F2 G& u$ R- C
                        static SixTetris tetris;" V, f8 ^  E+ N4 w0 i/ v( F
' j# z" R) e. [) H6 T
tetris.InitPos();

4 A  l& w0 m& d% q3 m                        return & tetris;
/ J+ J$ b6 n* m7 O, q6 p9 o/ J! x* t! E! i4 D- \+ T" ^
}
, j6 L# m1 e, ?
. c2 }4 i! V+ J6 i5 _, i3 a$ j+ I5 U

. z, {8 Y/ U9 h; F; m8 ~$ y: j5 C( R" @

; W9 H+ Q5 ^9 T9 f3 ]7 z, T, U/ t3 ]; A; D, o
Tetris* CreateSevenTetris()
. a1 m; l" J$ w" A: @8 c

1 s$ G+ V" w1 G! ?+ N4 n6 s{
: s( d& I! x5 W4 t
                        static SevenTetris tetris;
% G* G7 D* v* t" \
  B. W/ p0 J. W8 otetris.InitPos();

9 j% H* ~8 A2 d: m; _                        return & tetris;) Q. s' X' C2 h* Q: e( T1 F
# r9 V' H0 Z$ K! f
}

9 P: [" M, `3 u: o
8 C8 Q; \5 a( n# z/ |private:+ D  u" P; a6 L. y' U* o

3 z+ R7 ^. m7 r. u8 R            typedef Tetris*(TetrisFactory::*PMA)();
3 H7 F% ]# \- f0 T
# i1 y& H$ a2 s7 e- X+ _std::map<
char,PMA> m_sel2TetrisMap;
0 U7 d* u6 f- W

" h- Y* [# |9 M: E+ @6 ?. S. i0 t8 {; c

& U6 \" r0 n% \9 ^: Q% o};" _2 l  p( J% {1 L% h/ s" _- o

! W2 w  }% m4 m$ t$ D! M# C( d有兴趣的朋友可以下下来改改玩玩。
) y& r+ L& Z. N- m( G: Y) {
1 |9 F4 L  Q2 Q# lThat’s all!9 I" m7 G0 m0 l% J3 K) J  |- K
; N. l2 W3 h$ U( l3 r3 j  C& s
Peter ' U6 P- ~, N6 q7 E: @2 R3 z

6 Q: a! r! N  h' ^3 |. |. s1 q[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-1-12 00:34 , Processed in 0.157395 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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