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

俄罗斯方块

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

" l& ]( h/ m/ X! y; q图 1! Q: Q) t. B) ?  }4 ^" F7 c
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:8 X3 G8 [2 a# b! J/ J- n
. s0 c+ n0 Q8 B, E' b$ G3 l
5 R2 }" L! D$ d! y) Z, @, p
Factory的code如下:
- K) I2 }8 \; q( L+ r % |) f; D$ Z3 b$ r& R9 z1 U
/*************************************8 Y1 J8 Y5 {& {; U& H- X

) m7 D. w( C1 [- l5 V/ S3 @- p1 U! n0 j( H, g* author:hgf_starlovecpp@hotmail.com
8 I7 |, i, @1 @# s* g; c# {& j
' ]1 X9 K; b4 j7 h3 m/ k' e
* version:1.0

% p/ p2 Y9 N: V! b" ]4 r9 i6 R+ o3 N  A  A* s0 A7 O1 {$ I$ q
* description: just for fun
. P+ e" ?% e$ `4 j/ |! n* k0 k
7 b1 [6 V/ Y/ F' o
* todo: hard code exists need to fixed
8 z. G/ G. R7 y( c* M' v6 y. V. H
! D& H7 f2 }6 z. r5 P, k( h& J# y
**************************************/
! _) u" i9 u; C5 P1 `6 z
1 `9 A7 `' U2 J* O3 M
#pragma once
3 F- m! L8 r0 g( l: @#include <map>0 O4 Q/ P  P4 d% j; _
#include "Tetris.h"0 O' S7 m% ]" I8 ]- ^! O
#include "OneTetris.h"* P2 B3 v: \  V, w
#include "TwoTetris.h"
7 e- P- Y3 r' |9 ^8 g+ o! u$ i#include "ThreeTetris.h"
; s* Y4 e% Y) b) P: `#include "FourTetris.h"
" `6 I+ j/ z9 {7 r6 R% A#include "FiveTetris.h"9 p) c! G& P/ Y! K  k; U% M$ W
#include "SixTetris.h"
" j# v0 N3 a3 `' O#include "SevenTetris.h"( o9 H$ \3 c" Z& c

. S: j1 B/ W2 M6 Cclass TetrisFactory
1 ^0 F; w6 {! [& P8 p$ O% y; A{# q+ {" N  [. k" W$ t
public:
5 i/ S. I& R2 N7 {6 H3 ]$ f & t. k1 X4 b* G
* Z6 e. a8 F, [6 @. d
TetrisFactory(
void)

$ S+ _) R: g* e" d/ k" R) t$ V" T- X5 b5 j, M) A
{

  J( m' _5 q% U1 E$ g0 u  I* C+ g" g- w# j) C
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
0 e) `5 n, y9 I1 o) }% x, k* W

/ N. X* Q2 e$ Gm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
& e* e9 |2 \. {8 z' n
. h6 c1 b7 r! f3 d3 h1 p
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
9 l5 ~" ^8 E2 C. {$ _  ^: S; r% |

' f* @3 ^+ o% S5 Mm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
+ d8 ~. n4 [( [- Z$ V
  h* J; d* b8 b+ U, b# F
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
+ c% p1 m2 E' U; U$ T; o# O1 L

+ r' O, Y$ \( h! om_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

3 N( ~. @4 q- y& P
; ~. L. L1 v  Q1 X9 n! `- Om_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

8 X8 |( o% ~# }+ ?0 P: X
( J/ U. A, X; s  M}
: F2 O; l0 k6 }  }% N* F& b& V5 I
public:4 F5 `- X, P0 Y, n
' V+ j9 X8 ^9 h' y- t! Q* C2 ~

6 C& h- O: H; A7 r1 O~TetrisFactory(
void)

6 n0 P: s3 X2 S  p2 Y2 t6 |  Z. _+ E
{
5 K5 l# V* j6 I# @# J
. B5 N$ A& @* e+ K
}

/ ^: Z- y  b  S' ]8 U
' X  {; {: {1 r5 w5 x8 pTetris* CreateTetris(
char sel)

: c1 t) _2 Z1 J; w+ B* X( L
& |' J$ x+ }$ [! C/ k{

; Z; \9 v5 X0 g                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
$ ?3 [2 s) U- J! W* h
0 p% L$ `5 z: }7 Y; h}

! A- X7 O, S& J6 B) v2 Q& c0 Aprivate:' s+ K! `5 H. f0 X
) u: ^/ E' Q: S2 l: h. A  b
( g; W8 m4 q3 Y0 E

: g% Y5 e% O* r8 y1 QTetris* CreateOneTetris()
9 }' H' E& |% i* g) F& _% C& v

) Y" P! D5 Y& L{

3 O2 r* R) W3 J                        static OneTetris tetris;, W5 e2 ~3 Y- T( f( l5 K( E

0 N+ k/ q2 |5 P" ptetris.InitPos();
, v; T4 V  ~: A/ D' E8 b2 w6 ^
                        return & tetris;) a  _  h7 G$ ^: s- G( B

9 d2 A0 H  ?: N4 R* d/ E$ C}

1 m8 v: X( r+ ~5 z% a6 R3 [$ U3 E. r8 G/ b' R0 i

/ o8 x; {$ F3 |6 n* t$ `) {* f3 w0 [' w  L' n# O( }
Tetris* CreateTwoTetris()
' S$ |; m, F) M3 f

: z6 }) T& d- D+ e{

6 Q" u& h) L# P/ b+ y1 q" p                        static TwoTetris tetris;
3 P$ V9 o8 d( t- n
$ y9 T. ^( c" Q+ F+ s3 }) d- Qtetris.InitPos();
) k6 k3 m. j6 n4 o6 ]# ~& j7 w  w
                        return & tetris;# ~/ h% S+ Z3 A* g
9 w. D* ]7 H3 [4 q. u! A2 T
}
, ^# c4 a) h! j8 x/ B( r8 q' w
6 d- R/ b# j) u

' O  V7 c. i( T1 R9 H+ n4 G$ b& D. U- c8 V  q' l7 F
Tetris* CreateThreeTetris()

9 m4 g3 w6 L; s+ ^0 l4 M+ D
+ s8 i/ C" `3 ^: E5 U% }$ q{
, e& s& I$ i/ C8 `* L1 p( _" s& ]
                        static ThreeTetris tetris;; a: l3 V; O: W& ~- Q3 z

* s4 t' P( Q- j, o+ E5 o, V# W4 Otetris.InitPos();
+ S$ [: a8 Y1 k. ~8 ?, e
# |# _# A" M* w5 t5 e% h0 d3 C
, x) O# z# W" q$ m" K) Z2 I
return & tetris;

7 r$ E( \9 P) u1 ?+ Y' a' O! w/ D, f1 G6 M1 L9 j1 `1 B
}
9 z6 Z" j6 A  a0 v

2 k. p' a+ _0 a

9 G+ b( q' X+ ~  u* U) `% O/ ~9 M! v% x; U4 I! }0 n4 u
Tetris* CreateFourTetris()

) y3 E+ @8 K! E$ W
  R( ^# b' {" F2 E6 l7 D! K{

/ Q( R4 y/ a5 o/ [/ K                        static FourTetris tetris;3 @" C  q3 A* u5 ^

, R! s  q/ y! b4 d, X2 M: Mtetris.InitPos();

- y3 \5 m2 \' d! _$ z9 ~4 o) C                        return & tetris;
0 y* y$ q* Q+ J. T8 X' N/ `' Z$ Z3 M, z" L( c( h
}
" V+ [. Y0 ]+ K

) A* L; T: O# `) u  V) ?
' h- P5 m0 F3 I' l9 z

  r; M* W3 k. t* i% L$ R, ^Tetris* CreateFiveTetris()
# Y4 `# k: }- `
- h% t: K+ @% f/ K
{

1 n7 S3 a% ?: M0 L% ]. u                        static FiveTetris tetris;
& d: Z! f# A3 V" _% t4 q! p& |$ q' D% t4 w. R
tetris.InitPos();

% H4 c" E- Y! M+ J& z  h( H                        return & tetris;) Y+ ~1 L5 I( r+ U, t9 i# d

& `- H7 Q) l4 n$ x( z* m5 b, z8 ^}

9 J6 c+ G' H  C 6 \( N4 \5 ~. l+ t  [6 ~
8 G% [7 X3 |0 \5 x- u
Tetris* CreateSixTetris()
/ z: A9 }# c8 y& ^: Z4 \
7 P2 \# W5 I3 f5 _! d+ t
{

6 E+ b1 ^) v7 g+ c                        static SixTetris tetris;4 \- s; m9 @  q6 s6 l& N( Y( o

$ h; s' O2 ?' X  w' m0 R5 Dtetris.InitPos();
$ ^* d' b; ^5 f+ a. N' n- U. c
                        return & tetris;
: _: l# [9 U8 C9 C3 b! {5 ]
! K8 R" \$ U/ @}
! E9 Y1 t% Z; @- g
% S2 V: T! l( u' z/ a

7 c$ c5 S2 w' c4 k% Y

6 D( ^  t5 @  ~( m
0 m5 J* i& L' G' o' [0 i1 A( a2 xTetris* CreateSevenTetris()

6 N- S; @# F- u1 A( C/ b$ {  [. I( V
- Z- A% q3 P/ h( }{

, R, H" `3 @' Y' h, _                        static SevenTetris tetris;- S( h+ N. |, d/ m. @/ K' M- H
/ c8 o  G# d7 L
tetris.InitPos();

9 n; m" a" k$ _! O- R                        return & tetris;- M* G2 |4 Q$ W( M

  P# X& T6 C/ ^9 M3 L  C}
. x, r" O7 r% b6 `- e% o2 E

- M6 b  e# q6 q+ A3 q* Xprivate:
5 l- ]+ x+ I4 b( u
# r- c8 ]# S4 H! S/ ^* C            typedef Tetris*(TetrisFactory::*PMA)();
) \" Q+ q- _/ C' A. c0 l$ f- X  e& I) I& W/ P3 C1 m
std::map<
char,PMA> m_sel2TetrisMap;

# d: S! a/ b  J$ O2 d) t, n: p: d# o4 a, `: ~9 A% H, Y
9 M! d# Q+ y: c0 y) u
};3 I  p' b3 z3 [; U* }' d# v, v: [
6 y3 \, _3 v3 L- W& d6 D5 m
有兴趣的朋友可以下下来改改玩玩。' }) d: x$ a- j9 t$ U& G) v, n
# |5 E8 }, _4 V8 s% ]( A% k
That’s all!
- z# j0 ^% Q2 b. x- o/ Y9 q " z9 D! `8 B3 B$ k3 D4 d/ `
Peter
( Q) b8 @3 Z  E# I/ D  ]/ B( K1 i% W: B5 C. G- \
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-11-1 21:26 , Processed in 0.178570 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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