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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
$ k6 ^9 Y! i! a+ `
15 X6 y: B' {9 t9 U
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:; O7 ~$ Q% Q, ^4 R* F3 [9 Y- |6 n

( Z' b; R1 M/ H, o6 o7 A+ I
: y! r  r, R- u
Factorycode如下:
& q) ?) C  Q; T" a' h
2 d0 i& ^# n3 `1 _5 `3 B/*************************************; _. f+ \# A7 j9 w  C

5 s- y. d- p, D. R  J7 e  z2 Z* author:hgf_starlovecpp@hotmail.com
* B8 Z$ m2 [  `
- [  ^3 H! g! G/ z# @
* version:1.0
( q8 r2 w/ Q/ a) c( s! K
8 T/ f8 g; B: U6 Y! B) Y( h3 @& M" E0 W
* description: just for fun

2 f& X- D1 ]3 i- t. r. @; |; q% y  ]% i7 ?6 D% P
* todo: hard code exists need to fixed

4 t* {( K* q8 d4 A/ [( s
5 `- K+ P. l2 `" N* K9 \! E$ e/ K# d**************************************/

4 R! a- w3 [: S1 j5 |0 y" j + G2 h; `9 v; @4 Q2 G0 t- m5 B
#pragma once
/ ?( t1 i+ M) N$ I) G' r7 @#include <map>6 C. E4 f% }3 x' t  {- F
#include "Tetris.h"
3 h6 i( g, B, ?1 q4 J2 n#include "OneTetris.h"
# O* v. X+ L3 l! z#include "TwoTetris.h"
) c3 s, G5 B( c0 L$ x5 b* B#include "ThreeTetris.h"
& _. z" g7 d& ~. v#include "FourTetris.h"/ L4 \% r4 U% z9 U) A6 c! W; S
#include "FiveTetris.h"0 w1 z3 B5 ?# B+ @
#include "SixTetris.h"! H. E- A- a* C+ p6 ?3 P# a
#include "SevenTetris.h"
5 N9 j4 A2 b+ y& p, K0 ]
+ @& C* L( g1 Y- M" E7 Zclass TetrisFactory
3 [# b) U8 m3 f) S' u. b" u{+ _  M5 w* L: P9 d
public:2 j) m; P& I2 Q4 l" i2 _" n

; N% e% e+ s$ Z9 X  r* d# {! [- w2 d0 v& }1 `! _) y" j' a* M0 m% e. G
TetrisFactory(
void)
0 ~, M$ n6 p! T. S6 l/ C* g" F0 q9 u

/ l0 B& I. N+ d: k9 _( P{

) m1 Z! Z6 Q' M0 b7 {6 Q+ {% ]8 n' a' O. B! U( a' e1 w( m+ ^
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
" q& T; W, i1 L

; r6 F1 M* n" Sm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

( x" S( V* B" k4 p* I) D; y* S# T5 B3 X
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

2 i% H6 K/ E0 C+ X- v; Y  Q( U( c/ o2 `
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
! E: z. r8 `( J* l& D: `9 X

1 b; w0 ~! r8 h9 F0 g% ?* fm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
9 A1 M2 t! Y% ^8 F3 ^

1 Q! y& Z9 ^! M; |5 _2 Im_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

: `, G9 H3 z1 b  {, u
" U0 r6 x+ \& E* T1 B7 zm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

6 |- n8 A( K7 G& ^/ o
3 l; K$ S8 f# U- E% D3 o}
. `  u* @1 b5 }% q: L0 j
public:
" U* z: T- p+ z4 u  q
& V( a! N. x) Q* L" V! G8 i( O  }7 H6 ~5 s/ o9 q% X" W8 u' z
~TetrisFactory(
void)

2 G. g# ^$ t$ `4 q# \3 a: r
7 e, c( W7 D1 T* W0 }. i{

; P5 g/ N2 ?& A
  H1 C7 T1 N, T}

: W0 ~( R& q3 N$ n% k
' i8 e2 \! _, s/ }& D7 T7 x6 rTetris* CreateTetris(
char sel)
) b8 E6 x% P1 [$ I7 f4 p2 f: M
0 s" i0 u, F+ ]0 l
{

' J# ]6 _& T# A4 a3 ~! p                        return (this->*(m_sel2TetrisMap.find(sel)->second))();7 r$ {$ a- C& h
0 n2 w9 c1 o) t; i
}
: E- d' ^1 u; D5 c  Y
private:
8 x) K& f( V1 v
- y& r/ {, t' p8 ?
% ~/ T& ]8 P6 u6 y
: A* c8 ]0 d8 M4 o
Tetris* CreateOneTetris()

1 F: j& q7 c2 T5 X) e$ w3 x& x3 g& x' K2 T) \: C
{

$ V* `3 `3 _3 |1 G* {; x                        static OneTetris tetris;
) q9 ]$ ^$ H! F
9 {0 P( m- T6 j& \  utetris.InitPos();

) O' }8 v2 u1 e% I% V6 q  n* ?( T                        return & tetris;' J" }4 Q3 c# s; }; u: Y6 a$ y
4 |: S: V/ U( h+ A
}

1 I! h; K4 I- B  V! P7 G3 ]# S1 k5 F8 V5 [& h
0 L; w8 M% h! u8 @# r

$ @6 @9 y' k& A! bTetris* CreateTwoTetris()
# q" T2 z7 g# o# v6 Z0 W% O

/ g' }7 f( i% b' o9 F  ]  J{

# C2 I+ }+ L9 I                        static TwoTetris tetris;3 V7 m3 _' O2 a5 X. Y& e( C

# m0 R4 Z) K+ E& {- g( j: Vtetris.InitPos();

9 t3 z" Y3 G4 ~$ `8 b                        return & tetris;& @. i( V  W4 n, r

! b. m5 [" X8 d( k1 B1 Q" g* U9 U}
4 O6 c4 B. e" X+ E' U" o# `$ K

/ s9 Z8 c( Q7 \6 {: y% j( A0 y

; \* P' d- t4 e2 Z% D6 r) m4 C4 j" p: z2 ]# ?$ z' w
Tetris* CreateThreeTetris()
' r4 n8 S; U6 Y. i8 `1 r: O

( L) q& {. }# Y/ {1 a{

) D* l) Y% u9 ]8 {  [  Y                        static ThreeTetris tetris;
% p- b3 g& l# [  D! [( y0 W' l, t( C
% U1 [  b$ ?* ntetris.InitPos();

; s8 @& ]. y. {4 `$ i3 r; K. R
, K' d# _6 t7 i# D- s/ n
, Z1 ^3 A7 T( Z: O4 W9 \2 x
return & tetris;
+ ]  R( R0 K7 e

/ S! l3 q# d$ ?0 b}

" a9 f7 Q0 k1 T3 h, X
+ C* k" O' B  v5 m& k2 l

! B1 G3 s4 Q; E/ u2 [! t4 U: k. I
Tetris* CreateFourTetris()
, x5 E4 }% R, q7 a6 {1 {) E9 u1 ]
2 g- O8 S. H9 o  z$ T# M. p
{
0 C" @4 O  t( M# @
                        static FourTetris tetris;0 g2 Y8 M" c! r; q

7 z$ L% p/ t5 P: B, xtetris.InitPos();
/ Q) `# l* i  g+ r8 @: _# g
                        return & tetris;
% w+ A' }- u5 _; w0 S3 |
8 K3 E" {  X1 R' e6 K6 b}
) n* D3 d8 n& }
; \7 M6 m$ v# f

- N8 O0 _' s9 P( m/ s8 z( B* b/ h8 k
Tetris* CreateFiveTetris()

: N/ `' [) o9 q/ u7 _% z/ n) K& s1 p
{

( r2 X8 I7 K$ a" @1 U                        static FiveTetris tetris;/ Z  u+ M# T6 b1 Y* _4 A* i& Z

( t2 ?8 M# R( t0 @; x. C4 btetris.InitPos();

, j# R# K4 a& ]3 }                        return & tetris;0 [' _  f  a- ~
- @+ J+ O# I) `4 M1 j
}
1 O, g9 x3 G6 i9 D* q+ z6 m
) c  ~9 Q: t! s+ t' W
: p; p+ I8 X) _6 [
Tetris* CreateSixTetris()
3 E5 J$ c/ f: ~+ a
  Z- v% P: ~( A4 F) \- y5 S
{
, s- c. c. K4 ^3 \6 O
                        static SixTetris tetris;' t* N6 }5 c4 J% ^

- g2 [' b  f( B" mtetris.InitPos();

+ o! u$ l- s9 c* E) I9 H5 e6 K# q                        return & tetris;
# @( h' R1 r+ ~; Y1 v) A: m& z* y- ?- T4 @! q4 Z0 l
}
- M- ?7 v+ c, Z$ g* B3 L/ s
1 L2 V: r6 J3 C% P  q
; ]0 Z7 w9 f) @# V) Z" R+ v

" }+ J6 v" K9 o5 k
  s- h- [. s& W: o/ sTetris* CreateSevenTetris()

4 E9 H; g" E' T4 J7 M$ C' L7 L) L+ g1 C5 |
{
, o6 a  }% A  w% ]+ n6 j. T- E
                        static SevenTetris tetris;
/ N+ R% c+ K% y3 y  I5 t0 R5 f; e$ p; V* p: x8 |2 D4 H
tetris.InitPos();
: L. g+ L2 c0 a& o
                        return & tetris;
  U( t) X* {9 |' {" g
- m/ T6 v% I4 C+ Y}
" b+ X& f: r# @: F

3 {- _& G# k: b5 @) x8 s  Jprivate:
  d, k+ ]& n, H6 U' t* W + o' b$ i0 B  f/ j2 j! v, L+ e
            typedef Tetris*(TetrisFactory::*PMA)();$ e! b' J. d/ s  }* h
% T  B6 r8 X+ G
std::map<
char,PMA> m_sel2TetrisMap;
3 w# Q  I2 S4 i5 M+ e

& c" q, r6 l' Z/ Y3 L  s

/ W4 r2 l5 a- y! m# i$ x};
% T: B6 L5 L, ]! ~ " _+ `9 `; U7 M+ A7 N
有兴趣的朋友可以下下来改改玩玩。* J5 D/ v' N& n
0 F0 o) X+ r2 x- K4 {9 p) x& t# h' e
That’s all!
! p7 z7 p# ]" z5 C" S + k  Q! a+ V8 P) D
Peter 8 C+ o4 {5 V5 e7 Z% S
0 `- ?) [% A2 A" ]9 o" F+ l* j
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-9-22 05:07 , Processed in 0.051662 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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