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

俄罗斯方块

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

' t( y) [. R6 T 1
$ d& l  |% j+ d% r6 V完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:" g% [' b2 V3 I+ R2 C0 a
+ s8 i; Q' ]( L0 ^( z4 D; G

5 p& R$ w/ C: JFactorycode如下:
6 Q9 g1 h" `1 r9 c
7 ?% R/ z1 S  Q/*************************************
0 G0 J' D# o! Z& `( U! c( c+ s
* author:hgf_starlovecpp@hotmail.com
1 v* B7 L2 W& d- J- s

0 X9 J. g: t/ G' i+ {, @4 Z* version:1.0
9 H5 }' ]1 N( f! X* j
# b2 D0 Y3 x) {, K. `
* description: just for fun

8 E& d  a! f6 J2 m, w
) F, E' o- L: X1 a0 f* todo: hard code exists need to fixed

; ?4 a: u8 K- T7 @' F) j" \/ ^
  U1 W2 n6 S0 `2 G! v; t3 b: e) ~**************************************/
4 q' z; c$ `4 c" Z. v

% E2 e. f5 c6 [4 @0 V#pragma once3 X1 b" P! U% B* T  H2 f/ D7 O
#include <map>
8 A5 M6 ?0 o( _1 t#include "Tetris.h"# N0 k3 L" d) I/ _7 J2 [" U* M1 }
#include "OneTetris.h"* v3 {% O5 @% a. [. X
#include "TwoTetris.h"
1 u% W+ R2 A( p3 E% G' c#include "ThreeTetris.h"
, O2 m; G, Z. s! L; X/ j, l#include "FourTetris.h"
& [4 U& B1 V9 b& z#include "FiveTetris.h"
7 a9 }0 M0 a( N4 k; U#include "SixTetris.h"
2 }, E7 V3 N3 I; J& n6 h* x1 t#include "SevenTetris.h"
! Z) c. n! G/ i* b' C) c. ` ; Z) z. `7 K* p* l& E" G6 f
class TetrisFactory1 o& {5 `) h5 Q' s! }: U9 [
{! D# G7 l9 l- W" v; s
public:
, ]. @3 Y; c2 ]( E. d: j7 a + z! m  q; _& r. s' `, I
7 ]5 P7 N3 m0 p/ o! b3 ]9 w6 p
TetrisFactory(
void)
8 k7 H* L, h: O3 ^

4 k- q3 v& h7 a: Z+ _/ k0 x) k3 l{
! T( U" ~$ K/ n6 @5 @( o. M" m( v, N
" c9 Q& m/ c; X9 q* i
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
4 y- Q1 _$ x( W; A" q
4 I  C( ^3 s( @9 C
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

" N2 ^) i: Y6 H( x4 Y0 W( Q% e7 W3 A  |, y- r) f! @4 M7 J! f
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
; a9 e3 Z+ ?, m$ p/ }; _3 x5 A- H

. p/ f1 R4 R# c$ j' `. O' hm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
- }9 `0 W3 i$ [5 ~$ N- ^- h! m

# e: K, c! g0 f: E7 \+ c' Wm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

, Y+ x7 b* S2 S( t; P2 }0 |+ p: l# ^0 |: @
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

" ?8 ], @' R* X7 H( B- A5 _9 k+ l5 G
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
5 C- A8 [* J4 d
- B8 S5 F  g* d+ x9 O+ W
}
% p- Z- K- v$ U  V, Z' y
public:
  g6 }  B. V+ A9 F% l/ L
8 r  l) ~5 g9 \+ v, }* l' G* f3 l* Z6 l! a
~TetrisFactory(
void)
; F- l( @0 P. R4 Z- Z. y- P
1 B8 ]0 ?. q1 w$ [9 C; O$ e% C/ j
{
, A7 z# u  |8 F# b

4 Q* _0 i+ t8 d}
- U; ~& v8 h4 C9 B6 s- C6 v

/ g' I; I+ M1 b2 l( \6 RTetris* CreateTetris(
char sel)
  P* G2 e9 p7 h. N7 T
3 _$ q* n6 m* c7 O5 f
{
1 t: V5 R" Q. W
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
# u+ u3 K9 A# R( K, _/ x% t. F$ Y; O# m& p, D
}

5 }4 X  U, Q* |7 dprivate:5 d; H& X; b! d1 T7 M. ?& ^2 k" p* w

6 w9 L' f- i$ T& w7 R7 K' S

3 k* U! b9 z( _% J( s4 M
$ r6 _4 X8 U' g! N7 M' gTetris* CreateOneTetris()

( y( V- L/ I7 F% [/ A* Z0 \& t# u- c- P- O( l3 O0 _7 x7 z
{
; g  h# B5 ^* ]% {# O2 o- F
                        static OneTetris tetris;+ I7 ?0 D) V; ~5 t% n

9 Y/ B5 x) R/ x9 E" p8 |* z6 ]' Rtetris.InitPos();
4 @: Y" Y5 r  }7 f0 }& s
                        return & tetris;8 l  H8 f/ f7 S+ s
( z5 B+ S8 X( L* R! B
}

. L6 W, v5 n& U1 n9 D* J8 ]. T
: G% V# O4 g2 R

& B/ L: G* }0 ~  Q8 ~3 I9 }# T+ {  J1 g* V# Z8 H; j
Tetris* CreateTwoTetris()
9 c1 F+ I8 Y; G2 I' p/ e0 M4 Z

! @% D& E, p/ p( G5 l9 N{

7 p* E8 C6 [! w- \$ I                        static TwoTetris tetris;
  e0 @! w1 J3 O; [6 j) s: x* M7 ^' R
tetris.InitPos();
, n! J+ k4 i( _: F
                        return & tetris;
  |2 J8 k* g9 s, T: W3 t+ q% L6 ]
}

+ I, `0 F" r: s# J" ?
3 y4 Z/ i% I) N1 Y9 Y. S1 L

+ a3 U5 Z4 v) c0 `
' _# Y: s7 ~1 D+ L  qTetris* CreateThreeTetris()
7 e' P( [; X4 X( G3 O% ^0 c
' j; T3 M6 l3 @. {9 ~
{

" {+ c$ f+ Z. i. Y4 \5 b                        static ThreeTetris tetris;: }- s( L/ P, b7 I5 C
4 t8 u  u3 r! z/ u3 s
tetris.InitPos();
/ `6 Q  J4 o' m$ I7 B- E
# p0 G) `$ w: }

# Q4 }$ e5 Z* G' F. k- l
return & tetris;
, k9 c8 ?% _/ L) O7 R6 Z
. A; c- ~/ E0 n0 f6 U
}

, Z( u& y/ ~  A2 y+ K
3 d' t$ ?) V* B* @1 w

4 ?4 g2 c( K: D. ?* Z) A! F  ], T: Z$ p
Tetris* CreateFourTetris()
2 z  p( Y5 c( o4 a. R# B
, x; |& H4 j2 V& @- r7 T
{

  n9 J! K4 H; L& k% I9 C: Y                        static FourTetris tetris;
7 f0 b, f( G3 q( L; Y( `
& ~6 ?* O. O- Q3 D* H9 q$ atetris.InitPos();
& T4 x+ C# S1 j# q# T
                        return & tetris;1 y3 u2 f% Q; r3 t# W- V

$ w8 B7 a: t/ L/ H- N2 \8 Z4 V2 J}
3 v" z3 O! C- V4 o" n8 S
; G  W# t+ y: R* y8 W/ i* u0 m
7 X; n0 ^* i( N  b, b2 l1 G2 Y

7 `6 L. S1 w  W; g8 |0 y% c; u8 P( eTetris* CreateFiveTetris()

# ?; h4 i! a4 |7 u8 e! S2 g9 O3 W7 l8 ~
{

& G9 p8 t8 W- f6 L; t7 y                        static FiveTetris tetris;2 J* q0 ~' ^- W# Z6 Q

+ K$ f$ s( O6 R9 Atetris.InitPos();

% @" y: u2 h: U+ ]/ k                        return & tetris;2 e5 A0 ]2 f: z  g

: x& {$ F; ~8 Q6 w}

2 k( ?) S# k7 D) b
  n& G% K3 M. K$ a7 m& U, f7 w6 d
Tetris* CreateSixTetris()

  z, X' N; W7 c. g. `) T4 @
/ \, Q. Y: S- r$ h" t{
- j2 c! `2 H! [/ H" p. ~. x7 t& `2 d
                        static SixTetris tetris;  B6 b) ?% n$ @  b! J/ d  U

( L# v" j) `( }$ a$ q, ]. _% t9 Itetris.InitPos();
, I/ r  @4 _# F5 n& [
                        return & tetris;. U% k( S9 {. L! ?+ }
7 c, P/ K8 I- U5 P' j% @1 \
}
/ y5 ]' ~/ k8 ?' {" U6 c, O

% O4 V$ R" L# B1 h+ u# l! ^; |) [/ n
  B2 ?9 D4 \. r5 m/ W" ~

: p% _2 p3 I5 j1 n9 j% j" f0 A+ R+ y6 g- m
Tetris* CreateSevenTetris()

0 Z2 ?3 A2 t- b" _$ O  ~$ T
6 @# ]8 h8 i$ i2 I5 S6 |7 U{
) p+ B  H: S& b- W8 O( w0 y  W
                        static SevenTetris tetris;
& U* {. b7 w6 Q) p
( j2 K9 y; d: _8 Jtetris.InitPos();

0 f+ }4 ^* x6 I1 W* a                        return & tetris;
, q3 E% H' J. f; H- v8 @6 E" A# N, A
}
5 i1 [$ q1 Y% ?) n- ]

! z$ N' n$ _. \private:
/ A: O+ ?8 D/ g  x6 _( @/ I3 y4 F
- t3 v- A0 _2 a            typedef Tetris*(TetrisFactory::*PMA)();% @) [$ W+ V# J5 O$ ^+ G

: y- O! R6 }+ M, D0 {( Estd::map<
char,PMA> m_sel2TetrisMap;
! N, s% l' t# s; V7 W

# Z& Y, c3 P" w
! b. r! C" L) ^" q9 ~
};# y: g0 p0 O* g2 _6 _; _# o: m

& y0 D( m% S% s& O7 k$ K5 I有兴趣的朋友可以下下来改改玩玩。/ t* _1 E1 G0 W* q4 f

& o+ I# t3 i0 ?! ~" d& H. {That’s all!* K, E; H. f8 U
4 ]* H$ s# D2 y$ L; F
Peter - L3 P6 O) ^* R4 a/ J. i
% q" Z* ~5 q5 f1 S; b! e# W, C2 F
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-2-1 04:10 , Processed in 0.059752 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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