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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
4 c7 z8 Z) V& e
1% ~: ~4 M4 \. v4 O3 K
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:1 J( o3 x: ^/ C0 F  K2 t; B
) W4 C% Y) _" d' @3 n4 Q

& P' n8 n  _/ a6 f2 bFactorycode如下:4 h4 x" i6 q8 A2 C$ @

* ?# r9 k& o  C" G/*************************************) ^* s( N8 S9 x( a

, o$ ~9 w' J/ _. M3 G* y* author:hgf_starlovecpp@hotmail.com

( D% a* @- y2 [* r' i+ v
5 H: U4 w: C6 i1 E- v$ ?- c" U6 i* version:1.0
. @' ?* ^9 b7 k# ]
4 j- Y1 W! {" X
* description: just for fun

% s# w0 b' y" x. Q8 G2 V. i, C' n* R( X* ^# j) M/ k8 X3 u
* todo: hard code exists need to fixed

! c; T+ ^2 _1 D( K% Q' E7 Y" h6 G
* |: Q1 L- ?* k0 f. E9 X; F( B  b**************************************/
  M/ b) j+ t4 g9 ]

" K. b/ c2 q3 ?# o& n#pragma once8 B; r4 N  N, ^9 `: a  V
#include <map>
$ N+ M# j4 E* a- t9 Q$ G' ?# L#include "Tetris.h"
9 L' X3 A, z1 G/ l7 s" i" Z' K#include "OneTetris.h"
  b- [" f- q9 N. e/ [#include "TwoTetris.h", T9 H; \- X$ k& Q. S5 }
#include "ThreeTetris.h"
/ ~3 f" W8 ^) z' W$ n#include "FourTetris.h"
; z7 b% Q  P) G#include "FiveTetris.h"& g0 E/ g; H6 I. j7 G: R. I9 ?3 ^
#include "SixTetris.h"
9 A6 P2 p1 t5 ^2 t: E8 y5 i/ h( K9 Q#include "SevenTetris.h"
4 ]0 m- }& B& u; [
( {/ r- g& F/ i- v; u6 Pclass TetrisFactory6 |! M" n6 ]8 i) J9 B
{9 x# d7 @: _8 ^( ^' x, }9 D
public:  F% \& Y- h) N9 v: B+ U7 H' J+ G! X

0 Z6 B8 i0 z& F5 t& X8 F
' H- D) n0 \7 y# ?) f3 Z1 s$ }* F9 rTetrisFactory(
void)

, c( c# [  F; D! |. R7 a- c. R8 d
) E' V: k# E) U3 x+ I$ y{
* g- d) @" }# i) ^$ F1 {  f: x$ E+ c) N
- ^- V. s4 Q7 ?$ F6 P5 N9 F
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
9 \+ H" N( ~: ?( q& p! s, x& o
9 c4 s. I7 c5 w. F: q* Z, F
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
  q& O) [: W- ]6 A6 v
/ e: N! o2 ]3 }: U% Y
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
0 ^/ K: }" s( c

* Z7 r) `9 |1 T0 d, |- Pm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
# r- S3 r9 n/ U" I# n8 W5 Q
: D; p1 Z5 X: Q2 w
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

2 M  I: q! K3 j7 r# k$ h. X& F6 i5 q4 [0 U
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
* j. x3 U) k7 a; @

9 w. h3 H% Q# T8 H3 tm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
- W8 L/ r' \  k5 a7 R& u% _

6 K8 k1 L* ]2 I0 m. ?}

- C1 s0 j- t4 m6 O+ m& V# ^! dpublic:/ ?8 g0 R/ y+ A. g
+ b! j9 L' K, n- c

1 K; w# T' j) H0 f' {! E~TetrisFactory(
void)
/ a2 \3 P1 B  }% ~1 h# c
9 @- B. K: a* B6 u& o$ m6 T
{

+ o. ^9 b9 |! f& M" }$ K  b
) v; w6 u" w! l. Y. o}

8 \# |/ z' x4 ?7 E' g  C+ Z6 Z* I# E3 G& \
Tetris* CreateTetris(
char sel)

9 _- U( l1 h+ y( a' T
- P2 h0 I% O5 W2 T; c{

; T6 `& [$ |/ L% K! m% \/ v* a                        return (this->*(m_sel2TetrisMap.find(sel)->second))();# a5 y0 _& l9 U) @, I- S

) o" n: B0 p! Z}
/ q% D5 l9 O! O; P! H% p1 L
private:0 E5 {4 |" l" g' m9 G8 e( M

5 K/ _2 O# e) r0 [

. K6 D. s3 Q3 ^& C# J% Z# A& D# s9 q+ W  A2 P. Q
Tetris* CreateOneTetris()
  s( z0 @+ H3 _8 W/ }

, x( h8 f  F2 K# T7 r{

2 f7 Z  C* e3 R; p3 X9 G                        static OneTetris tetris;* r  U% D" T$ S3 J4 S. D  u

4 y2 _/ |( m- g2 W" Utetris.InitPos();

( @) E) F. C6 J& K! L' k  k                        return & tetris;
  m  |2 L0 n# S6 @( F3 H) x: c3 e5 V# }6 l
}
) w& l% F4 ~% C+ p  a
7 }. S: Q1 g2 }) D

0 y1 B( C' ^( W3 e. I1 U  g' ]4 W9 ^* B2 y$ v# E
Tetris* CreateTwoTetris()

) N/ D" h& w  O( h3 E% }+ O, X" g
{
/ y9 s& p) O- n6 [8 J
                        static TwoTetris tetris;
; c) T' A4 p$ e) b/ E; w8 q9 E  _. T+ E& ]9 a+ j. A
tetris.InitPos();

1 }! k) f  Q+ m0 c                        return & tetris;0 O" O1 k9 a6 N

! j/ h' @& y% H/ O}

$ ~2 \: X: P  v
! ]% R5 I7 b& }+ J( O

3 n9 B7 F( W3 ]
5 b! t% w9 v  W) N6 S/ ETetris* CreateThreeTetris()
& {" J, r4 J3 W2 [; e6 }( `3 _
4 ~5 q, S8 X8 W$ }2 X' E
{
7 |& @8 X) L$ O/ V: d, I8 F
                        static ThreeTetris tetris;& F! H! }2 J4 K
& O* A9 c1 W2 b% \
tetris.InitPos();
6 a* s" w4 {3 K, Z  _; S/ ?
% b! a8 Z3 e) }, h) }
* m  s5 P6 Q0 P' }) m3 r$ q
return & tetris;

$ K0 j+ k4 \+ n# j- o
/ `6 K& N( T! z4 Y1 u* m}
% g' W6 ~: o) m, M

; F1 G; {6 N5 l( e3 E; t

' k; E! W, }% }; l* v: s: S
$ X; _2 h8 X% bTetris* CreateFourTetris()

- r5 T+ j! a! B* e- ?  _0 S+ v' Y( ~( @
{

- k( t2 e1 t5 b                        static FourTetris tetris;
% u; u$ x) F; v9 J
0 y6 ]. R7 |% `1 h. D/ G( f- Rtetris.InitPos();

+ v1 }% P# U& V- l' t: M                        return & tetris;
0 Z2 a) a, ^& |; [* |. k' ^! @; @4 h9 O* h  ?
}
, b# y9 X7 P5 k* D8 F

/ l1 O" Y, b) k0 \$ M" d& R, @
  x7 Q$ O7 B+ l7 Q: z3 j. p; r

$ v; \% A" I  R2 c6 @Tetris* CreateFiveTetris()
+ w" ]* q% \8 V& w& ~

1 ^% W9 q6 ?. Q, }# A8 b, `{

( b' L, R8 U  y+ r# c, p                        static FiveTetris tetris;! }7 @5 m- X5 w$ L) E9 t" K* U8 X* }

6 L) }# Z3 Y/ [% Itetris.InitPos();
: ?6 M7 z/ @& t0 [  f; ]
                        return & tetris;
9 W9 f/ @- |0 S" x3 q1 J) t  t; P% {6 X1 V" }
}

# P" O* r: p% R  ~% l% i- W! T 4 M& b" T2 A) a6 B9 X
# T4 Y7 X$ _' M# ^' z3 q
Tetris* CreateSixTetris()
) Y. e1 l( V/ w: {9 L( d+ r

$ q+ S7 b* ]6 Y  e' r{

* q/ V5 r* K$ a' b2 Z' m# v                        static SixTetris tetris;* x) u6 v4 R$ X3 s
* o8 r) Z2 L3 Q9 W9 D: ]
tetris.InitPos();

3 l3 V6 m7 y5 v& `9 x; n                        return & tetris;
1 }" Q+ C1 ]' U+ ?4 L
8 ~9 A; T4 N( N0 Q4 \. H5 {8 x}
. N5 r# c4 c2 `- Z

# |/ x  t% D8 c; M
# d7 W( L. D) w' ~" b- @( Z
# T& l$ H) Q3 c1 W# Y" s( j0 M6 r

# K' _# E- K( ETetris* CreateSevenTetris()

( ]  F$ ?! t0 i) b$ J' G
2 V5 u' ?0 K: v5 M{
" C) ?8 m! Z; i. E' d; C
                        static SevenTetris tetris;
* a5 y' ]& e3 t; s- t. j8 o
/ H1 M3 T% I; S+ I, k/ Z5 Ltetris.InitPos();
5 Z9 [( M  C  [$ \0 V6 x: m- h
                        return & tetris;
3 G5 V* }3 ]: T8 Q" v3 o* Z  |1 o
' C# s0 d0 s$ Q& j+ C  n% z}
: t( a* C/ N) {9 E9 h

9 o3 H5 d7 s) k1 m$ ~9 K7 _private:3 s/ Z2 B; g4 G' x
0 b# S" o6 I7 d  Z6 r# P# P/ A' u3 e
            typedef Tetris*(TetrisFactory::*PMA)();0 y8 t# b/ a7 ?8 ?8 e. |) V' J4 J' w
; H0 L6 {+ o- c# n+ K3 R. g8 V0 ?; w
std::map<
char,PMA> m_sel2TetrisMap;
' \# U; ?( m$ y- I4 c- R8 ?: o
) i9 d) Z9 ~0 r3 g( E$ s

/ N: R7 e8 m7 o0 g6 K/ F0 g. ^  Z2 K};
8 I. x1 C& v8 o- f 5 C& `) a" A4 Q3 ?: M) ]5 I
有兴趣的朋友可以下下来改改玩玩。) C. J7 X- e2 }6 i' e6 o
  |1 Z. b( `" Y
That’s all!
2 D! r. {7 e' t. }9 X ; a/ {6 L) }+ \& z9 Q  T6 o+ x
Peter
2 k# N& L! G4 t* ^5 t7 h( x" A
& d/ w3 V8 N, ^0 M; w" M# r, w[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-8-11 16:04 , Processed in 0.065108 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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