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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
& H' }/ R8 X. M# r* f
1) M8 ?$ a- A# _* f) W
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:4 N: j; S2 Z) F3 Q9 W3 r  O5 g! k

& [. l! m* y6 c; g& D- C

1 n/ M: `/ k( Y" ^+ Y, s& zFactorycode如下:$ L9 P" `. D" z4 l/ ]  S

& f' b; M* C. `" h( x* _/*************************************1 r7 {& [; h  z, z0 m" V
, _, [: s; x: P6 Q- R
* author:hgf_starlovecpp@hotmail.com

0 c$ H( U# y$ L+ Y: S5 F! e7 E& [% y5 Z
* version:1.0
! X: v9 s  c/ O3 H7 Y

  w, v! `9 j; I* description: just for fun

7 m) w1 |: W( g) v0 Q, t5 w0 w& S( }  j& s: ?: w6 \* `' ?
* todo: hard code exists need to fixed

+ R" j0 K& [# d3 C* ^; o! ~
5 t/ J# }$ [+ A6 o8 b8 k0 |* `- x**************************************/

! `* Y8 \6 k. v( ^. `/ ~, @0 A 9 S! x/ k. p* `; B" K( t
#pragma once
9 |0 V* K7 s) A9 J#include <map>
7 l5 X" t* C, O& c/ Y#include "Tetris.h"8 e4 I2 ?& {9 K! d  E0 {3 d
#include "OneTetris.h"; o5 g4 O+ |+ j, q- B3 C
#include "TwoTetris.h"
. x$ \9 g5 f. b2 @3 A#include "ThreeTetris.h"
- ~0 o4 B9 I6 Z. M#include "FourTetris.h", w" w( @7 L' e/ R( g
#include "FiveTetris.h"/ m4 S2 Y0 l4 e! y7 l
#include "SixTetris.h"
( ^- b) w# i% ~/ Y#include "SevenTetris.h"
6 q: F# W3 R! M
! q" X+ c% k+ [, O. g) gclass TetrisFactory
* S, o& Q, b( b) y9 Y! }{
6 }6 L2 ]# f0 l, R4 r0 R. Kpublic:
# x' x/ s  D7 ]2 Q
2 E9 i5 E1 [7 g' l. c, b
% I% \: O3 X, ITetrisFactory(
void)

" q2 Z9 V# N( Y9 U6 T
* `8 u, y9 i: Z! L. P{
+ A5 ?% c3 K$ u
0 n6 I& \9 ?) u, G
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
( b* a* l, N' L# A) a
. G4 d0 O6 D2 l: V
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

' t; T3 \; L4 r; v  p; c( n5 z. ]  _1 _$ f
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
# r, W* C4 X# C' b0 w

3 ~2 O$ J! K5 p5 n$ h; pm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
, h" ?5 x; j; ^$ f- L

# B+ a; f$ N8 Lm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

' a+ M: T2 b2 H( t
' \7 E; s, n2 [/ t& U( qm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
  F' X8 V  F& ?# W$ y. o

" Z1 u8 `! |% ^1 \+ B3 [$ om_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

( F* S0 B2 U- r$ j" p9 D8 n2 o5 B% L% C" E1 Q4 a
}
# j5 b9 s4 e/ i5 d1 u
public:  l/ g0 o" D: W1 A8 t

$ W1 t; b9 K9 [* Z) e9 N/ C; N5 p4 x4 ?8 H) t. C8 h  q/ a
~TetrisFactory(
void)

8 U8 H" i; {; D, c! d$ V" U# u
! i- l1 u6 H8 y% @* z' f{

- `3 J& j9 p& ~0 [
1 C- M1 e0 f  @1 s" E}
! g$ }+ B% u3 l
( m( U# P% U  g8 C" |
Tetris* CreateTetris(
char sel)

3 N, X; J- O6 x6 o' o2 w0 O# r1 b9 g4 g( t. D/ I* W0 e+ b# [6 {
{
8 R8 D+ f" R7 `* Q9 h
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
2 E, i4 D' M. L  Y# v0 T# g: _! A( v7 _/ Z
}

# a& t; S* d2 H# ~8 I3 G0 E& [' Aprivate:5 a6 P8 `7 ?5 A/ h: C' `( ?' E

7 S- u/ Z5 k$ o( h9 V
2 O/ `0 j5 I7 F6 ?( j: S# A. j

- w' R9 k$ |9 wTetris* CreateOneTetris()
4 S6 f) }2 h+ z7 S) j8 Z. ]7 z

: D5 q8 {9 ?! A% X{
0 e" b; I5 b* O' f% @5 H% I
                        static OneTetris tetris;
% M9 m  C" Y' Q. w+ e6 U7 m
, D3 o( O9 D. R: a0 Ntetris.InitPos();

; {4 i. r- H: V4 ~                        return & tetris;
3 W* w4 F3 c' }* Q& }8 ?
* w" c' B* t/ [% U}

; ~# S  n* b4 \* X' Z( ?, k8 C
6 f0 F1 K9 K- G' x' H
' L6 [# u" s' j- T
- b8 \9 Q7 {6 A
Tetris* CreateTwoTetris()
, l! H% Q- j! K3 K# d  _2 N

! d" F" w7 P7 `4 ]4 }& a7 J2 z{

7 {3 N0 J1 I, k* I+ J                        static TwoTetris tetris;
# l8 I9 U2 ^, _, K( m& K+ I8 C% t/ k
tetris.InitPos();

) P/ A- G+ W7 m8 ^                        return & tetris;6 H- R( @3 M0 ^5 ?

* P2 Z. z6 s- s, T1 k}

1 W, n, e8 ~& Q3 x( x2 _0 \! u" _- L' f& x# m! ~
+ G( b2 a. n7 F2 F$ c( p2 I

. s5 e2 Y+ R) \$ q" S  ~% UTetris* CreateThreeTetris()

7 s1 j" U3 w2 x+ K* p
" x4 u7 l! M0 ?7 t( t+ v; m- _{
% v  @2 }& M9 o$ L4 ^5 f
                        static ThreeTetris tetris;
3 Y1 p1 s0 s& A1 {" D  h! w/ G: P
, y: h3 r1 _& o: X8 U' m3 ltetris.InitPos();
0 m  I( h1 I0 `: s6 G& n5 j
7 s$ |+ p% e1 v9 c
5 w0 v! _$ q- N% S- X0 p
return & tetris;
) k: o0 B, l7 Z" B

$ g3 d$ V& G& \& T+ t) |}
: A& U1 y5 g" a
7 q- i! y* Y/ v0 O) ]7 b! V; b

% s( Z& w6 C9 E4 I! o+ l/ k4 Q, a: s) M) J
Tetris* CreateFourTetris()

' V/ v, l' y( E8 L. q
% y4 F8 l; g4 Q! z# Y4 S( `/ f{
$ f7 Z# X$ P: G& N& [2 V7 p
                        static FourTetris tetris;
+ q. S  {7 f' g, Y5 W( h# j) {1 R8 K5 o' t/ |  n* x$ @$ I- w  {
tetris.InitPos();
  I% X  x% W2 j: R' m, R
                        return & tetris;
& |5 x/ c& L' T  G& s' w. O( C3 {, Z$ i1 @6 k, ?0 ]
}
5 s7 \* o: I8 C4 k: V: V7 g7 k6 H9 Q

3 `( |& m& S5 d

) J# ?3 ]) c9 N; E5 z
7 p% M' A7 h( O2 ZTetris* CreateFiveTetris()
" c8 o- M1 R) ~" l  B+ Y

4 @& ~9 w4 C$ t1 [{

4 R% q/ S3 w' L, K9 m                        static FiveTetris tetris;
( O& `/ ]! p9 k+ C! n$ T& T; y6 p: v( X$ ?& N
tetris.InitPos();

: h/ }. N6 b  l4 d3 F; s! ]- \                        return & tetris;! R: T$ X0 `8 x2 |; m3 c
, I3 ?# r* E5 u" k
}

+ m6 |/ x# x% x 3 ?9 I7 f8 S# j7 k% k6 k5 o
4 F/ M* M7 ^6 G" `1 z
Tetris* CreateSixTetris()
$ b/ w' G* B* o

. w# M+ E+ u' f) O( h{

2 d- D! d1 \) W" B                        static SixTetris tetris;
; \, A1 n7 S8 B$ c. a+ h: _9 O' _- U# p/ `
tetris.InitPos();
. j8 Y6 @7 O! h  Z" X8 ~, a
                        return & tetris;
' b5 o: c4 d7 _5 p  s
" l4 G3 m8 |# E: @2 z( x5 T7 _& V}
4 g! I2 j* _5 U0 L7 i1 \3 x

, t3 f7 f" T0 M7 b5 s$ O
( T( H3 Z$ T2 x( D1 l/ [- a

1 L, u2 f# E2 B+ `% q
7 I5 f( a! p) \. Z3 X* ?Tetris* CreateSevenTetris()
3 v; [& P8 r- v6 f
; [; u' i: o% e9 }: c* n
{

4 P6 I+ s1 s; a" s: U                        static SevenTetris tetris;- g6 d5 i! `5 f+ h5 U' h1 J* _, R' X

! c7 v1 M. _5 A3 h" Ltetris.InitPos();
( V6 B; ^' Z: `
                        return & tetris;
2 `( n  d, i0 n4 o
. y/ H! C; u  k6 Y' `/ F& J1 m}

, _+ `; l" b% i ! [+ S/ s% O" ]2 e( x' c" N  C' F
private:' q' G( c" M6 C

3 u8 d+ K+ x3 S# n5 t' v# w            typedef Tetris*(TetrisFactory::*PMA)();
4 l" b5 C. r9 t: p% d. S% N# H+ Q; _. }6 `: K7 p
std::map<
char,PMA> m_sel2TetrisMap;

( Y& X. a& U" i  c( X. Z0 L- K8 V; ^* c
1 M2 }3 A: m% b2 w
};
5 v9 Q4 ]3 H3 f  Z) g) h- }  x
$ N/ n; y6 M  Q0 S, {有兴趣的朋友可以下下来改改玩玩。& L0 s9 `+ J( N& m1 E
7 A  t0 y3 _$ N3 G4 p0 D3 B
That’s all!3 z0 Y' v1 U  Z/ ^; @. x4 E3 l
/ N3 S4 P6 R7 V9 P( v- V
Peter
! T# K  [2 W8 p( _* s' W- P' a
: M7 s, k$ Y) [( W! E[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-4-4 14:33 , Processed in 0.407828 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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