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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
: x7 v: Y* f+ g( H
1
2 x/ Q5 T5 ]3 R完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
! U& g  p& m$ ?- X  \8 R7 H0 Y
* F. q# h- `3 B( U0 v% Q; d4 }- o/ M

3 \, {) U" P# S/ b- u& h* @9 U3 ]Factorycode如下:/ ?/ r' ~+ v0 ?" I( l3 d
2 D0 H1 Z' h, ^/ ]3 V4 C
/*************************************
: E3 r4 ~2 M8 k2 i( I& `7 A
; P. T4 i& Q+ [) c: h* author:hgf_starlovecpp@hotmail.com

/ e, ]6 A' R0 Q* C
" ?4 g# |; a  P2 z7 m7 b* version:1.0

, E7 j/ v. ~5 |& |
) g' w6 s' |8 U, a- o& ]1 {& ?* description: just for fun

) Q5 S$ _' }* T' v6 K
9 x( t& R5 h7 @( O  F0 m) u: a* todo: hard code exists need to fixed
' H' W7 [9 v6 T% O0 {5 H4 p( G* L
. a! p1 h. H+ K# k) z1 h! c
**************************************/

  i( ~; [) S5 Q! d3 t6 f5 E5 a 0 _3 l, W" _" _& |1 \
#pragma once( A' t% Y0 E. V9 a7 a) |$ c
#include <map>0 A# |2 U8 S) [# U
#include "Tetris.h"
2 t$ V$ P; O3 d' U9 C3 ?% q#include "OneTetris.h"
6 F. b6 S+ P7 w9 n' }#include "TwoTetris.h"  A: `3 v# V3 v7 ^( _" @2 K( g9 |: D! O
#include "ThreeTetris.h"+ }. r2 m) m* [/ f% Y* r! }
#include "FourTetris.h"" Y6 a+ [3 [+ `
#include "FiveTetris.h"
0 N& k# O2 W6 i/ x" @2 u1 z% r#include "SixTetris.h"& P( M. q9 C& _
#include "SevenTetris.h"
+ u& U; n* q. H( A4 z, z
) k+ t: b2 X0 [7 ~' {- W  Bclass TetrisFactory
5 s- U6 ]6 Q* ^0 W5 Q{
, _- c" ]. o. l! a8 W5 jpublic:
! n+ G* \# e. s
/ n' a) Q' m+ W0 u/ ]+ @2 H  f% t1 Y' i' [9 Y2 k
TetrisFactory(
void)
; \( Y3 E- ^4 f! {. t9 _. X) ]

  Y/ O0 s; K7 m  }1 H$ q{

7 V$ X5 |# q9 [$ ]1 ^" a
" ^' x. T+ B, A2 _m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
2 _/ q+ W9 t  ]* _

& r. L1 ]6 i, i: a8 w% Cm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

& X7 I+ V: p2 [3 O( s: N' ~
9 S2 m4 P( d1 J0 |2 Om_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
2 h: d# `& V( L! l6 I$ T- E
9 u' h1 S# V4 x6 {
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
& d/ z5 k. G, P4 O3 v  p

& l7 H1 Y! _: M& `' `* [m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
/ |5 R( \6 |/ `: l

& S1 B9 K$ S, \  Z- wm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
0 ]# j8 c6 U& Q% ?* ?$ c8 v

1 b' U  R9 d- Xm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
5 i' g9 c) {0 R8 ?7 G/ K
" z; h: T8 E7 A# J* t5 Y' V2 c
}

5 N5 N) O* Q' l: s. H) a7 P: Epublic:# ]% v8 s% t) ~2 ]8 N# e

5 b' X; H$ y1 T
9 b; O3 ~8 y( K5 U$ K~TetrisFactory(
void)
1 v3 I) D  i9 p+ h0 \& V( H

/ d; B1 a1 j, x6 M2 ~{
7 r. b! t, I9 w8 P3 l& j8 ~

7 s3 p- U, }: d+ G& ]: q6 e# Q! }}
8 n0 @1 B4 L1 J% i. V

% l4 o6 w5 \1 o9 lTetris* CreateTetris(
char sel)

8 _$ l9 A8 _9 z, z" D0 g  V$ v3 s
( A0 N3 k" B3 ?( r+ d& L{

2 m8 c" y' f+ W- K( [# O                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
  M6 r7 K/ u; |4 H) E6 \% ?) j% l9 e0 v" i/ `* c, f" z
}

! M$ m/ M: ^( O0 uprivate:% J4 ]' j% O( E" @, Q
. y& O, Y; ~: [# a, E" z

! W* O. E* [2 V0 @/ w8 J
# o, l3 t) }4 W- \Tetris* CreateOneTetris()
) l) G" X8 a8 o- I9 ^9 q5 M8 I1 [+ W! ^
/ J1 w2 e- F* `. g, c1 q' J
{
' Q# l/ [% T2 X9 v1 O7 S# y
                        static OneTetris tetris;$ C9 O& o* X1 M
$ F5 V6 D6 M$ I* N# @2 p
tetris.InitPos();

2 W  i1 G6 f. T                        return & tetris;! K" \, k2 X* e$ ], P
- R* y1 c$ s9 b" Z& u$ Q* J
}

  B. L5 ~+ K0 ~/ v3 b  @& O# t
. i6 a/ k! P; U$ u9 k& @

1 }; S' h  W- l1 E- k2 ]; z6 v4 |0 b/ D& |
Tetris* CreateTwoTetris()

+ F* {1 `0 P& T+ b. D& R/ L
+ w8 }% E0 D" x' K! K{

4 }% z$ j! l8 \                        static TwoTetris tetris;* g3 P2 _; _, O3 [0 c6 h

* t+ H( K6 M7 s3 d* vtetris.InitPos();

7 ]  t2 |* y3 h8 o" G8 w                        return & tetris;
2 U$ Z2 X& ?! j& m& H
. z3 o' d# K4 A+ g, [8 c}

* m9 |2 j* p/ u+ S
7 T3 `4 R6 p! B, U+ h
9 n+ p, q5 [) i7 U- M  g

1 I6 X6 e0 }& |' A! y/ cTetris* CreateThreeTetris()
  E1 l7 }# Y0 m

& A! k- h; r8 N/ s  Y{
1 [  I! v8 H* Y3 w) h/ _
                        static ThreeTetris tetris;) f" E$ ?: `. s8 G+ F5 R
2 l% A7 @! I7 ^$ p/ H- l  h
tetris.InitPos();

$ G5 ~2 Q) K; o; N6 b( N7 ]$ n0 }+ T

; A8 Q1 Z6 t, P' c- d9 k9 j* v
return & tetris;

7 q1 d! ~' |# ?9 v; L3 X8 q( @/ V, ~3 N0 `- y+ ^
}
% ?9 d: e5 w2 y3 [' H

; _9 F5 a; ^% q/ c( W( p

0 H' r& u& n, t% F
  V; Z, ]8 J5 yTetris* CreateFourTetris()
* x- x1 s/ t* p) r
% |0 w) v7 C' i9 e
{
- u# }. R# y6 ?( n5 J  D
                        static FourTetris tetris;  J, n/ u* ]% D8 L7 F

' H1 g0 _+ w( U  V7 x! rtetris.InitPos();

9 Q9 o5 n* b- e& `: F! {3 ?  P4 P                        return & tetris;! b/ w2 C5 X2 H6 G! K/ T, a

5 R  K& |7 N7 a) X- O; S  L}

) O' t2 [/ G  V- [
* r( m. z# P! D5 R  j( d% F

9 _7 p+ t; p" L! ?  q
' {& O" Y* R7 J' ]5 a4 @Tetris* CreateFiveTetris()
( f$ H7 j5 Y! N5 v
& x( B- E( d9 k) C% z; V" L
{

: A! B. t* A; a9 [" d                        static FiveTetris tetris;- m/ r; r6 D* Z" e5 i, n
& W: [- B1 y( F$ c
tetris.InitPos();

% k5 D# B3 r; w9 ^: ^" M                        return & tetris;9 O4 f5 n* K1 B3 w
, V: c0 z3 C; D( i3 K' d
}
$ Z$ ]7 J, j5 A" a$ s+ }( ~
9 z; Q: S  Z) V$ K* p3 M$ u- L2 G3 S
: r  {. ?+ }7 x' t5 X& a
Tetris* CreateSixTetris()

4 ]: E. a4 o6 K& v5 F) X: l; I3 z! ^
{
9 j) A& z8 f( O/ X  A
                        static SixTetris tetris;' C8 X: P$ s4 c7 C7 G* f

. Z$ ?$ @' p8 H1 |- ]& d9 jtetris.InitPos();
/ D4 h8 w& E/ R$ E. z0 d. e
                        return & tetris;& B8 K4 s# C5 R

1 X" T2 p; c4 o4 a}

& S0 ?% B" W$ P* r" }, t9 p
% ]* ?" r, Y$ A5 x9 Y
3 Q4 _9 C% Z2 c. L) E

7 b: B- J0 u8 e3 ~% `0 V" M. {2 |: n4 O& ~
Tetris* CreateSevenTetris()

7 T- R) _; K/ s8 M/ I/ r
! K) _9 M2 K  \3 R{
$ l' [2 o# j) s: y! B
                        static SevenTetris tetris;# I9 Q. _  |% z+ E

. ^0 _5 _( C8 \4 v1 d; atetris.InitPos();

  r5 e9 x3 y' s0 T                        return & tetris;+ }3 \& ^6 Y7 s% |4 f+ [

+ W1 G5 z2 p# r3 N: R}

2 P: p: l; t. H1 c
' |: O* S& x& y5 p& tprivate:
" t9 @1 c: M' b  W
6 J% o+ h5 z& b! b$ F% ?6 r            typedef Tetris*(TetrisFactory::*PMA)();+ Q! W0 S# q# Z  }
0 u$ u- ^3 E+ J, w* z$ i" p8 q
std::map<
char,PMA> m_sel2TetrisMap;
+ s8 ?& H! m$ U) U4 I' U7 f

6 V7 S' u3 v: u" R# u1 u' P. s

2 O, D& o# F/ V+ B: e};
4 ]" t0 k5 L: U
, ]9 s! ?/ f. @" L/ f有兴趣的朋友可以下下来改改玩玩。/ P" v: t2 T0 w
* c. O5 Z; |& A. L$ u; x
That’s all!  m5 \: a+ Y3 l) p/ s
5 P7 g7 T1 v2 s) v+ d7 A! k" O
Peter 3 }* }& j/ @' P; n$ \1 L7 L( |

3 @4 s( t. v3 z& N# i5 g" S4 V[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-1-18 19:14 , Processed in 0.057658 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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