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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
/ ^/ n4 h/ H* Z+ _
1
/ y6 c; o. K' O完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:% `, {( V+ ^* ^& }; _& D* d. S

$ a4 R0 R: t2 @6 \  r, H$ R& Y0 c

1 Y  w- g; \# r5 i- YFactorycode如下:3 o* N/ j3 z' c" z
6 X' H9 d( j4 W
/*************************************
+ b. _9 a- b  p* x' O0 f) a7 s
) r+ e8 i2 c4 b; g' A* author:hgf_starlovecpp@hotmail.com
& c* x2 s9 A5 z8 t9 z

+ X' Q& Z6 p$ p4 T6 J* version:1.0
8 v) [6 j" D. s9 b7 g4 z1 k
0 Q. H7 K6 r0 Z) [- H6 @1 E' ^# k4 h
* description: just for fun
" U& z. ?7 _/ x4 o. D: o% y
1 P1 _. Q8 ~' g/ t0 N; p
* todo: hard code exists need to fixed
# D. f4 m4 \; ~" e: x/ q7 g

7 G! J$ d( g6 n% ]4 A8 X**************************************/

- a0 ^, m& m' r% B3 o
& a- _8 i: D/ ^' B; n#pragma once# Z" q% r1 B0 x& J* B
#include <map>1 Q9 G1 e6 D  V& {7 T+ t
#include "Tetris.h"
9 d. s/ @( \/ B2 A: q#include "OneTetris.h"- O9 \) D9 ~) N' R9 d2 D
#include "TwoTetris.h"
6 c/ B" |( ], g) X' U#include "ThreeTetris.h"
- |7 H" g& W5 S9 C2 N  i#include "FourTetris.h"4 j9 o: E; Y" W2 o
#include "FiveTetris.h"" v$ p% |% p/ v4 _4 L9 i
#include "SixTetris.h"+ l) {/ l3 R3 q- Q( @) B
#include "SevenTetris.h"
. \, \. ^( }  Q* C
" S7 x& H4 j4 a  F7 H- ]class TetrisFactory
- O0 F1 K6 b  x. I. D! \& [' ~{
& }: F6 o2 l+ {public:, a; }8 U2 z" q0 J0 e$ x! Q

2 n* F4 z" \9 G7 A
+ l, R. z' B$ s9 X) y+ ]% ^TetrisFactory(
void)
2 L: g7 _- K. b/ i% ?; d

0 x  z$ ?0 ?4 M0 A( i1 X" @{

7 t& l) L8 N, t) {
' w- X/ l$ _0 O* x" M! [* qm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
- n% Y+ f7 r" D+ G  p

' ]5 i; I. U$ [9 b  bm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

/ @; a5 u2 n; R* S  H% H! W4 P4 k" c' H) ^$ _
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

# r  K4 y2 D( a" C5 f& @
1 i1 r8 |0 s3 w4 [6 m$ V& W0 y# vm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

0 x  I" z+ V7 u4 B% Y
9 Y! r1 Z, O4 b& ]* u8 A0 y$ {  nm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
; e4 W) L/ {6 ?3 W  _# e% X& v

" Q" Q; E# h7 `, P, Gm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

: i( F( F, w$ T
+ O& z" \4 ~* e3 D. U* ?7 G& o* Rm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

; a+ \* F( C* E
* w: `& U' G/ Y7 R+ P2 O. P}
$ O1 a9 f4 h; I- X* X# g
public:
+ D7 j" j* J7 L
* i' L: r* y. B' o$ c% v, @) j" _3 _
~TetrisFactory(
void)

0 Z1 a4 f# r* `
: h6 S$ L2 D5 x6 v2 D+ P{

4 F0 q' H. }! U. E9 l2 w& N0 ^9 O
}

5 h) }0 o( ~( z! `1 h- a- Y
/ g9 O4 T" d/ a; d" T2 \Tetris* CreateTetris(
char sel)
: |0 ~0 k1 y, x4 P

7 D1 U' \7 }7 }{

3 u  N4 V1 i' @$ I" {                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
# R7 R( \1 V" v8 M! V, A$ g1 Q! f; |! g! b& }$ ]
}

( _4 U0 _# n2 v* d) Z. lprivate:
( x6 t7 W0 _: g7 @
8 U9 w( [6 x& F  K6 p& U# p% u- P! g

- y# m7 W7 y% |8 D/ x" T& B6 P7 W) t
Tetris* CreateOneTetris()
3 x7 C# J' I6 ]1 T6 T! w+ x3 E
' X3 U! |: i( c6 ?# b' r9 J- @0 A
{

: A9 z! f: }! k4 t4 t+ t" J$ \                        static OneTetris tetris;
) |/ X) e( E/ b) ?! ]' |7 m7 {" u- g! r" j$ I' \
tetris.InitPos();

- r9 T: {. t0 [9 R0 d                        return & tetris;
7 Y' y; t4 F* [% y+ ]+ k
: Y5 T; _$ E$ u}

3 I3 J: z) s" Q# u4 W* [8 d" o: V( l5 v& H$ {' k

: @; G2 z5 |0 j, n- V& Y$ N: V9 `5 |- {( o2 ]  r, ^
Tetris* CreateTwoTetris()
9 e% J+ ^" g" r2 Z% }2 |5 C
- R4 K; k  y+ e# ?7 H0 w
{

5 }3 n; m( k+ r: ^' a8 k                        static TwoTetris tetris;- @8 ?1 E* G4 L% B6 q5 y

; @1 R# S2 Y$ y& {$ Dtetris.InitPos();
9 T" P! \; y9 N" Y: X* z4 a: j
                        return & tetris;
) z$ G0 A( ^8 S  Y
! ^0 ?# ]# h) B+ I5 @+ c}

$ @" w7 H8 ?+ b7 W5 Y! f5 S# A& t( H

: n+ z- L5 p/ e9 S8 Y1 u- c. Z8 B
  U" m+ u8 h- }/ {" yTetris* CreateThreeTetris()
* T& B5 ]) h% d. D
( M5 j4 I6 [9 g) S; s5 y
{

/ c& ?7 W7 i) ~' b% K6 g2 o' K                        static ThreeTetris tetris;
& ?! {" @8 m8 E1 S& \' c& T5 x  G1 D" V
tetris.InitPos();
! M" \9 V( e6 l# k, |4 \% h  X5 a

- `5 P; q3 @& `$ B" s- \2 z) O
return & tetris;

5 w* y0 j; M* a, K' \5 X/ B
# _+ V& r: x! k+ ?}

3 y% G& ~% M- {/ ]. T& L9 Y6 Q, W) @4 v4 ~
4 G4 M! d+ L5 {8 F

- y, o/ s& {2 l8 R9 l# O6 u& d5 NTetris* CreateFourTetris()

, Z: ~9 v: ^% f" x; H' s; f4 n7 U# q1 p  l. B7 {2 t
{
4 b4 e' [' C* v# P/ ^0 j
                        static FourTetris tetris;8 y& W5 G6 U2 t4 N4 Y+ Q

6 j3 {: \* E  Ntetris.InitPos();
% G' c3 p4 D5 m3 e# D
                        return & tetris;( W+ B) m; Y" A2 g3 p

& E7 o( N/ V5 i' m" m3 _/ \# R; @}

- {; a. H, M! D/ R- p9 a& Q& u- y+ h3 i. |

/ s/ w' {! {! G8 H' L$ T6 M; w5 e! K( M0 N. K2 o/ V3 h
Tetris* CreateFiveTetris()
) T( M# N; m% P* q, y
# H) E4 q, d6 S. [
{

! X, ^  }# g# f9 _' L3 `0 y                        static FiveTetris tetris;
8 @& L4 e& O8 p# u4 P2 b6 P4 x: ^5 `
tetris.InitPos();
# `: w& W0 `$ Y# g" U
                        return & tetris;
' I! _- \' R( h, ^! g8 h) a5 g5 b' p7 w- {! A5 n( W6 ^) @. w3 f
}

, P7 g, I0 G* ?$ f! F; F' P
& P, ]" A# Y& _( L/ N- R# W: u9 k& Z
Tetris* CreateSixTetris()
( a. |- Y. q) N  ?: s

9 F( q- S6 V: o3 }2 p5 w; i4 K{
8 J9 [" Y* [* _
                        static SixTetris tetris;
/ k! x, w& y, g9 g& X6 y' a  l" f% C+ G1 j* l$ w
tetris.InitPos();
: k* l1 Z+ {! G; q  U
                        return & tetris;/ N; v0 E/ P5 U7 o; t  s+ W$ Q

2 z; S8 S' R# i. @" |* w& |}
. {) W/ L; P5 e' X- E

6 @, d+ w4 q: Q, U
) k8 D  V+ r: @6 r! D% A6 ^' K
, j* b6 T* c7 g+ X- K. r. M  f
/ R2 l8 ^& F- U9 B8 A
Tetris* CreateSevenTetris()
- y2 |' g) [% \% \$ m+ e$ W0 R! _
' M9 ~: L6 ^5 H" d, f" z
{

9 T) }) I: Z6 U" z# m: Q& U7 y                        static SevenTetris tetris;, O6 O$ }7 L" Y

, ^( [) q1 s: e" y% ytetris.InitPos();

2 ?+ f7 g. B( l  T4 N6 j                        return & tetris;& X3 h: Q3 L0 j" n- {6 l
& S! R* _3 M# W% |
}
' [2 R1 Q% N2 P+ h- v

# J1 D9 e  z7 r5 G' \private:" N3 }- `: N8 `

$ X0 f6 p  f- h! o+ b( I( ]            typedef Tetris*(TetrisFactory::*PMA)();
& V3 ], t# _/ l" |6 t3 u: W( r4 h. H  g
std::map<
char,PMA> m_sel2TetrisMap;
9 r5 a) A  S8 x
+ g. @1 e2 D4 l. ]

/ V# g+ x* {: J' T& k};
! m# X* k# p- u, M
% z  g: ]7 ]1 @有兴趣的朋友可以下下来改改玩玩。
% `7 q+ Z  Z' H' K4 |' A" u 4 ~" x  K1 `4 R0 p
That’s all!6 H" o/ B4 H2 `2 g5 I6 \7 O

5 j/ X+ N$ o' ~; q" H& [' PPeter + U3 M& C( `& @$ D8 B9 ~% w' ^

& z( Y& ~( N! v7 P/ C* M[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-20 18:16 , Processed in 0.023705 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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