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

俄罗斯方块

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

) Q" r8 ~  W6 r/ G 1
- i( B) K* ^+ @) U完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:7 L3 _1 r* i+ l1 _0 X

! s+ U, m& M. @6 m! K

# l; Q: l; N0 E3 N# c4 l6 AFactorycode如下:$ v" C* g! h3 Z- c# {+ |. F' x3 y
0 R. S" H. ^" @7 ?: s! Q6 C4 {+ H) m
/*************************************3 f  s! f4 m) F; R3 |

8 k' n, @# P4 |2 Q' x* author:hgf_starlovecpp@hotmail.com
5 z$ Q) [/ G4 n$ j; w5 g
8 }" b$ h4 n: x: `+ {/ a" u
* version:1.0

% x) k, T. d5 F3 B
1 n! q* D4 ~% T- n* description: just for fun

5 `0 p6 J( i  C% [0 G! H
2 v; u# F4 X5 U/ C6 \* todo: hard code exists need to fixed

4 [. H. g8 F4 F3 q( m6 G1 `: _5 E) Y
$ d* _1 P# {; o+ E**************************************/

8 G0 h2 ?  Z; r5 `9 Y; ? ' ^; ?* c9 \+ K- }
#pragma once
6 R/ s3 C* t. E; ]( \; Q; _#include <map>8 y4 S0 \( q! I" _& S( y
#include "Tetris.h"
( x8 X/ \; Q) [: z) u  B#include "OneTetris.h"
- Q; N/ f3 V2 s3 r  z#include "TwoTetris.h"2 `5 \- Z/ E- G& C6 a( P6 @
#include "ThreeTetris.h"
4 D7 C, o) d: `! S9 V. U# O#include "FourTetris.h"$ s) n/ X/ _& B; J: g
#include "FiveTetris.h"
( t+ }3 a( C7 r! E6 \- m#include "SixTetris.h"
9 ^! A) q3 t3 p#include "SevenTetris.h"5 t+ S& b+ V1 A* T4 K  g6 K. k
1 S+ i; A' ?3 h- [
class TetrisFactory
% J$ L, {& n, |3 D6 X{' f6 S4 Y% x/ z+ {- Z: k
public:
1 j6 P$ O+ w6 m. E( }# b3 D 0 G% I* E- T4 q* l/ f2 V
5 p8 e) T& R1 g; H! l' x; T( w
TetrisFactory(
void)

+ }, K, v# t, T0 ]7 [1 j8 U; B' M5 D1 R1 W8 v  x
{
% Y5 M3 K4 _$ \+ U1 L0 F) z
! d; M2 U6 f0 ?' @1 e" `
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

0 T( S( d, B- s! h  |# i
$ U7 ?3 o4 n7 n  k2 i% a; Lm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

+ @/ n- o, r) T2 i8 [# _
2 r( M: U  b1 J: N7 O0 Cm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

5 y2 L9 l+ {: \' W5 `& |
/ M& B) l& i+ wm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

5 K& x8 z# |1 ~/ _% l3 [( U0 J  k$ y0 v& V
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
" `5 S0 l+ H$ W# J
0 a  d2 y/ g9 Y5 z0 A% o, ?2 V
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

7 e6 q9 c& g7 W+ l% F0 m1 T
% _9 S* p5 x: _1 w# ~m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

( o- _9 i% [0 i
0 [/ j5 i5 ]+ H+ S  x}
* ?1 X6 E; j/ b: Z2 K# a
public:
% C9 }. |0 Q/ d  I  f( L; @
( M# k1 `# b0 p/ o6 E$ _$ ]
( B6 `7 ^( k+ R9 q~TetrisFactory(
void)

, ~& Z/ k" k0 e
3 h4 U9 u3 z7 p{
, Z* v7 S  ^- O5 ^' B3 r5 c0 @

9 V! ^& }; v. p; y8 D6 w' |}
$ d0 p( O# @+ C3 w
$ r! l3 k0 E/ x7 i
Tetris* CreateTetris(
char sel)
5 p. j8 @* V: p0 c7 {

. l0 V; g3 b3 r$ R" v{

: [* J1 M* J9 v                        return (this->*(m_sel2TetrisMap.find(sel)->second))();7 e) |; Y) @) {( Q( Z- J

9 d- R4 z2 T. ?# U% V. _% [}

2 i, ~3 c, Q0 o& `" ?private:
/ b; }8 b( i/ |' S
8 F3 v1 Z/ y  B1 D/ A5 t) @, c

; l# ^6 v# k* L5 N  [+ Y) n) g/ ^0 S/ `. h: p! E
Tetris* CreateOneTetris()

1 y# E1 G2 ~4 [. h& E
) f' Z( `" y. k{

2 P3 v* \& W5 _3 ]                        static OneTetris tetris;' P/ m8 \2 v6 Y7 {1 h% k

3 n# B* {( Z- |5 C1 _8 Btetris.InitPos();
9 I8 q7 s1 r. j, b* _1 z
                        return & tetris;
) X: \% N* w* f& L) R. }& z6 x* P
}
$ x/ b0 a; L" ]+ c0 d5 n7 f6 K
' z3 A7 P! A* q+ n% i; {2 F. l

8 v. `* a& X7 ]4 ~% ^& N" z0 X/ X% K; B* |& e7 [3 _
Tetris* CreateTwoTetris()

( w* P( W3 {$ {( N! `! |7 M: h/ q  B) r" o
{

. _6 ?) e& W$ ~! _, m                        static TwoTetris tetris;% ?0 F: m- q& C" k  Y/ B; x
4 `$ ~9 F" `) q/ ~
tetris.InitPos();
3 `& O- `9 G. _4 ~
                        return & tetris;. y8 [* @, a4 L1 ^  T
6 m* J+ K0 j2 m0 W  I: Q+ O& A2 Y
}
3 d! g" b9 ^5 w2 C8 ]0 O

& b. G5 B) x0 `5 l* Q

/ {" v! {) I0 p7 r4 }1 R3 [+ _+ ?0 y
Tetris* CreateThreeTetris()

  f. Z- u) M* R9 }& n# C; f3 o  o$ q( O% e" ~
{
4 r* k8 B! X  x1 l- I% R3 g
                        static ThreeTetris tetris;# e+ v$ h* D+ N' E% ?1 W; z. \

8 d3 {+ k$ m4 [) j7 Ltetris.InitPos();

4 a2 j8 I  {" }( C3 L/ I: s5 q% `* }5 ~% t' m6 z! B" q! C

7 i" _; u' q5 Z8 ]+ F6 _+ u
return & tetris;
0 b/ ~2 ?3 l7 K0 ~# y) W$ G
! ?( B% n1 n4 h" R
}

. Y' K4 ]: ]  d* P' R0 b+ A4 l! n1 \1 m3 |  g
+ H- k7 j) ~2 h- d
; U: F+ T7 I0 i  J, Q% H3 E
Tetris* CreateFourTetris()

; Q# R; y: N' E/ x( _; w
+ c4 x& S/ ^' t{

( z( `, |1 n4 ~7 j7 I, D7 H                        static FourTetris tetris;
1 L. u0 k& m" g# V- X8 ?8 P7 [: }
tetris.InitPos();

6 J  U. [1 l: H# ]8 F  w                        return & tetris;
1 l" x. g5 m1 K5 k6 l4 Y  F; _7 v: W, z; |5 E& v6 Z9 L0 {6 ]$ p3 ?5 ]
}

9 V. V, G; [7 K  b- U& F" E8 q7 d3 v& _
5 k) o: I$ H+ D
6 L' Z# T6 F  |  W
Tetris* CreateFiveTetris()
0 c2 k8 K6 o9 b5 m

4 C! L* D) C  \5 h; c, ?7 `( \{
% B" F  i1 O# l8 p4 I: e
                        static FiveTetris tetris;
" C$ C2 `7 u% k. Q9 f" j& f5 q2 x5 z" o2 s3 a" o
tetris.InitPos();
) _+ J/ x# [$ C
                        return & tetris;  K" d. X/ s# E* G7 K% `0 e6 u/ t
3 F! h# z. t1 n- |; v) C# J9 w! m
}

, D, e8 ?8 Q" E! O8 Q . o; b. K4 Q' }8 V$ h% x, _4 j) A

+ T# g# b( R( y! P8 P3 CTetris* CreateSixTetris()

) d# O! ?8 D  u) ]% K5 @& w, D* }0 x5 @6 Q) h& @+ u/ z
{
4 B9 ^7 R" u8 Z; U# b9 J
                        static SixTetris tetris;
. G0 h- ?4 p, X) v9 n" @1 r+ _$ J
5 p. P- v6 B* M# u7 stetris.InitPos();

0 U( z: w, A( r. R; r* m. t                        return & tetris;
5 [+ o) \- T6 c6 j3 f9 k4 d2 `" k" V  W0 W
}
' x, D+ u! ^6 `( ^
$ N* Q7 n, C. J. U! A$ m$ a3 x# `& Z

( \. z- z, w, _2 q" G) y
2 C6 ^( S  T0 Z) i! z: G5 Q% M0 i" a

: h+ g. L5 Z9 Y) O4 K  t  ZTetris* CreateSevenTetris()

$ Q& Z% a& Q+ a+ X+ W0 J# U: J$ k2 V* f: N" V3 q
{
7 }5 Z4 w/ |5 x( q2 s; {, V
                        static SevenTetris tetris;
2 L- l* J- l, k: q1 h5 D0 W; L# s+ T7 S
tetris.InitPos();

* z1 d9 j4 y7 o6 |                        return & tetris;
0 ~' y+ N7 o0 M5 c2 K1 S6 j; l% e7 E( ~4 d- R4 x# a% K
}
* S- V/ Z, Q# n  ?9 m' @' a. k& F
5 a  s; j* l5 m; K
private:! L3 h, }" H; M& D# x  Q- L
: ?$ W% c9 k. u8 W2 T" Y! P
            typedef Tetris*(TetrisFactory::*PMA)();
( j, X/ S9 e4 ?: N5 O
, e' ]& Q+ l! u0 g9 |* istd::map<
char,PMA> m_sel2TetrisMap;

1 i8 F% w# ]% r" j0 ?' `" g# _* D  F0 O/ G. |4 A

) B5 G$ I* n- j5 O; i$ D; S};5 }4 O# i8 j/ q: y  |( R: G) [( ^
2 I: A) n/ @* c3 h  K7 p7 C
有兴趣的朋友可以下下来改改玩玩。
2 b- W' r, {2 a" X# Y5 t
, N  Z! N* C* }3 q+ H8 l/ O5 LThat’s all!
& o# Z% Q0 b; R" L8 ~+ ~
) P- u# x) M; N' |5 O* l/ u( n6 xPeter
, O; V1 f! J7 `8 J3 U% S, l7 G
. T8 N% o; H9 }, S/ k* X4 D2 f[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-5-2 00:46 , Processed in 0.039929 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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