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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:

$ T( H. w, O/ ^# V( Q( p% y! J" D 1  w. Z7 M$ z# R, z" h
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
, g5 x$ k( s0 Y2 \3 h+ I% Y
! _- Q9 t1 ^+ t9 s

: `3 s5 n; O: C4 u, B! gFactorycode如下:. [3 z) a) Z. U1 H
* c7 F( m/ p; A- ^# j9 h
/*************************************
3 I9 l1 h. C; _8 F6 s" P( Y
1 v% K/ s* H+ g' j7 e7 Z, Q* author:hgf_starlovecpp@hotmail.com

3 P& i- L3 x0 S( h, _5 B, m" L+ [. x: ~! @$ `9 h. i( g
* version:1.0
- p7 Z* H  X8 A6 w6 H

) j6 ~& j$ @# G$ `( m3 U/ B- x+ C* description: just for fun
7 R% q4 f; j( s4 g( u4 y9 C  F0 z/ s" I
4 l! d( B) x% v
* todo: hard code exists need to fixed
. r0 C* l3 z/ D% O
3 F+ ?) U# f! j5 A$ \3 o
**************************************/

4 Z" n. j, ]' B9 x  q; Y
7 a3 j) W, p. K, {' k, a9 x2 P#pragma once9 ]- ?9 w% ~* w; i/ D( ?
#include <map>
( h+ t( b- K/ T) j$ T  g#include "Tetris.h"
4 R  `- v  Z1 W8 O0 Q#include "OneTetris.h"
0 `  i) p( R$ [#include "TwoTetris.h"
& J; s7 i6 W# m/ ^- B/ S( F#include "ThreeTetris.h"
, |5 c4 ~5 }+ Q" V0 f#include "FourTetris.h"0 W0 r5 J0 a6 o6 M5 x0 {
#include "FiveTetris.h"
  _1 V$ O) `* q  a# a#include "SixTetris.h"
2 R, q9 O5 A0 ]5 C) k#include "SevenTetris.h"& X4 q- M. H" }3 x, ^, E
+ F6 g, ~4 q0 G$ q6 l& D" Q( z, d
class TetrisFactory
9 Z( ?7 u; q& y{% o1 q$ k" ?1 f8 x
public:
- H' d* O6 z0 B" ^
. B& d) [2 J) b6 C$ a* }
# |/ {# u& k1 I. N, eTetrisFactory(
void)
* z9 r" N0 u' }5 `
; k" g9 g3 @  I1 b; q( K. k
{
) O, o, o2 d& G$ O% @
$ u+ f& [! e$ c& k/ y3 G
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

, {' x' M& z7 Z" d, q, Q+ j/ b4 F7 h1 o0 b
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
- W- c+ W6 _- a1 q1 b
% ?0 O/ m8 d+ |1 s3 W
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

6 Z" a' }) {- z1 Y+ L" \- P5 i4 X8 h) X8 Q
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

2 G) s, `+ X2 q  T( \! u8 }  K3 D, ?
" Y8 G( v/ C7 F# em_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

( J% v% P) E- I
1 e* u& j$ ?3 F# x1 b- h+ Am_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
( Y7 i. I; H. w

! \" I( v6 F! a* s: Ym_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

! K$ n3 O, y+ B
. G+ X3 I/ ~* |8 S}
) b" p; }' q1 Z1 }
public:  i8 v" ^" ?5 ]' f, T- u" o" @

" g3 d$ |- w0 \7 e3 B! ~# ^: t: k+ h2 t4 r  M% @
~TetrisFactory(
void)

' B0 R! }# C  r6 n! s4 q0 P: ?. ?- h2 v, a
{

, T  @( }) Q- q  g, R: r/ m! R! W  r& z) K
}
0 S9 |( D& {. }' C4 u( Z8 s! {
7 D3 k: O  c0 e/ A
Tetris* CreateTetris(
char sel)

8 Y, `3 V, _/ ?1 i. m
6 h& V) T3 W( n# b4 U{

$ h) N# T7 [  u! S; V+ y# y                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
/ e3 T# ~: s! |# e% L, `
; k8 d- A2 C0 ]: l/ F6 |}

* @/ K' c6 g8 f4 \private:
" b( u7 b/ D) }0 o; d  j3 L- W" h7 Z% a, g8 a) u  P* x; R

' @' V# D$ h* `! H( ^" N6 ?6 @: R# ?
Tetris* CreateOneTetris()

- l9 C, l, C- H1 Y- I5 M1 r2 c
" |& I& q: N. W# \+ L; ?: t3 Z{

2 c) a0 h9 y% Z5 o* _                        static OneTetris tetris;2 x! w" ?* a0 h0 J' I

) _' V9 U9 k: itetris.InitPos();

* ]8 z1 i% g( p7 T1 b  [) J                        return & tetris;
/ ~& Z2 ]' c1 ]* e# T
1 x+ E) I/ P7 {}

. f$ D! c; n( e& p5 q/ m
9 d# Q) J5 \3 J7 z0 l9 `

7 P9 J# K/ U: \5 a" e& y1 D
5 X: n0 @7 i( M8 ^1 \Tetris* CreateTwoTetris()

, w1 s6 ~, ]: m
+ r$ f3 q; h& {- ?' N' S- q{

* c( x4 O4 T9 ~# w" e/ t                        static TwoTetris tetris;- S: x& M3 j2 T0 q
( b1 p8 t8 D9 B- a9 a  ]9 X
tetris.InitPos();
! m5 Z2 T: h8 a- }; R
                        return & tetris;
/ c! u) S2 N  S" z+ q$ b0 {! E3 V; _: F( n9 `8 G
}
; H! r; w5 n/ h1 @% M  a+ M' H
/ D. P  v( h8 K( ], `5 ?2 j

4 P+ q; v9 q) u$ R. ~4 E3 m% ~- I7 `& V: @; B& r$ [
Tetris* CreateThreeTetris()

- k" e/ J- ^2 H: [+ ]
5 y( T- V/ P( U& d# x7 g{
9 Z  a: s9 ]. ?7 l
                        static ThreeTetris tetris;
5 h9 A+ P9 f" Z. n& z0 K1 \% a
# T% \. z* D% ^+ H: [tetris.InitPos();

  [- k1 ~) X6 Q1 f/ t# g8 g1 a; p9 D: v& w& n; T# y' Q* o
5 H; k; v* N! e' I( `' k5 v
return & tetris;

; z' _9 g: M; o: K- s, ^8 R, f* S
$ O9 y& E* }% n, X}

* J6 s6 L  |' I% N2 ^1 W) r. |
% p* F' F2 {! p( a, j1 G& z

$ c  R: s6 y- @) f% E6 r' W# B- _1 B* w% A8 P# _
Tetris* CreateFourTetris()

0 Z, e0 ^2 k! U, p" k! E/ i+ e% ?: o' o0 a% |
{

0 z; D% a  ?9 m$ y                        static FourTetris tetris;
$ d) f7 S4 ~: p
0 h7 I4 o% S* L6 ]& m! M7 z+ Wtetris.InitPos();
: `( S% A4 e/ i  r/ K
                        return & tetris;
, @4 ]- b5 J- {5 F, x6 ]8 U
1 P# H2 N( Z5 t+ C  Q* c/ V}
( C5 L9 j* o# ^$ ]4 u* c

& f+ O! h/ E& a( z4 W" K
) ^) S$ s6 W  E& y( }  y

5 `8 a  ~2 ^9 a8 }$ W- x' B" bTetris* CreateFiveTetris()

4 m7 c- A1 v' A5 B0 R6 g9 k2 _# R- x
{

1 o; A6 {, d2 o' k8 ^' e- r                        static FiveTetris tetris;! G/ \& k6 K" K9 m4 L$ {

1 g* E6 O" Q: j& [$ xtetris.InitPos();
1 x% m; H/ A) ^- ~- `( m
                        return & tetris;
8 Z" f: m+ o9 |, u0 K  y' u2 q' L* ]4 l* y/ O  Z
}

" o) n2 N. \1 a8 x0 s' b. ?4 R
- Q6 a. _0 r' d9 i4 ^: h. J8 e+ h4 Q6 r8 q- O7 C4 q, a
Tetris* CreateSixTetris()
1 |& |8 }& _! J' a+ T
5 f4 ~* m3 l8 Z9 y$ J7 O, Z; c& R
{

5 f- [* }" T+ r5 Q9 M, U; l  `, e) J                        static SixTetris tetris;8 ?$ _! b+ @0 ?3 V
: R+ j* @. g& P4 i0 |) H- S6 O
tetris.InitPos();
8 k9 M/ Q8 X  V: H( f, g9 W
                        return & tetris;
3 M6 n- m0 F( T/ [! @9 _( R  R. L% l" f9 X* d5 x7 d8 U0 D5 L4 `# G2 @
}

) ]4 ?: Q& H- [3 w; a
: ~& s7 a2 W% ~7 [0 a  M6 ]- F6 ^5 l" N* A+ Y( Y
9 O3 f" ?: `4 ]0 Y/ d
6 ]. C& e% p2 f
Tetris* CreateSevenTetris()

. n" A6 ~0 f1 C
  c: ^% r+ n7 h4 Z/ [' T- B{

' n5 x- V, H7 ~# }                        static SevenTetris tetris;! j, J/ K3 Y  A1 Q" C

2 s* V, M* O3 ]+ U1 O9 Y9 C, Ttetris.InitPos();
! d  x( C$ |7 A
                        return & tetris;
  p1 S+ F1 _" P! P3 o6 Z) Z9 @  u/ k2 s8 \% D  `( e) n
}

  q) \9 Q( ^" M
  h2 I& t) N& _- G" n  tprivate:8 Y% A% o$ p7 H' i. M7 Q  ~

; g( {0 C' h( M, K2 k- f" V            typedef Tetris*(TetrisFactory::*PMA)();3 V* \* y1 ]) S% e& u% c4 @% h$ s

  f: O* Z5 ^! e5 j: |/ P# Fstd::map<
char,PMA> m_sel2TetrisMap;

' _4 ?% w$ x5 R4 e" R
" j: W* O( L; ?2 h% j

  `5 ?$ k% P( B" Y5 ]3 _};) ~. }4 K& t' R

# k4 a: t/ U8 \! {有兴趣的朋友可以下下来改改玩玩。
3 `/ b1 [) w6 l* A2 [ & A1 b  O$ m) V6 b1 f' l) d
That’s all!
, B2 _6 \7 u# a+ R* ?2 \ " i: ]9 T$ Y# d1 B( F
Peter
% G2 K$ i$ t# d6 d$ W: U( T, g: x+ d, c9 A/ U+ V! y- e3 j3 y! J9 I
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-3-15 05:16 , Processed in 0.085794 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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