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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
, S# @* J& N3 d# f# B! o
1
8 [  X$ Q/ ^9 n' V完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
  |1 ^% T" Y% h
* f7 F: E9 W9 z1 w& k

3 y: g% x4 U+ s# \* XFactorycode如下:
/ F' J9 h: J) V+ c 9 `0 h) P5 W; u9 l3 M
/*************************************
) @" \& c5 \0 P* {, X; t4 h; G) h* k" F2 B6 m1 B2 T
* author:hgf_starlovecpp@hotmail.com
' s9 C% {; _, A* t( c
5 Z( f. G  P" Z! s0 P% Y
* version:1.0

& c( r$ ]# c: n5 z+ t' n( o( }5 H) f  _; C# T0 [6 I
* description: just for fun
: w8 u% b, o* z& v
4 l) V3 z# @& T! s' p
* todo: hard code exists need to fixed
- U" f$ \& c( i/ c+ r3 m: `* T& J
4 e1 X# B" M5 V4 L
**************************************/

# s4 ]& f/ r9 v: _+ C9 c/ ~. h6 E4 B1 j . p4 t( B( ~. |
#pragma once4 [2 v  n1 Z8 r3 U- x; R  D4 U& a  G
#include <map>
: Q3 o0 A3 @- r! j: b' p6 I3 X/ l#include "Tetris.h"; U: V( [- c/ I* x. m" o
#include "OneTetris.h"' ]  C, M( i5 N- s- H8 T9 a* E+ o- k
#include "TwoTetris.h"
: c* _: u: `, |) q#include "ThreeTetris.h"
8 c% U- }- i( A# u: m* c2 S4 I#include "FourTetris.h"' m/ z( w* P6 x
#include "FiveTetris.h"' K( }; e) o: z. n# z3 a( Z$ |' w
#include "SixTetris.h"/ p  O2 c; q& M" w
#include "SevenTetris.h"
( o# v2 _* F% u4 t 2 x4 V" E( e! Q( }
class TetrisFactory
) o5 X  c2 q5 X9 a{
6 K+ {& D; j, ?$ E( rpublic:
4 \6 s2 C6 V' s# l" n ( v+ @$ H! G% l0 ?# f6 A
2 Y' X2 W  \& a3 G, W  x
TetrisFactory(
void)
4 X, h3 z) h. O1 T

8 ?. j3 ~( g8 U2 P9 \" X) u{
0 ?( v# j5 N+ J

# X1 n; j8 J, r7 |m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
2 Z- N7 C! S5 {4 V/ E- a

  S+ d1 |3 s+ Z/ j( m$ L3 x3 Jm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

, q8 D4 }% [9 t. V0 M9 f# f! }; ^  s1 g; m, A6 [- m  X" v, S' w
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
! J7 G: j: ]2 K" n, t

/ n  W. P2 N  g: y* tm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
. y0 P, c2 U" P8 b& X1 k. s! `
) f4 ]1 T# R  T9 L" k  u
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
9 D- C# q: `( v% |
; U* v, K  D6 F3 E$ ~  M) @; n. C
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

/ h) O2 N' r! |6 w- G! l0 z% _5 O
. g- G: _: k* x# L1 n9 E' wm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

$ n+ z+ p9 B0 L. z) O# y: v. F% ]& Y6 _% Z! H& j+ ?
}
7 E3 `) _' K2 i) x6 f
public:! {- F# ~) O9 Y

1 V( @9 `9 E# ]
7 `. R1 Y; M5 U~TetrisFactory(
void)
( q5 v1 y# R0 K" \

8 K. p1 ?& Z" |/ l6 Z! e# P; O0 @% Y% e{
2 g8 N0 N) b1 e! J" }+ ?" g

" ~& C4 a, O3 a- ?; t; ]}

5 u+ N) F2 s* a5 c* k, e
. P# E4 v8 M% b" Z9 S. jTetris* CreateTetris(
char sel)

) y9 o7 i9 t* n) F" _; B/ x% M
/ N  c+ @  C0 s- x7 F; ~; E{

8 {# s/ T$ I) X7 {! e3 k9 ?                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
( b" I: p3 v2 B, U, ~$ b) n9 L" R9 S4 s$ I
}
% v, n, l+ L; K4 D
private:+ ^/ Y! |0 a/ H& r

7 b/ Q7 Q1 @+ ]% z  S" a7 u$ I
4 L* V! L5 R" v1 I* u
) \, b( b  Z* G- T8 b- o  ^+ c# N
Tetris* CreateOneTetris()
# ~. P' Y: O) S* H

; B) I" S7 m: g{

$ y0 B" a# [! C7 X% b, P5 W9 Y. b                        static OneTetris tetris;
) S  O8 }1 v" J9 w; i4 f1 ^; p, f4 e5 s# h* N! R/ }( R% T
tetris.InitPos();
% V. q: z  `9 y0 W
                        return & tetris;! r: S& ?: I# }) b8 v+ S
/ d1 D+ C  w; t
}

/ P3 U( r7 _0 A7 m7 c( @, m
$ O# f# c1 d# Z, o0 [2 Q
; m) T5 Y; s1 ^- m
) X5 s  n) O/ |# o, T7 h9 Y4 M
Tetris* CreateTwoTetris()
) l& {2 }8 j2 S% W9 k" ]4 N/ J

; R/ k+ O5 ]5 Y/ Y5 M7 V{
& T- K1 n- L, ~, |& P8 {+ ~/ e
                        static TwoTetris tetris;4 ?4 f/ I$ N- _/ g& R
; d6 k$ }/ }* k  g8 [6 I" F: `* @
tetris.InitPos();
  N4 y. S9 @: r; N5 _4 a! U" v
                        return & tetris;
9 S% D' w6 W3 q: G; A3 X, k) C
/ B' c' t9 H4 z: H0 o4 @! Y5 A}
8 L: s+ Z4 l. {7 A" q" r+ h5 F

% k$ t; R( h" b2 O7 q9 _4 E5 E
: Q$ P/ `9 i* p& T/ i6 y' a: x* F
" _1 J, B" p0 {. L) O! T( ~, A
Tetris* CreateThreeTetris()
  \6 H  x8 ]4 \$ A  u& I6 R9 ~9 e
- u. p' V9 Q" f) g0 k
{

0 C6 }3 W6 N$ {1 _5 Q& f                        static ThreeTetris tetris;$ D( C& B8 Q9 W+ C, x
$ n) G) L; i3 @( g$ L) P8 P
tetris.InitPos();

% i. L0 {! e# f& w
% q; |' e5 |' t
8 K0 x* d. s4 I# u: k1 W
return & tetris;
* @0 X; n0 @0 E7 h4 @' `
4 M7 d: ]$ p- I) D: F
}

( l: ]& z5 N5 q3 M- a6 [
3 H4 k' ~5 q, P3 H. m2 X$ [

% E5 @/ q" F" m- _
! t# d# u- H+ k9 f3 r. t$ S% rTetris* CreateFourTetris()

0 F) j- Q0 G0 [! i' j/ G1 S  v9 k& Y, \6 m9 q  F7 V8 d- b
{
$ n2 j0 m7 V1 ~; C" P
                        static FourTetris tetris;% y: D3 ~: {' n4 l( n
( A$ E! w; H% X( Q/ P4 R
tetris.InitPos();
9 j8 a, H( T! ?8 Z! O# g+ N5 Y0 w
                        return & tetris;
3 a( i5 ]0 ?2 ~  y% [
) w; a* W% I: B* l1 b}

+ A1 z7 S: g4 U% s, O& b3 k1 z1 U& j2 y/ S) J1 F

0 O, P+ F! F% Y5 S
' r5 M* q7 p* N1 _/ P7 `Tetris* CreateFiveTetris()
4 U" {) ^  X$ @3 U  S% a! K5 A

1 Y1 h9 h' {9 [9 z/ s{

* }4 U) F6 w+ R1 u' Q9 D: Q: ]% B                        static FiveTetris tetris;# q. Q7 ^) q5 d3 O9 i' w

" f1 r! m# o; E) S; itetris.InitPos();

$ y& z" ^& W4 W  j3 C. @                        return & tetris;
, m, y# V! }2 q% n7 a6 a: ^$ W0 \* t5 x9 Q
}
2 a7 t# M& {) J% S

0 r9 V/ p+ e" o6 h7 O3 x
+ A- B5 i: T) b7 `  U$ F9 l& TTetris* CreateSixTetris()
# E! g# h4 M0 w8 ~8 n, G0 k
# }6 V; x9 N- {" t2 p1 w
{
/ k4 u! G* ?- X% _) a, x; ~% s
                        static SixTetris tetris;1 R( V: ?4 R, e9 j6 Z
5 ^; {( ]" W+ Y8 ?0 |  O
tetris.InitPos();
+ l" N7 r, B; p8 j3 M4 N
                        return & tetris;. t& _9 U% H" p& n
" N- a0 w8 c- R0 ^: i; W
}
* {$ n. \% {0 }) ^
+ b" w0 \4 f: M3 t7 _

3 n3 U8 x0 |# z$ X. s9 F

7 Q. i7 q! O, r8 F) |7 \0 {
3 p3 ?" p$ p9 A  |6 mTetris* CreateSevenTetris()

; x; J8 h' c* d0 f" f/ v. O; O/ d) h1 ^2 s
{
# U* {1 i2 o- l' h% n
                        static SevenTetris tetris;
- |5 D& r' {* f6 r# s
# \/ o3 x: E& t) V3 `8 r. b+ ~tetris.InitPos();

* ~% U' [2 N7 o7 }- A1 P7 u- p                        return & tetris;
+ a, P, o# O' B. t; ~6 s' Q' ]& I, B$ y9 J) D
}

! x; `% Q" b6 e1 b' |
' |2 @* q( A$ B. b# V4 e+ n: iprivate:& x5 w* C( s7 b: T

7 L$ n% w( c9 S  N' R            typedef Tetris*(TetrisFactory::*PMA)();4 w6 p: b5 T* w
0 `, o7 B+ i( ?6 F
std::map<
char,PMA> m_sel2TetrisMap;
$ P( ]" u. i7 P' h# P8 g- N

1 r5 q" K: M$ ~5 c

! b5 \, _  P/ w};
& Y- Z0 W8 r# Q* [& }7 h  m $ b5 M& m  l" m7 ]7 {- i4 T' o
有兴趣的朋友可以下下来改改玩玩。
: b: p* V+ ?0 U6 g: m4 F0 \
1 Y4 P2 E- |" L1 I! D/ F1 h, \That’s all!5 [5 x0 J( V$ |+ O* j% W

4 ~0 S+ {& R9 D* r5 G# tPeter
& b9 B; P; M( G+ J, @0 w  d% ?+ `0 O6 r; l0 R# g
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-6-8 07:05 , Processed in 0.952798 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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