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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
4 p- G" I# b; L0 r9 a  @. J, Y( l
1
/ i& {  R3 D* Z8 j: `完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:8 l, n, B8 G0 M0 U+ D

$ d# C2 l$ d1 P& l+ }$ e

9 p+ O5 Q2 g9 A& SFactorycode如下:
% j+ [" L+ ?' m  s( D) H, [ * o# [. C4 ~- A: j
/*************************************
- K5 B* W" R+ u2 t+ h% q7 s6 {, E2 S
* author:hgf_starlovecpp@hotmail.com
: q3 _2 B5 ^9 S

& b( i; ]( O. S5 d; F* version:1.0
) ?) }4 L) X0 s& {0 V

- v$ S0 K& ^6 w; c" g) n% ^* description: just for fun
; V$ e0 @/ T! e" s3 n- S- A9 z" o
+ U/ l+ N$ h% t9 R4 [- _2 H$ O
* todo: hard code exists need to fixed

( A+ D, e" X: L0 V8 `
& i4 e  Y" ^# C1 s0 Y4 M8 i! H% L  t**************************************/

, ], c* z* A( C7 Q, J/ I- C; M9 r+ I. e
# c) n2 {: b4 j# [" }& c6 G. z#pragma once
2 d1 V, V  T) O# g) Z) I#include <map>
. d7 d/ F9 w& n% v$ m; {#include "Tetris.h"$ p7 t  j# W, Z  r4 r  v, ^
#include "OneTetris.h"
/ o: _; x, H2 Z" u#include "TwoTetris.h"* w, i: `( R! b4 r  S5 B# d
#include "ThreeTetris.h"; o  s4 h" O2 r1 a  F6 h2 g
#include "FourTetris.h"& P; |# G" K& C
#include "FiveTetris.h"& U% E  m1 ~8 I+ I) e/ v
#include "SixTetris.h"
5 o' ~/ u: C' h/ o7 z#include "SevenTetris.h"9 G8 I- u/ F8 Q+ Y2 X
+ ]1 L% W! ]( l' t
class TetrisFactory3 j) |! x+ I0 _, ?. g
{
( @0 `) c4 v, A. k) r( Dpublic:* o/ O3 s! n8 v0 Y5 w

% a& d* U2 e6 `
* r0 z1 q' R, fTetrisFactory(
void)

6 S+ s( Z$ B3 N0 H7 k( v' M* r- \1 i% d6 F% m; O5 T  _! O- d
{
+ e: N0 O- [1 I3 ]

- O$ x+ W+ }2 h. Vm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
6 J# u' n2 z$ f  h. y  E

7 O/ i% ?* U0 q9 u+ W7 M* ^5 Vm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
2 i/ n. m0 y( U( |: Z9 p5 @* |4 E

+ v8 U" L6 ^# k7 X" b0 qm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
8 I5 P+ {  ?# [& Y( N. e0 V

( P2 _; ], N8 q& [5 K* m# |m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

6 _2 l( R) }+ o* r% @; V
" H7 B) h0 P! ym_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

* ]4 L8 g3 l4 R7 S, B( M" b7 x/ s: {  H9 s( c9 Q0 y) }1 v5 a
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

* i" y; I* W- U; }  t' D
2 U' P  g. |' X7 F5 ~m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
/ J, y9 u6 H2 k

3 h) Y. i9 P1 H4 A}
3 ~  J: O  G% x7 N2 I. O2 L
public:
" n, x1 A1 e: H3 R5 Z
, p; s" W7 A  n# o! N5 Q9 T. I5 O+ [1 @) H% V/ B' E0 O1 v
~TetrisFactory(
void)
' K/ m. ^6 }4 q, O$ ~' z$ L, j3 L8 u
' c  I+ t: i% t2 |0 y9 H  m
{

' K0 X( ?/ o6 L8 L( \
4 Q2 v1 J5 H" ]. D* l}
( U7 S" F; n3 O( F( Q! D
7 c- t2 y' r+ }! B
Tetris* CreateTetris(
char sel)
" ?) D, @7 x* ]- H

" ~/ J5 Q' |5 L- K% a& T{
8 T, n  t% e; a8 `9 Z8 s0 K9 ]
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();% z; [# N8 G* R% ?
! `! a' ?: P! `# {7 i4 @
}

- \" t2 H% j' D% O  ~/ \. Xprivate:
6 W: P( F$ N0 b* a$ d, D4 G* ?! S

9 q! G. s- G$ \' X. d+ l: E; `  A1 b
Tetris* CreateOneTetris()

7 ]* ~2 F. \. u' h; Q) [# b
7 p, M! M' q; F$ d- r{
0 v/ t, \( c- G8 k8 B
                        static OneTetris tetris;% K% v) V7 l- G0 A) a, k( {- r2 k

) p  k- d0 F9 O0 ~; B2 E+ Ttetris.InitPos();

$ W3 P. D& t9 {& }                        return & tetris;' g. P9 w$ X; A, q$ C0 r& H4 w

. I1 @+ ]: t; Z( I8 o% C! r}

. F6 Q# _" R7 v' c2 M
/ v, M# S0 A) B/ H9 o+ ~
% H9 X6 I! v3 x

3 q. z- K% V" [: W! l0 yTetris* CreateTwoTetris()
7 G$ i$ P9 s3 u3 s' V8 U
% W0 `- `+ W+ v8 U  ~5 O6 z
{
' Z" m+ e$ L$ Q- K
                        static TwoTetris tetris;9 A" R4 ?, L- H+ u# X/ H' F

( [# q. w6 N, Y8 ?2 n- ttetris.InitPos();

% E. y' _, D( z- `3 E                        return & tetris;
5 }  g0 t4 {4 s9 t* e7 @5 R0 Y( F8 N6 C9 P: K% F+ J
}

# o8 g# Y6 k2 l, Q3 i' K
- ]' [" p, q1 {

6 F) }! F) a1 {7 ^
! @* W* L% g) O3 F7 R7 v9 WTetris* CreateThreeTetris()

) d9 ?1 C* K! P; n. k  q2 u$ _; [: E' {% T
{
; J# j& a0 \* M
                        static ThreeTetris tetris;
. {8 q% a% C) m5 Z8 L
) m" g0 y$ G- P* I, Z3 mtetris.InitPos();
- T' b$ H' R3 h: @

( o8 g& a: i) f0 F  G' F. p( e# Y$ W+ |
return & tetris;
' s9 ], r) e) A% s) l* g' {6 c

! u# q' w8 a$ s7 X+ j}

9 \  F* y0 e- A4 U$ X! m. V) ^: K6 o6 H$ \0 j4 M( z5 y
& p9 B( P5 ~3 ~) H5 P7 T

/ T5 p5 x$ Q1 ]Tetris* CreateFourTetris()
$ P( B/ I% w" [9 l8 F. C! E
+ A" f: A3 X* {4 P7 g  R$ `! |; h
{
% W9 j$ x$ l5 L- e7 u! l
                        static FourTetris tetris;
5 ~+ j+ A8 C* B7 W' z  `- H. @: a7 Q3 w1 B
tetris.InitPos();

/ H, m+ k/ S/ [2 Y5 W0 u                        return & tetris;- f+ _/ K# a# p8 k* S

2 C, A, e! M5 }2 l/ Z9 K/ X}
- [9 j; U  s% S
! e+ r  ^1 _8 |9 D
5 ~& |$ a1 L+ X0 o5 N2 v* ]
2 W/ y4 c2 l+ \4 f3 x0 D/ s
Tetris* CreateFiveTetris()

- b5 z) s! G! M' Q# R: N
/ D6 F' R0 G0 j: I% \& I3 |{

$ S+ C! h/ j3 t. q1 ~3 r: `! c                        static FiveTetris tetris;
8 K4 ^8 ^: |- d! F/ t+ \4 `6 R  Y0 [$ v# b
tetris.InitPos();
2 K1 j) c& G9 r
                        return & tetris;/ |  ?; {. u) l8 N

6 ^. k% u4 v! w8 l# T. S' _% X2 r}

) Q* ~: p6 ]4 r. m - m+ J0 q  f+ v! Z2 F

3 o+ j' S6 i2 j# U  ]9 [Tetris* CreateSixTetris()
3 V1 H9 r( N  |" x
* B, @9 W  V: T- T
{

) w' \0 B( X" F                        static SixTetris tetris;
3 R# i5 v7 T* }" p, n9 c; J$ J0 _; p# d+ B3 z
tetris.InitPos();
6 l. m2 |  n+ x
                        return & tetris;
" ]. s' \4 q3 y0 r, ~: a+ P4 S+ B" g+ @7 l5 \
}
2 t5 W4 i; c2 g' N) u4 A
- b9 ?* V( L% U( b1 V/ |
* M5 n) n  K8 I4 s# [
- o" @" _8 Q- O2 V  n7 A

  K: |2 \3 G6 P1 d" h! B* Y( sTetris* CreateSevenTetris()

8 |! b  Q# _) J  G% z8 \* R7 x7 ~% m: B5 G. F2 [; z' B
{

* h- U) I) j9 ~* L                        static SevenTetris tetris;
% r" O; Y, n  `. P5 d: ~$ o7 r  }8 S3 _. U  h
tetris.InitPos();
4 Z! v' C1 y  d. d
                        return & tetris;
, M. N' F3 `: c. h( g8 S% N- f0 S% w6 D$ H9 C
}
! {; ^2 O9 E6 W; d  x

$ G% @: L( W2 ?) Pprivate:, w  ?( ~( p; `  i- k
: L% h4 @  k. M6 C1 S
            typedef Tetris*(TetrisFactory::*PMA)();
9 E8 A" c. a4 r9 z6 N$ v4 ]2 r
0 F+ o  }* O+ W3 W; c8 Bstd::map<
char,PMA> m_sel2TetrisMap;
9 |3 \! L" t6 _: Y; @' Z+ h/ h7 Q7 c7 J2 Z

; \7 a- u% b( C; H! n- t

% P8 w( h3 Y; B7 B};
- G. H4 J5 r! x# J. o) O$ R
; b% E' q& x3 p" D, i0 c/ F有兴趣的朋友可以下下来改改玩玩。, Z- t" T1 r& t

' V- @8 O6 B6 b8 S  M  z& aThat’s all!5 j; z7 J9 X6 ]* [% ~
. v. V3 Q8 q) v, Q( s5 G3 h8 J3 {
Peter
. \4 q- S4 L% \
0 a8 G% u) P3 I! w  q' W7 `[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-2-21 03:07 , Processed in 0.152110 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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