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

俄罗斯方块

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

6 z- Y2 t9 A1 i! k9 w6 h3 d 1! y+ H0 X8 X" k3 d
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
3 S  n, [: e& C" x* r9 E1 m) a
2 g" t% {, F  [: S6 H4 M& D8 q
+ _: {6 P5 F# L  b3 x8 Q
Factorycode如下:7 O/ V! ]6 e. C2 Y# q

5 t# b0 K, Y% A" a/ [/*************************************7 z0 }/ q/ ~& A

6 a+ N$ E- ~6 `1 c, c  ?: X3 f* }* author:hgf_starlovecpp@hotmail.com

2 ]6 w+ N4 i2 j! B# E" G- c+ i' d5 q; F3 j
* version:1.0
  b* g' ]# T4 |4 @" G

0 S# C  W% p! v- D, d! l* description: just for fun
! a7 [9 Q0 U: |; ~9 f$ J
, B; c2 R' B5 w1 e, f& k! o
* todo: hard code exists need to fixed
! A9 C: W& [; p4 A2 L

2 N$ O. L- ~* M**************************************/
: z1 p! w" M( i* i6 q! F

' D2 r. a5 l5 P9 a+ V& p#pragma once' W& [$ a0 m; _& W0 z' @2 Y
#include <map>  D* r" w  `; i7 @6 e2 g7 i7 ]9 v4 h
#include "Tetris.h"+ q  p7 {% M- O& @. ~
#include "OneTetris.h"' O# i; e3 P  A* x- U7 U
#include "TwoTetris.h"" ^, i0 K8 e2 L- ~$ |3 v
#include "ThreeTetris.h"
% y* K4 t- X9 G, Q7 V#include "FourTetris.h"8 S: t) Z; {* w( f- a
#include "FiveTetris.h"  {7 D- ^. W( |0 {1 [6 h
#include "SixTetris.h". I& h' X) `: I8 b& C; ?( L; V/ x
#include "SevenTetris.h"
+ t* _1 @  D6 a+ j( _ ; E3 n: z6 Y3 R+ l8 X5 k( b' P
class TetrisFactory6 Q: V* L' o4 X* a( Y
{
& T& U1 `0 g/ _7 G  F$ wpublic:
, U$ |9 N: p$ ~. G + P; f) G& O# R) ]' W' \
! f( S6 p2 ^, n* W: z
TetrisFactory(
void)

7 q) Y  j2 j% h3 b
, Z" N5 G2 \4 @4 L{

, R7 m" Y1 o2 C3 {8 h- g5 A  u; h. p( s$ ]) ^8 {4 o
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
% Y3 P# ?+ \1 Y  `

3 ~2 h5 s$ U5 A" b! t# @m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

$ }6 ?0 \- A3 j' p+ t. [' g& q7 X8 R4 j6 e* m. h
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

$ i- e# A5 W5 h/ _9 ~0 j0 M) M
5 G0 u! W/ [3 Nm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

" R& ]) H1 R5 f4 k; |  m$ J6 {0 P- w9 [+ Q
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

3 p- A7 G" L# h% j& S$ A
- d$ u! T$ F, r: I$ ]$ v3 jm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
* e" T+ t) s. \& j
1 B  ?( l, h3 H8 Z, H- z. M
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

% t3 J( c2 f& C; K. x3 M" |+ }5 o8 a" R. l% L6 k
}
* C  W* d$ N% y
public:% F. o" I  x4 O! C/ W' U
+ O  i! m9 E1 B* a' t3 Z: k  q) u
) N2 Z5 s$ U9 A; N% U
~TetrisFactory(
void)
: i; Y. O# J& G

  w  {4 {4 ^( \2 v3 `) d{
8 {! p' R* C9 W, k  Q
" k7 S# g- Z0 q9 J% o: O9 L7 p
}

! X' l' Y3 u+ I0 e) j7 [% j
6 r( J. D8 C2 C0 `  ~* _, JTetris* CreateTetris(
char sel)
% `5 R6 w# M3 u2 W& l7 H
6 R: I" ?' o/ r7 [
{
. Q5 M# {" N: J6 _, y  s' H3 J8 C
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
" y, [; y% y  L2 z8 G9 a; W9 r; t& s9 q& i$ t8 A
}

1 ^$ p, Y0 @. w$ Z7 \private:
8 v+ n- ]* r# B8 U
0 v! [* S& X; T! V2 [1 H

# J! y/ q0 o) h( `" T& d) @
% Q+ V5 E$ C- g4 f0 s8 D' OTetris* CreateOneTetris()

; }! g8 a+ C( E4 g8 ?9 p( k3 X' t8 ]) z* b
{

( x! |0 [- M, P3 X7 `                        static OneTetris tetris;$ K, }1 e; Y2 k+ l  t6 j

( }* F, h( z& \; F9 y; Z: vtetris.InitPos();
; e+ \, d) Z3 j% `" y, L9 j2 F2 e
                        return & tetris;
  G- X9 C) c; i2 ^" N/ P: j5 K7 k% o7 h8 R' p; {- W; z0 p
}
* i. j& @7 e% x8 \2 F

) M- r, Q8 Q, k# Y: C
% `5 W( a; E9 y' g: m+ [

: [7 r4 d  ~( b# A( E  hTetris* CreateTwoTetris()
8 n" R% h% x) ]

3 e, m& {: U2 {1 K5 d, n9 L% Y{

* s. @8 R; o9 V: d  p                        static TwoTetris tetris;
8 l* p$ l4 }# m: _. x( I3 [
5 G  u. S9 z% G* otetris.InitPos();

) @0 o1 m9 \( g6 B9 v+ s: v                        return & tetris;% e+ S/ [2 O# |5 l+ R
, q. o$ I3 ]6 O: f6 |. d  T
}
% l, r" [" T) Q) e. N  p
% g( k6 W' O) M9 R4 l# V3 [$ N# [
; I5 x) P- u+ d
7 k4 L2 c8 \5 z: M. l, p2 Z
Tetris* CreateThreeTetris()
! o# e: r+ p9 k% U) a

9 w7 X7 W5 X# K{

. d7 c% k4 n& F8 V, ]1 e                        static ThreeTetris tetris;! I$ C0 ?6 g; A( P
. t) \$ s: T( h, N7 R: A
tetris.InitPos();
% S2 q% K- ~2 Z" ^- F3 U" [

. t; a& r: L2 L4 z) `6 y# C6 p' y  m1 y
return & tetris;
( H7 I; }. K; b2 J( m
2 [$ n1 L/ {% Y/ [" z7 }6 F6 y0 B
}
5 \2 e  x- ~  v$ E
5 a0 G2 I$ W. M- n1 p

9 o- q9 M6 _( c, q. {7 J
) M! }+ T* [1 m& I' RTetris* CreateFourTetris()
3 ~2 H) }) s5 E, w  k1 |/ k$ o

6 i2 X+ L5 Q* ?1 l/ ^9 h4 I' B  p$ ~{

3 E( O# x5 J, F1 Z3 C' o# b% {                        static FourTetris tetris;) u6 I4 |4 ]7 W( z

' c% n- `# _" W9 ~- }tetris.InitPos();
) v) f& }3 p3 h( b+ i0 _- b
                        return & tetris;$ {3 T- [$ c7 F' _" p; B/ K9 z" r: S
9 X0 |4 E" a6 j
}
- n" @- F- w+ O7 q8 `" w

0 M/ @  P% H4 n1 z/ B- B

% Q: L% I+ ]2 a, F5 {1 V  g6 b
: D8 ~: c* N- E: o1 cTetris* CreateFiveTetris()

3 x" `7 N" Q* T9 h6 d, l- q
+ y* _; N1 u9 H( [- ]! Y- g. l{
; o4 F& S; \. ^
                        static FiveTetris tetris;5 v4 L! _. a$ H3 N- T* s2 M$ I; {
6 i) d+ W  W$ T  m! ^) T$ p
tetris.InitPos();

% V2 Z  x2 m1 J' M                        return & tetris;
6 N0 W0 D# S1 z7 _- l: x) K; U3 @, m6 g, ?* y" Q
}
* T; C. ^6 e. I2 d* j
1 r( c3 z: j& J2 r, r, ~
' C" S3 ^, r% k' d0 Y
Tetris* CreateSixTetris()
; I  o  N6 L5 q; R6 T

/ l2 x" Q) ^1 I, ~; t{

! w, y2 J# a8 k( X                        static SixTetris tetris;
% M7 W; Z+ C" N( g) d
) v* y, Q4 G8 Q; vtetris.InitPos();

" k+ [/ y# D9 s                        return & tetris;5 H5 L4 z+ E( c5 W4 M* q  s

6 J6 L& M4 u# [}

& N6 U" A: B+ K" E2 D. o ; B5 v' r0 Y# }. I; v; f

! w5 c; k, \  x
  i, n( M* J$ q! J2 @/ d
8 W0 C( I% f* |  X
Tetris* CreateSevenTetris()
; q! M' w; n! N9 a
6 ?" ]* Y+ M& h1 V. g* y: d8 h
{
3 A, A/ {, o# h7 ^% `# d% b
                        static SevenTetris tetris;4 ~; [' m7 i- U* l- b$ ^& t
; g8 s6 o( ~! T. }( l7 ?: Y& }
tetris.InitPos();
2 W! \2 ^) ^- L1 S/ U; h7 ]( I
                        return & tetris;
9 n- Y: z$ S- R& B; P) M2 l" U5 n, N, `
}

' K6 k! G9 K% e3 ^" s5 n; e) r2 s. V/ C - s8 `0 t9 ~" {! o# R6 }! O- a
private:
6 a3 U% v5 a3 K4 t# t' ?
0 ~7 G* R8 J$ T3 a4 x            typedef Tetris*(TetrisFactory::*PMA)();3 e+ @" ]; n1 E) X0 T

- q/ O# R7 K9 `# _+ Lstd::map<
char,PMA> m_sel2TetrisMap;
  R3 u+ \5 g+ A$ M

& {0 F; S: m! r7 _9 }5 |5 u2 [. a

* b* D; ^& m- K2 K- E( L};
) @( |2 M$ v. E( c# J
9 Y, O" B+ Z# m6 N, b; t# F0 D9 b/ A1 s有兴趣的朋友可以下下来改改玩玩。
8 X& K0 ~  R# V; s4 M
. w5 s; z- v& w4 N5 i9 NThat’s all!
. {" p& @$ m: x' e; u+ u6 t
# Q2 N" V5 _0 K! `Peter * l/ ~2 }/ D& F2 K$ _3 ~; \' L

$ H5 `" t8 n" f) l. I$ _[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-4-24 19:19 , Processed in 0.030430 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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