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

俄罗斯方块

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

: k. s7 z* S' {' H1 Q 1
- \! Q7 V4 G8 b( X; w1 W- S完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
$ \" P5 x; c: `8 ?* z2 X/ R! _2 s( u- p+ x+ a
8 G5 O- b$ I" p  q5 _6 v
Factorycode如下:" @& r& x- R# ]% Y% x1 C
# x' x/ g6 D/ c4 S2 n7 b: f
/*************************************
+ n( Z1 k& |0 I' u4 d% O+ o( b2 N3 v3 g$ Y! g! S1 f! |6 r' E
* author:hgf_starlovecpp@hotmail.com
' Y1 }9 y" b0 s2 _( {& x
' G. v3 N( V9 y( f) D" `' y
* version:1.0

4 u; R6 _; n& M- @7 R1 B/ N2 A3 z! e# ?+ K0 }9 o% P# V4 Y: L
* description: just for fun

! M9 C& P# L" ?$ G$ ?( h, |) Q6 ]! i& H2 A3 e# p0 Z3 F
* todo: hard code exists need to fixed

* u  V4 X( I( l1 M8 ~4 G* Q" I* E
' V2 c1 t& e* i+ ]; u/ s1 H**************************************/
* e/ v, ~- v! r8 U; T' K

* t! X& t  T2 p+ b5 _#pragma once
6 A- G2 W6 w0 e4 @5 X5 W: g: N#include <map>
# b& ]1 g. f; |#include "Tetris.h"1 w$ X, R* O- a1 b) m& [
#include "OneTetris.h"
- J; G# v& I7 e- D% c#include "TwoTetris.h"& H9 q/ |8 H  d% k
#include "ThreeTetris.h"$ e; Q$ c' v6 f4 k* u3 Y, W, ]$ U$ ~
#include "FourTetris.h"8 }  U+ W8 R% y% M
#include "FiveTetris.h"
- D! y, U/ P& F9 m; |#include "SixTetris.h"3 S5 J: {+ D6 e4 y; q
#include "SevenTetris.h"
' i$ z+ `3 K7 Z% [( X" c
" R. ]3 L" H4 ~2 mclass TetrisFactory
5 p7 G/ O; x: `4 r- f0 p* {{- ^- ]6 ?. a" O3 k. [$ e9 j  \
public:" q. p) E3 ~: p! _

, e/ f5 ]0 ?; G) G8 }' o2 E. m4 T! B/ g- |  q$ @8 ^
TetrisFactory(
void)
8 M$ B* @" m- p! u3 X3 m  s

5 U2 n8 B7 }7 }0 b1 }4 o8 X{

& J: F. I  E1 a3 h  u# ]& r* w
9 X3 z$ b8 A" A& I9 I% e% zm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
, _. c% B% z( ]; d7 ], r1 M
: D* z, N( ?5 {  E; i( T8 ?
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

, c, [: A6 n, _  ^0 l; a( t/ S; ?6 G% Y. |. C
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

4 p6 s- D! E/ u* C+ w
. E3 F" j2 t8 m1 D( c1 Q" _m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

1 U. _6 w8 u, b0 m
# b3 K& I3 l) C, R6 Cm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

2 _' k) }, F, I+ w! C4 {6 V! V& w
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
' |- f' F; c# O% M
: d  f; g, }8 r* u2 q
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

4 g" Z" ?# V$ B3 x! H. C+ q8 f. P) q# C5 Y. m. ~
}

4 A0 H1 o2 Z0 K1 y0 v. Ipublic:! |1 b; T$ J7 K' q2 r
: ?4 i' W- k" a  u* t7 r
3 j9 a& y. a# u: M; J6 z
~TetrisFactory(
void)
. y* o* B( `  F: \" M! L. B5 ~2 p) |

- K  K! n+ {0 g7 k! c{
6 n% m& k8 H- ]3 u" o

8 f+ T) ~( M4 _& y}
3 q  A+ n' ?! l1 |" y- \+ f
# s4 [9 H! j0 T! N
Tetris* CreateTetris(
char sel)
$ U  T! g4 Q' b( I, c" S' q

3 _  L" V8 H* `( n{

4 F/ ~9 |/ H( r3 H                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
: b" W5 E( v9 D( A8 y, W+ ^4 ~$ A$ x( |2 N0 C5 H+ N: y
}

! [  h% n- q5 q4 rprivate:
( U+ M" m  E/ V" ^* W; N# Q/ X0 d
! y7 M+ G* y  Q8 W
! l  _  K" Y) `" O! O' k0 i+ ?

3 U* g/ X; q' ~% V9 hTetris* CreateOneTetris()

1 Z( g0 Y5 O' [% x0 m5 ]4 S& `+ X- Q% n) D: m* ?) s% P$ ?
{

8 ]; {& C! D% W4 O+ |6 A                        static OneTetris tetris;
. L+ p, G* `; \+ m3 D' @9 X' E% R9 o0 W, l6 Q( x9 E9 a# J; s: a
tetris.InitPos();

, F; s' J; [. S" J. k# @                        return & tetris;& L" z6 D4 T; u% R; \9 m4 ?

: l8 t( V6 l+ J0 }/ H}

- h) o1 X4 R4 u, }' v# q* H
1 {) J" y& f' ^: m+ P+ o8 O! [4 ]/ B

! H) `3 H5 U5 [- n: q( ]) t# O4 n! {4 z1 ^; b! [+ G! r
Tetris* CreateTwoTetris()
) W  W7 M- W0 o
+ o' q/ X  \& W2 d" t- r3 }1 p
{

" C  B' o0 _' Q, ?) @                        static TwoTetris tetris;
* c. O& ^* v2 X# S. K- d
0 F/ y8 z/ |+ t1 o7 utetris.InitPos();
( i/ T+ Z' p; y: T# _; _
                        return & tetris;
( B- E9 p7 |8 l$ K5 D9 ^* S
3 O7 C6 i' O5 H  u2 F" |}

8 d( l/ L1 |) L1 E9 l$ l0 T, ~/ l. Z! G8 `1 y
5 e. ~( x; Y4 L/ G* W" A! X
: I3 R: D# U' k  U7 N6 p- ]
Tetris* CreateThreeTetris()

' ?2 N) G" c! b: Y/ p2 }/ o9 L: G0 r, r% u" s/ A) a
{

: E, ]. P+ a" {1 \                        static ThreeTetris tetris;! J( y) _7 T- W) F6 {
- E1 M& Y- L8 ?2 C7 P7 I
tetris.InitPos();
6 j$ e- @5 V) j% p" p- \/ Y/ [
' W+ q% S! Z- }4 k" p
. {: ?5 x6 |8 a% W9 n3 w2 G7 h6 J
return & tetris;

' }; _- y3 a1 s1 N' f1 f# n# ]2 u/ V3 ?5 {3 K$ \4 e- F
}

" h0 |4 N* ~1 N; y4 h! K  S- ~4 W9 }  i

+ \3 E4 Y3 ?8 w2 N9 z6 E7 d9 k7 M# `. t9 P3 W$ ^
Tetris* CreateFourTetris()
3 \5 n# ^6 o! ?$ V, A3 r
5 b9 d( [& t4 _/ \
{
/ n; A9 a" c2 H
                        static FourTetris tetris;! R( n2 i: x) n  Q- A+ \/ a

  M8 ?' S9 `; ~tetris.InitPos();
7 `7 b# s' i1 k% R
                        return & tetris;; _- ?. @. L$ f  n' O

6 @, K2 m. T% v. h3 w}
8 E/ O. D9 V8 E- ^. R* K

  C( p% {. S) S* B1 Q
! l2 H7 u3 A; J2 s: n
: h0 k( Z( |* y" h6 l" e
Tetris* CreateFiveTetris()

5 N$ s" r( |- C. e+ k6 [
* Q3 j! C" `/ r2 r( o8 P- Y{
$ J# c" p" A7 F1 Q* t$ r
                        static FiveTetris tetris;
2 y9 _/ a0 q' M& B+ |/ y9 m' H4 o; V% U! k# c* P
tetris.InitPos();
$ Y. {8 v7 W3 C: C8 _
                        return & tetris;- B  X* c/ H) o4 A+ O; m

: J# j/ m/ D1 N+ p" q3 h; m}

+ ~( K3 l2 c! W. R( v
7 H! [4 v  \- f4 H5 k* C+ _/ j& Q$ G2 B" Y6 @/ j% l, G% V
Tetris* CreateSixTetris()
! ]* w# h  X4 h- L" `: z

5 M. R( |2 I* T! ]$ M{

% w; `% g) W8 @2 A6 X0 h" w                        static SixTetris tetris;! Q# F- z3 p7 y. a

3 ~2 `$ v; }; D$ j/ y9 M: Ttetris.InitPos();

  k& P% E/ j7 @8 C% Q                        return & tetris;
* i4 Y3 ?# X7 U) R% _, {2 p5 `: R6 K2 P2 `( x( T
}
! s7 |8 x5 t1 A* g( I* }& _7 L
  P# _# P) y7 V9 o+ f, e6 _4 w

+ [6 z+ e9 L2 i4 P
; A5 V0 h1 b6 r5 a4 O

' \+ Q0 M/ E2 I1 f) wTetris* CreateSevenTetris()

2 S- ^9 E% L, r' }( T5 X8 E
/ E2 U1 @6 _8 k5 e7 Q{

7 ~3 r1 ~* L( [& ?+ P, T                        static SevenTetris tetris;
2 R; L6 {2 V: C1 j6 R# K4 {( _  h
5 v2 \* l, c7 {$ H& Rtetris.InitPos();

7 x# p; g( i/ O7 J" P/ P* y9 E                        return & tetris;8 q6 ]$ c1 `: s9 W5 a' ^* h
, K% \$ I1 E8 {: @
}

* s2 o; ]* A2 t5 N5 U . c  c  x* R! C( o' ~( Z" Z0 t
private:1 |+ ?1 @' s2 S& O# [' \2 i
+ J: Y1 ]% \! b& v4 ^! u5 }& J; t
            typedef Tetris*(TetrisFactory::*PMA)();0 A. ?& }: K- E& @: t; O3 }/ r
$ s* N' }4 F2 l
std::map<
char,PMA> m_sel2TetrisMap;

* o6 j! J3 r+ F0 [' {7 G5 I: B1 g7 F, W/ e
- J! P* b# u" T" v  a! Z
};
4 l( i! _" s- o$ g ) l7 Y1 F+ B: S* W  U
有兴趣的朋友可以下下来改改玩玩。
0 A# s! q- q0 J
) A1 n2 C8 M5 x+ A5 u# `) @+ e: c$ x3 i% GThat’s all!7 s$ U8 o$ z6 E* _9 h
2 f! {& w/ y8 o7 U
Peter
2 F+ n! ~! Q/ M. a9 ]4 M0 ^* O2 v9 X
( S- t6 ?: }( z& `5 @- Q/ g8 T[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-2-19 07:00 , Processed in 0.043115 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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