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

俄罗斯方块

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

1 d- I$ Z: V/ L$ {3 C 16 W* h# H6 [7 _8 m' s
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:7 G1 A0 y$ G7 H) w3 E$ |" c8 c( D

7 L/ B4 o. z. x4 o

4 P$ y' o4 Z, b" {/ _) d( |Factorycode如下:
$ R7 e( Y$ P5 V  Z$ X ( H- k# S" O$ J0 c
/*************************************
: j7 `  L/ [7 v, ^$ k. h* B
' ]/ N+ H$ U7 d6 C1 l3 y% I* author:hgf_starlovecpp@hotmail.com
5 t, {& @; {9 R* @/ C

  V/ Y+ ^4 n4 f+ B- e- L  F* version:1.0
8 v' ~  \- k: U' q: [
* n2 V( {3 p; s0 K
* description: just for fun
7 s' v% ^& ~! O' r: O
  X5 \) T8 d0 ~; W
* todo: hard code exists need to fixed

1 a# F( o, w; _8 c
# ~2 p* ]+ @$ h- H# ^& T/ B- Q' n; ]/ M**************************************/
" [7 \1 P+ p, d# R2 r

' m& L" `( ^: Z' o; Z5 E* H#pragma once9 K; ^9 `# j3 I
#include <map>' c; v3 [* @) i; ^4 |
#include "Tetris.h"( S- b' ~4 X1 i+ @7 [$ C
#include "OneTetris.h"* z: I8 Z6 c. m7 L: ~
#include "TwoTetris.h"( R2 w) i& q/ L+ t. I# c% d
#include "ThreeTetris.h"$ s4 V/ u% l* |4 a
#include "FourTetris.h"
4 |+ U* t& {" Y8 c! M  P#include "FiveTetris.h"
& w. I, p  j, A#include "SixTetris.h"
8 B+ Y# H: \' t. r# _# s1 ^#include "SevenTetris.h"% L! W1 I/ ~) D
& o' p1 ]: f: v9 @
class TetrisFactory8 }+ f5 ~9 N0 ^: n) |! o! b4 L# z
{7 x1 Q  T* I3 Q2 v" ^" `* R
public:$ p. B6 g5 N" Y9 O1 M! _

2 Q% z1 y: P1 ]3 @
4 k/ a4 H! Q* _7 d& K% WTetrisFactory(
void)
/ p  j$ W! A2 Y, M( |! Z$ {
/ J0 B) M; X( v
{

# J' D9 i+ Q) n3 D# M7 P" B' r! Q+ P
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
- |1 a9 h* q- F/ I  @- _- [1 c, y. N
1 _- d. F* @' r" R& D
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
$ N" _, [# L) |4 ~% V' C: M1 v

4 K+ g3 ?, B7 r  d1 C0 nm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
# [% ^8 K! _' P/ h+ x
; K* ^( M  e6 M4 h9 b8 ?! a
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

9 J( l+ {$ [* ?) C) g* r' \
- J" x9 v1 E* _" d, m7 Um_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
! P, f$ J  l3 S7 n- i; G2 D$ o1 w

) ]1 {4 _" s8 R8 e! u9 r& B) F& ^6 tm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
3 \* u; }7 F1 {5 F7 o1 ^2 r4 b" `

4 j3 e$ f0 N2 w8 Pm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

# E) k4 O. c; n# e; G
$ b; G% u- v6 j& @}

/ S0 E' q1 p0 P; `public:% Z- X' R. p/ p/ o

7 [0 G, i" j, C, k
# p! p# i1 `6 l~TetrisFactory(
void)
8 K; k. h% C4 t9 E* X
9 D7 }2 \( o7 N
{

8 Z% j3 i' x5 J9 |
8 S- r4 u  S7 V2 ]$ `9 k}

7 h% h! q! p3 v* \9 V5 U% O
5 M6 r3 T6 K! K. JTetris* CreateTetris(
char sel)

! w# {6 a1 D" ?8 ^# _% T( b) `: Q& h) g/ @9 Q9 h3 W
{
- Q5 t1 o/ d2 m- z  P+ b
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();" j# J* h7 M: I) F8 y0 }& L

  g) ~% p0 Q- a  R. k# l% ?}
) P3 ^$ P1 h1 f# }  x8 @* x$ y3 C7 e7 f
private:
& M7 ]: w* K2 Z8 I; I" h% w- Y( \# [

/ b5 A8 b% H7 ^, c% r
! F* M: @# u1 y9 R4 sTetris* CreateOneTetris()
* f3 ?5 s* A' P6 }
' {9 o: W4 n# I
{

: k5 `* k! `! H) D2 |/ D0 M; }                        static OneTetris tetris;% A9 i3 v. q  `# t$ [! f" ^

4 l! r( i+ T! j* Gtetris.InitPos();
9 F, ~% Q& [" ?& z) t4 i7 Z
                        return & tetris;
* t. c+ i/ g6 V. ]  ?" n# K8 g0 L& k% A# H. Q3 I( w5 B5 I  p
}

' _! ?2 ?: X- l# F: Z% ]
3 Q. {2 g7 R* D# G( ]! y8 C" L

4 Q$ d8 t7 \/ B% Y; m: B$ A- G3 p
Tetris* CreateTwoTetris()
, E' p8 |* _# H: c; g" Q: g. u

4 H, w. X1 L5 r7 _6 z/ X8 W{
- p  Z. \5 H/ a% {7 c# i4 T$ p' {$ g
                        static TwoTetris tetris;
  L; k) [% r3 ~4 L; K5 I
6 [; O4 q6 G& Y$ O. D$ @# R6 xtetris.InitPos();
0 |; c2 ?+ T3 T  Y1 P0 y4 s0 u3 I4 [. B
                        return & tetris;
8 P  _# [# ]/ s8 U8 `
* S& z7 R2 T5 X}
% W( _: K1 ?5 g6 H- f; C; s

+ U! O4 g0 ~) n" A" s9 m

6 o, F1 t" c' {. s9 [5 S" _* p2 f. i" q' y0 k
Tetris* CreateThreeTetris()

9 c3 b/ v. h/ _. r, T/ S- a
! c) }2 j4 p# G: J, t9 j{

% z( e9 u: b; \; j/ q  _1 z                        static ThreeTetris tetris;
) ~5 m' L4 t* r1 G* I0 i- U+ Q& }! u
5 e- g( }( l0 e8 Qtetris.InitPos();

; H& a* T. E& H1 ?* Z% s" h" A+ N
7 T! ^  N1 l3 @, n+ H6 r0 g
+ s" f- ^) k# b
return & tetris;

3 M: ?+ k& E: e( [5 ]# T6 d: p; A& q: J6 e* A( e7 _2 _" S
}
2 t( V: l3 ^2 |+ ]

9 _- [" r" R3 X; k

6 ~( V" H2 C+ g; P* I0 j
4 c) a. X" b$ H0 j! \Tetris* CreateFourTetris()

) f3 h) P8 U2 H5 L/ `' ]8 j3 S1 l/ z( [! N) D
{
: b# i/ b! s' E2 e9 r- r
                        static FourTetris tetris;! h1 f" [( I1 x3 D6 f  |( N

( K5 V) Y+ l$ Xtetris.InitPos();
! u% ?1 l" d+ N5 t3 @: X5 E& Z
                        return & tetris;
5 w9 X0 ~3 l6 k8 v7 h# S, r! v+ n6 Y3 u: p
}

( t  |8 u1 \& D! a8 u: [. W. s0 U+ q2 `7 z! y) T4 e9 C: W
% X+ D, I8 m* C3 L  E

5 a! `0 f& W0 O- m/ O; m$ mTetris* CreateFiveTetris()
9 j5 E- H9 R% d  u8 p  }
. o7 a* U6 [+ u7 [" l7 b" q/ u
{
' W' T; e4 [; R' w4 F4 k
                        static FiveTetris tetris;
$ _# ~. a% K3 M: Y" ]
' U" Q$ D9 z: W6 p6 Mtetris.InitPos();
" d# n7 c5 _. u% B( ~) O# u
                        return & tetris;) D! Z  ]" y; Q& Q, U

' G) l% {1 s( T# j}
3 w3 @0 K; K. T4 ^& v! x( I
# f, E3 R5 \' Y3 z  e; B
/ k, v/ t' j" f' ~) C5 \
Tetris* CreateSixTetris()

" v3 B! `0 y0 ^1 {: d8 ]+ e( m) N
3 q- V8 A6 f# o8 r$ J$ e* _& x{
9 U" i: @1 Q' M* t1 J
                        static SixTetris tetris;
& n' r  ?2 f. `# C- Y4 S. Q
" H2 p" G& e( y3 jtetris.InitPos();
2 Q. W. C/ M) D# P. a# m
                        return & tetris;
0 L7 f; B% X: a" L, u2 V  k3 D5 [2 ^8 `- X6 d
}
1 f5 W9 c' ~# |) C9 g

0 r/ y) K  M( C4 m7 }- \' n1 h* R: K
5 F/ g% n1 C* [# t
$ K; S" q3 i8 ~8 h# {& Z+ z
5 Z  s# @, X/ O5 f
Tetris* CreateSevenTetris()
. h0 X: s7 ]% [5 G& B

+ [0 a+ ?0 A; ?8 E! e$ j; x: _{

- N  Y1 @( ?# Q: x4 V& h2 U4 e8 R* Z                        static SevenTetris tetris;
" ^2 B) y2 D) @$ _' S" y4 ?7 r+ X# p+ m. O. k
tetris.InitPos();

8 p$ L/ M3 w. F2 F                        return & tetris;; D4 c6 t. b# O5 b
  e" \. {0 }: \- D% r
}
6 t; [$ b, d% J/ a4 z

& e5 a, J2 }" D6 K7 [9 H6 ^  E" fprivate:
* e4 X3 B# f' `+ w( p3 ^# Q
$ h. }* ~$ @2 X4 y7 U            typedef Tetris*(TetrisFactory::*PMA)();
" ?& G. f( a$ Q5 C
- ]" `1 W8 h* r' e* y2 W( R' R" `std::map<
char,PMA> m_sel2TetrisMap;
( J  F& z, O( O6 J6 K
, g2 Y4 Q3 b, u$ I9 g3 }7 s8 Y

3 l! T0 v8 t+ c% M};
* Z) V' H4 x! i; y( _
4 ]. ?! j& s! S- m* q& q0 @有兴趣的朋友可以下下来改改玩玩。, W( X4 Q/ A8 K* @3 j

9 _  r# O; M4 E# P& y0 j* `/ J: JThat’s all!
  y4 ?) ~1 n2 R, S# ~3 V
+ }( {, l8 @) T, G) oPeter ! {: [' V1 U/ y2 D, i

9 J0 E& z& e3 R[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-20 10:34 , Processed in 0.020408 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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