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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
% m! J) F9 z9 N& ^" M9 G" F
1
1 k4 w/ X5 D2 G: l; Z" c  {5 r完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:/ Y0 D) W) u4 O# Y# s2 [' B
5 P& H6 a* C, I

# C2 F, E! w( d' q7 }- BFactorycode如下:, e, L3 B! I) C& L) |. k
  _! |: ]+ E  X- b3 j: T/ d
/*************************************
6 J+ S0 u/ ~% W$ D3 `' g1 z! ]
4 {& h. `- k2 |* author:hgf_starlovecpp@hotmail.com
. c9 _3 o; m' M
: G5 {3 o0 Q# ~$ j/ `2 z! l) k0 N
* version:1.0

+ ?. W- K) @$ t& u/ H
3 a& `8 S5 |$ z% \5 s$ I3 |* description: just for fun

% c4 o  w0 ^0 V+ x/ V5 d* Z# W+ L2 K/ V* C# A1 f; k5 Q3 E: h6 q
* todo: hard code exists need to fixed
. ]- h0 h) t; r8 ~1 O3 S7 {
4 C" x" ]) g! M+ s2 N- z
**************************************/

" }: D8 C6 Z( Q
- E7 p- o7 I5 d' O: u9 M( r#pragma once
* y# X- P8 j; x2 I1 f, d#include <map>& B9 n& g( e: \' ^- G0 h- U5 O
#include "Tetris.h"
: p* x2 V$ z- X& T9 q2 I, x; W' `#include "OneTetris.h"
9 b. M2 [$ [6 q) h2 s+ x' W) t#include "TwoTetris.h"$ r) X8 c) c! Q/ a* f
#include "ThreeTetris.h"! O. m7 u$ S0 @0 D4 I) {9 \/ z
#include "FourTetris.h"
/ h6 u4 n( {, f#include "FiveTetris.h"
$ `4 T; M' D+ k7 d4 X#include "SixTetris.h"
* L6 C' `: n- v; k! O#include "SevenTetris.h"+ R, q  U+ Z- e1 i5 ]
8 Q# r- X0 P& Z9 f3 H, `
class TetrisFactory
' P4 s) b9 t5 _{
% V. r8 x. T$ p5 g' j, y+ spublic:
8 k7 b- M6 h0 w6 |) e * g) E7 V8 z* U  `. Z8 y- A- X9 m8 x9 r
; `. b5 N. Q0 K+ W) W; l
TetrisFactory(
void)
* R$ a* n3 o, m1 `# ~1 T/ y
9 ^, e* K9 f& r/ i# @
{

% V8 H1 C6 N5 |1 b# q7 O
- z" |. h$ q6 R& v* y) R1 W+ b) x: `m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

4 ^; @2 K1 ^" U! T3 u+ ~, u4 G/ s# u6 y: i
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
  F) X3 k# p' o0 H5 p; P( }1 [

2 G* Y. G: B: Z( M) a, }m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

, q, N$ Z8 {$ e6 V& z* _7 h; c9 C- ?+ D' ]
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

& B" C+ @/ [7 \8 ^1 ^1 S% n
0 V3 G0 l+ k5 Z1 T: }& Vm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
! U6 \1 |2 M* T/ y! O1 [
, `2 v# Z% Y6 W, }
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

" v8 L$ m/ w( ^- P0 R2 v' K6 Z$ N; }6 ]+ Q# S
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
0 W2 ]' ~  e6 k7 T( {( y+ h9 m1 P
6 R& c# p, a  d7 s0 s  m
}

3 P) P/ j. w7 }9 Tpublic:
$ f% U5 j, D* C$ ~- R7 }" w1 [
& G( I1 `) |# z6 k. z7 K3 w( K
~TetrisFactory(
void)

0 j4 n# v% B8 ~. m, q. U
' T* T5 K7 E% S# b{
8 z9 r& ~: O0 h& u

7 B" q& i* s$ E$ ?}
6 R; q& c4 Y: Z; I* z5 M

0 f: P4 f" `8 Q- d' ~Tetris* CreateTetris(
char sel)

% P8 T2 K, I" D* V
% U1 M( q$ K$ e+ ?+ m( Q{

/ K9 U4 S/ L9 w- C6 o                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
7 k2 C: Z) z9 T  n$ H% ?& p% T! E& p7 G- V
}

' U- ]) {$ j6 |% t" ~private:
3 t! F* |7 ^: w0 V  U* l5 e2 C2 U- c6 A! a3 g3 F
9 |5 ]- z* S9 j2 l

# T& a+ Q+ k5 zTetris* CreateOneTetris()
! L8 T! Q0 K/ |' H0 `, `
6 |* D6 s# l  E: I% ?
{

/ _, f: z+ ?& ~+ c                        static OneTetris tetris;
% [! \9 x' s5 \7 y8 ^% {8 Z0 y$ k# R* k# L: I2 o: U2 Q
tetris.InitPos();
5 ]; i/ J4 l2 W' N" v" ?% h
                        return & tetris;
# b# _& l- D' l6 @; V6 Z" l$ Y  U* a4 E/ G4 o6 {9 s) P# k
}
7 f0 ~6 l1 T! Z( q# Y! e# e

  u4 Q% o1 ?! X

5 j: X9 r& i& E& m7 H8 h% S7 H* R% K' }- f+ C
Tetris* CreateTwoTetris()

4 L) }8 l1 J3 V  v
. f3 c' X. G8 m  f{

  U- Z  y( f4 g# [7 O' [+ a9 e- {                        static TwoTetris tetris;6 Q+ z0 d/ n+ F7 z+ B0 Z
; }* n8 m! w& s' d$ Y
tetris.InitPos();
9 G, Y# {9 z  W& W/ w7 }: b& W# c
                        return & tetris;# ~! c4 n0 d1 }

7 z7 Y8 l1 k8 l5 Y8 U) @2 z}

- Y: E7 |7 B. W0 i: o% R, ^# S% r
/ q! W/ N; ~. c  ^# J& z

2 k/ n; G- E/ l7 z; l) ~* A: U- Z* t6 R) ?
Tetris* CreateThreeTetris()
+ ?( K2 J3 c* `
# R$ x+ }: e' A7 D
{

3 W1 `1 l5 ], z" Y1 z+ D: M+ Y                        static ThreeTetris tetris;
% m  o8 A$ b2 P/ v3 T# o5 _4 G1 m; \" `
tetris.InitPos();

# C7 O/ d: f, B* w
+ x+ a4 h# i* A0 N% H2 O3 d
4 L( Y1 R% `3 i) W4 m# ^
return & tetris;

: E. S- x7 K8 O0 c, S
7 U# P! d0 c# j# }, N4 O}

% B0 Z, I5 B* N& M
! |* T# n. i6 `6 u# J) p

0 ~2 ~, Q4 _& D+ |1 k1 [- R: q6 H; Y: T) y/ G/ b5 r
Tetris* CreateFourTetris()

# S& i5 u3 L7 |8 [0 \6 l$ z; ~
6 [3 Q( N4 T: d1 x- B4 i) S  m{

) K- F: r8 P; L* {% _; @; E$ z                        static FourTetris tetris;; {% G( v' Q: d- F
5 X! ?8 C4 A& v2 _8 ]
tetris.InitPos();
% [: K- w+ @" N+ R( J0 J
                        return & tetris;: F. L) o$ H3 m1 @/ h* [6 v
6 z2 s5 F5 {) Q' L0 i1 X( ~8 d
}

, ?' v% Q. T4 B& u' `' k: p8 o% K+ F$ p% Y
& @9 P; R. N4 _' C, S1 H
1 _$ M; \  g- e6 ~' U
Tetris* CreateFiveTetris()
5 J- r2 S  R# C9 _3 W
4 b; ^/ P1 V! y' F/ i& H7 x
{

  m8 k7 j! S. L                        static FiveTetris tetris;
% v% G8 R" D) M# `- N; t% k+ H3 S' W( O! c& ]7 d
tetris.InitPos();
8 w1 s% R8 h, X5 A# w. x- _
                        return & tetris;( R6 l8 Q2 v3 q5 m! T7 ~

( I, U6 ]5 b* S}
' P; }) P% W2 r7 @  l1 ]% h/ `

6 ~. N2 X; O$ u; @4 s, N& O+ ^+ h) l" E' c; g* @( o
Tetris* CreateSixTetris()

; M* W9 F' n% e) r- _8 A* d6 H2 h
5 H  j" D. @" Z! E3 O7 W{

7 {7 N1 ~( Z1 |6 {8 ^                        static SixTetris tetris;
  [) ~: W( N% ]5 }- s) n! B$ L! ?5 |2 c, \! n- \
tetris.InitPos();
7 P) L* O- n& t* K5 Y% ~
                        return & tetris;* D8 w9 B2 ^/ b* j
5 ?0 P. j6 [1 o4 U" m9 ^, ^
}
: I& z( q: ~# f; e# d+ ?8 G( {
3 k% A7 P1 y* |  y* A$ N
. M: ^" N9 n2 R: S3 @- S1 t" g4 T% A
) U; P9 ]5 i5 s! ]& B# J$ r2 @
/ |3 ]5 D! K' C; \2 a* ^. T
Tetris* CreateSevenTetris()

2 ^1 @: K: I9 P
! f0 a, G; Q2 z. o$ t' s{

/ B- g# E6 d- E- u1 s                        static SevenTetris tetris;- M0 {; Q$ N# G3 Y7 g

' q& Z  a; n8 }( G0 Ttetris.InitPos();
6 c7 c( J, s, G, Q" k1 R
                        return & tetris;
7 V' H' H/ I: p# j. \" z" `9 d5 v( C- z/ F, m8 H; O8 j- s6 E
}

" W3 ~. X- e9 ?) |5 j) S4 G
3 o1 d; [# n) x9 `; Xprivate:
9 t9 f; q# Z! B" w, H; m, s# @ ! Y# ^/ [6 v+ S8 \! P
            typedef Tetris*(TetrisFactory::*PMA)();$ m& B7 [( f3 \8 k; }

- u3 ~# g  A; zstd::map<
char,PMA> m_sel2TetrisMap;

1 G0 n5 S8 j* u3 L7 l# R8 @7 Y8 X/ |2 j1 P6 f
1 f; S$ ]% I6 j- m' X1 P
};
2 J1 S5 r/ m' ]
9 y' C# ~0 J/ I" k/ `" p" I' V8 }有兴趣的朋友可以下下来改改玩玩。
0 B, @' i7 o4 V0 c5 x7 E $ B2 q; p" o' p1 i1 @/ ?6 T
That’s all!, s$ k3 K+ d* v) J0 Q& l8 k

( F2 u5 w! X3 G- R; A& }5 H" uPeter ( r! a8 D3 u. K1 E7 I1 o3 @$ U2 c
% K# x. ^, ~, n+ n/ V
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-6-4 10:29 , Processed in 0.304636 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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