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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
1 M) j% c( C5 |4 K5 @+ l  B
图 1
$ h! }( F& a7 r. G8 ]# f完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
/ l8 I; C9 c. Z9 R3 v9 W. t) O
3 I( V$ q$ o/ a' \" A: t" r

% |8 D8 k3 o. G2 t* a! ^Factory的code如下:- @+ o) N1 ~6 r. q+ o
' b, ^- A$ u0 a- `5 \
/*************************************9 f+ c* j2 D% G: z6 j* k
' j: n2 P7 z+ y5 d/ |, f
* author:hgf_starlovecpp@hotmail.com
# }; `# U5 j) ~! J

; g  K! Q/ s: y3 V% o7 E4 O* version:1.0

9 D% ?9 d$ h$ I. y6 m
& f& }( D4 K, I) T* L* description: just for fun

" I6 M; s9 D# y. V2 z$ f8 \: e4 `8 a
* todo: hard code exists need to fixed
$ ]; U3 h' H. o+ {9 q  s

+ K' i; {, S  ?" l; m**************************************/

2 e3 _0 P  x1 ~$ q* }' O5 B! R) @1 T" i ' x, y9 w. p# w+ O3 s/ ?& o" u  L% h
#pragma once  M$ w* O# S6 _3 V6 M0 E# g
#include <map>
% t( m8 T; u7 J: ]1 ?#include "Tetris.h"
) n; C; [/ t1 T) E$ A$ m#include "OneTetris.h"8 Y( R% Q' m0 z7 \, g4 E
#include "TwoTetris.h"
% J( w  T9 \5 X#include "ThreeTetris.h"
" S- C9 u- |/ ]* S2 v* A* _#include "FourTetris.h": X; I( S- B; Z" W( Q
#include "FiveTetris.h"# E7 R9 i0 N) Z1 _, [$ D
#include "SixTetris.h"- s( F% w8 G; x, s
#include "SevenTetris.h"
+ q6 A  a. I3 z$ e 0 _) s/ a" A# U3 ^; V. U
class TetrisFactory
8 Y" k5 w7 M3 k) T6 e6 q{. I! j: u& j! A7 z% h/ C
public:
/ E2 K$ K1 s" j/ t$ l2 \, o 5 s& ]. V. D5 h& b5 m* ~
. ]* L, ^6 a7 E% J" Y
TetrisFactory(
void)
/ y6 a$ V  F0 w  @% ~1 n/ E

4 k, d5 t3 z9 K7 }* S{
' S7 n/ H. b: E* p6 I  a

; x2 K) Z! z# \9 T  nm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

! G8 g/ C# o$ d% u. L
0 d+ H$ ]( u, r" Q; E6 Em_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

+ W. H3 c2 }: F0 y* t
& t* P/ B0 Z! M4 ?m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

+ f  x2 O0 Y  b0 {3 ]0 S. G: e9 `6 B* |; |
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
2 e5 Z! c9 q' M/ ?: _

* r) b( x# `  U! Q' pm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
& F, @$ r5 p3 d, l. k
' h. a2 `8 [' |, z$ q
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
/ `( C8 s) D/ l! m0 M

5 \# q* |5 z, ^5 N$ p) u+ N6 Jm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

( \9 v8 L4 Q4 T8 }% |7 F# ^3 ]! G8 t: @& G0 v& Z
}
( a# ^5 u! v8 T, ?$ R. N7 O
public:
. ]6 |' }/ r& ^3 y7 E & b0 R9 @& M/ o
2 e8 F* r0 t0 T( C
~TetrisFactory(
void)

) ]' G9 ?. t( ~5 J$ m: f
) I. O8 V# w! B{

, c2 W0 @3 c" ?! Q) {2 w3 o7 X* b
9 O2 X3 \$ o6 M. Z8 q}
3 P' x4 r% E( l6 x% R' W7 B- ^

2 G5 f5 g" ]# {1 s7 ^: XTetris* CreateTetris(
char sel)
5 v- L5 E& K% m

- c0 M' x6 q) S2 Q' Q/ |$ w{
# T; ], e' v+ K* Y% |9 X
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
1 E8 u: n& a4 W; i( _4 F7 N$ e, S4 A! D
}

. }# Z  g, y" B& L. }8 Vprivate:
7 n; B: q) b5 U  b- Z2 a/ z! O9 U* R2 E
1 z: A! A/ {0 m% N# C' y
8 c8 b- P& k& `4 t) Q4 ^/ e. y" Y
Tetris* CreateOneTetris()
" e  Q( N6 W9 E& V. _& N( @. g
9 _4 P, h, t/ o; p! N" h
{
- o4 a# P# \7 S  E
                        static OneTetris tetris;, j5 F. z$ x! V% p3 W6 |% T
9 j: C. ~7 j& _3 l
tetris.InitPos();
% c2 S: F% Z! [( ?
                        return & tetris;5 G; A/ k" b  R

+ r0 v3 y2 L7 H* {, v, X}

: y: @+ Q" y( ^$ z) s; S$ s
; y& U! \1 P- h; q* s7 H

( x% i) p; F9 G# P8 M, y$ b7 B) G6 G' g( F7 ~$ |& O% f
Tetris* CreateTwoTetris()
) I3 v% W/ H4 F+ T+ j# S, h
5 H! i8 @! N1 E! o
{
* x3 S/ e% r4 d& O& B# T( `  w
                        static TwoTetris tetris;, Y9 y) R) K* g& k. K6 c

( R3 m$ u5 }7 s7 u! Htetris.InitPos();
% h- l! Q6 m6 l5 X+ n
                        return & tetris;& K/ Q  N2 x8 O/ }9 ]" j
" O: ?' ~7 M# v7 Z! N' n' ?7 O
}

  {( Y9 H8 ]9 E! F$ f' G" p# M0 H) T

  \$ V2 d" @# p: a% }- X7 q3 {: r! h; C
Tetris* CreateThreeTetris()

0 ^7 P% C" Q- t
) x: V/ `- J9 Z) B' t5 g- _5 N{

2 S) ?- z+ d. b; X                        static ThreeTetris tetris;& I# ], R2 o' m% H! Z7 `2 A9 ^
  w" Q& s0 w. C& |5 S) a) D( ?
tetris.InitPos();
$ X) z: D+ g& L$ _; K/ w( A$ C

/ Y5 R& [/ `# e( Z: I' |* J" M7 r$ F7 S3 \. b# c  d; d
return & tetris;
6 l6 @( {  x3 ^# l1 f" |

; J9 E7 l  M2 c) L}
8 ]+ w% K# ?: A/ `6 `

0 \( V3 o4 y6 l7 H
' n6 Z' x) A, y* X2 K/ ^1 }$ W% z2 N7 J

' e$ n+ s! I) G' F7 u. p% E8 N4 nTetris* CreateFourTetris()
9 F6 i8 V5 O0 u. [

* |/ `' f% _& u! r' `. D5 @{
, m- @5 d( l6 g) n
                        static FourTetris tetris;
2 O. o5 z, R0 V7 J! _' H( G7 p- d- g+ F" u$ J3 s9 |
tetris.InitPos();

( Q& E' V7 s" f  S+ e                        return & tetris;1 w3 u9 ~/ j1 X

! p7 s3 i. P' L( E}
- T4 e5 x  J; o3 ?; Z- _

5 H  m( ^+ i  P: X" b
9 j: o& U/ `2 \( t8 r
5 q* f7 z- W1 P' H/ O
Tetris* CreateFiveTetris()

- c! r5 a5 D3 X( [  z  Y7 L" d6 [9 v
. K, L* ]6 D" G) I3 i{

8 G4 H+ k# H* [9 P  ?                        static FiveTetris tetris;$ _+ q# c% m: _8 w! z# V
2 D9 m" @/ o* K( b" |4 c, g7 z' k
tetris.InitPos();

4 X" P0 _8 y5 @# Y) J4 w                        return & tetris;
! b! {4 @* n1 P9 ?) J  N9 a' c6 r' f( K- r( A3 ]
}

  ^6 [6 r% B% M4 H$ G/ _2 k
' c3 g* ?' W( h; f& k; _* l" l7 _) c) `- Y4 Y( h$ N5 h
Tetris* CreateSixTetris()
9 x" M$ P' u  |4 K1 A7 \4 |3 V$ {: N
* x& G8 U9 [( @& _6 F! ]% g' ~4 o
{

" F8 s+ J& D# Y7 ^! F                        static SixTetris tetris;
7 {$ u6 B2 W# P% q4 z, E9 ^# @# ^$ g
& q% f% D% e1 W% u* Ktetris.InitPos();

0 H- R' P5 N, l. ^6 I' q                        return & tetris;
3 [( h2 A; _6 [8 y
* j/ h1 p: G# r& M% |0 O2 D}

) T: J' i2 }) Z1 X1 r
" X+ I3 p3 F* z* V) @+ ]8 ~. p7 A" S0 V8 y
3 X: I6 m4 K: _3 c/ y) g

/ F; M2 e# N; P% U) ]4 i+ FTetris* CreateSevenTetris()

+ F4 X8 j# {- P# _3 f" s/ K2 E  r
{

5 |* J% X: ]6 j) ~. ]                        static SevenTetris tetris;
: N9 w# @7 `4 G7 k% ]" W. P
5 N1 n9 V) {2 k+ W: F$ N0 o: Wtetris.InitPos();

3 u) X' @- J( h3 F- u                        return & tetris;
( s! V8 k3 e% T7 w5 |& {  l3 i. `) l7 f1 h7 g
}

6 N7 O6 x, G5 E! W& B! A# s 2 j# \% Q/ ?( M
private:
! L8 ~" X2 ^9 L# [ ) d+ J5 t0 _: z; h. w
            typedef Tetris*(TetrisFactory::*PMA)();
3 ?. T9 x3 j4 h8 A3 t. \6 j) V* |. a9 V. v" q4 j( G
std::map<
char,PMA> m_sel2TetrisMap;
* V' Z* y4 v0 d7 H: W0 _
% `6 M7 }% Z' ~4 J- j

& d* _- n0 B) r, n" Q. E};
# }* y! [0 G7 Z, B. A* ? ( _- z7 l' f3 g" X
有兴趣的朋友可以下下来改改玩玩。
5 x6 P" Y' x* X- R 4 F+ j# B, R9 g) I- \% Z6 ^
That’s all!" ^0 y$ Y3 ]: S1 [! t9 }' ?
. ^& ]/ t% `4 q8 u: x% z, q
Peter 6 }1 O0 X' H2 R

5 _  O7 |$ `% }[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-10-12 08:06 , Processed in 0.051107 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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