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

俄罗斯方块

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

/ q) s9 b. F( r+ u) S  b6 D 1
. M, i; `0 w" ^8 J- M' o完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:+ i3 X/ N  J& c* I" b3 n& y
6 x' J- m7 x* j0 r- ~5 O1 u  a

# E  c) d: w- E- t# BFactorycode如下:1 C: |4 X+ H. f

  B* _9 W: c. a3 s/*************************************; L( H* [+ s% {' o5 S+ c0 s$ B
$ F* s& `# U  B. `. X( Y
* author:hgf_starlovecpp@hotmail.com
1 w3 ?- X8 y2 V6 T' z2 |

! k" S; T  t" J; Q. p" C* version:1.0
: `& |. c9 W! b& @

( s7 Z' M# F' Q4 K/ O* description: just for fun

2 ~$ }  B# y, T
# C* m. ~3 P- G  x* todo: hard code exists need to fixed
3 K# J/ Q7 f1 R" I9 \  Y3 W
8 c8 o& g/ R1 e! j& y. e( P
**************************************/
9 I- R5 _- S6 [0 L* @4 ?, a

7 M/ V8 |9 J) l! e+ l#pragma once! h  d) e6 a$ v) a; S' G2 k. l
#include <map>- k1 f+ f& K9 a' D3 ]6 D8 z! _
#include "Tetris.h"
; q! [/ e& ^  l5 C6 s$ E2 s: I#include "OneTetris.h"
& A1 I4 k# o; w. c, s9 K#include "TwoTetris.h"
9 p0 R8 T* U3 {#include "ThreeTetris.h"% O* L2 {: B( f9 @
#include "FourTetris.h"
2 k# f7 L7 e% k6 w: N8 ]#include "FiveTetris.h"
. ?. c% J0 L6 N* a$ R3 ~" z7 p#include "SixTetris.h"4 s: F: z1 }$ }' ^; M
#include "SevenTetris.h"
  u; _9 _1 L: r; X7 m6 X
+ ^! z0 D: `9 W2 O9 nclass TetrisFactory
5 ~# w% d# x6 ~( a& |% J3 o. e{
+ C5 h  A/ l. @* x# E1 wpublic:
1 b4 ~4 g$ I( _
. F; b- F: n1 A1 q2 ^: J* f8 p3 n5 q% T2 P% [6 X
TetrisFactory(
void)
0 M; @; x0 j( Z

) F, @& v5 H* }+ J+ I9 c  x{
7 N& G9 X. k5 W' P
2 \$ l+ f% ^) E- H8 o: m0 o3 r- z3 S5 Q
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
; K: \' I# z) v/ e* i2 }% c7 u* l
( _1 _; R1 e/ D) B+ ^+ m& d" m7 @
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

2 A$ w2 _( t) T+ o2 ^" K+ _8 {5 d' Q8 ~# k: i* G
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
4 a8 N5 V. N: P! ^
: V4 b7 X# O$ p1 H1 N1 L% W
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

7 i* T2 m" J6 [. a7 k! V4 {* y8 h$ v% ?! W
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
( A* k& {* j; H# `, B' a+ A( ?

( F, B6 O; P& C0 b1 ~m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

) |, H6 A/ o3 j5 _% k: y3 B
/ L3 f# z. t6 e: |& tm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

6 a9 i& b/ w9 i: k5 H3 W
2 O" v5 r7 o" ~' C}

8 }- o' V# l. u& W& kpublic:& g$ E0 x" Q5 l" ?1 A

, @$ D0 x' n6 d1 f& [8 s; V; Y, H# S$ b7 ]- Q/ S) `2 v
~TetrisFactory(
void)

( _! ^- s1 @# Q0 x4 J% M; ]. S$ y$ V% G! \* V
{
; S. K) g  s, \( x
& W+ ?1 U; y" k) O% z- p: G
}

( S" s# r% p6 P% m6 y8 _) r5 O
7 N3 ^1 ^' N* f# p$ lTetris* CreateTetris(
char sel)

) t7 L4 z, V, }: p4 h$ @( d4 j. M" D
{
. O# A3 H% u6 a9 E
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();  U6 q5 v% n/ i5 J! q: I# U( G

: @8 Z) S* |7 X7 l0 j) s9 h- O) O}

2 H" H6 c( f7 J  Yprivate:
9 g' w. c& y# F! Z
  L' g! q- Y3 ^7 O5 a+ @

' r8 n6 A  X$ z8 f( }! N+ q& ?$ t2 H
Tetris* CreateOneTetris()
( g. V2 P) Y' Z" k8 j. f
( S% T' K( z% G% X! }
{
5 L3 q% {$ ?' h9 M/ d
                        static OneTetris tetris;; _1 d  O# G* c& u

$ ^& {% ^- E; H1 \* ltetris.InitPos();
. E" _% z! I* y( [
                        return & tetris;3 V/ w6 q- R7 x/ ?* I9 h8 t! l. t

- Y) I8 R+ {+ M7 E}
6 n% }1 s3 J. r) k: m/ M

( c8 g7 z6 L* X& n
2 Y3 U, s4 T! Q/ ]

) q- E7 A/ G& w  X6 A8 d5 h: ]+ N0 HTetris* CreateTwoTetris()
  J+ {- |8 m3 p, ~% y8 x
# ^9 o& a+ R# e3 l/ r' Z
{

; m7 _! [5 W* g) ?* `; o                        static TwoTetris tetris;/ I) e$ D4 v+ I% }. k: ]

' k  L! Y4 j& Z/ p6 Mtetris.InitPos();

% P" h: k' ^/ R$ K; {2 M$ |                        return & tetris;+ f; Z$ P. W# K
* P1 [. @4 `: C* m6 U. N
}
$ C, _+ f/ x6 ?% [

  p% t" I1 `7 I/ N3 a
4 h% Y" g! W7 d3 _
; y1 l' {" r% q$ S8 j
Tetris* CreateThreeTetris()

7 E+ H! C5 ?, L! o* I% V9 V# p; J3 F3 H3 r* t/ u4 O
{

4 H- A. Z4 I2 Y# f8 m                        static ThreeTetris tetris;! n- Q* z6 C# j" U
2 A9 f2 ]9 U" A9 B8 P( s, A
tetris.InitPos();

7 G3 ?0 v* T" }6 q- j3 |; A' S' H8 E  r) R

, |* e/ N" b: |8 _  K
return & tetris;

; L! u9 x9 p! j) _9 z1 V+ h
. A$ w% z5 @) z* l0 J}

  ^. b. p: |+ {' H) j; T# w( d9 ^% x7 l9 H6 ]( u/ `0 ^

( v9 j1 q+ M7 o% e! z1 Q. P. ~* Z8 E8 Z
Tetris* CreateFourTetris()
' n1 O/ c: N$ U
6 \* _  w# H. u" ~$ i
{
# S8 }9 [9 n8 [8 H7 S
                        static FourTetris tetris;
; T9 ~, `, o" F( |8 k! t4 L
  R; X5 W4 K; J* P9 Ktetris.InitPos();

% y) g# J, I6 r; n7 k/ F8 F                        return & tetris;
7 z/ }2 ?8 B, C
8 ?" Y, }8 A: n, n1 [7 A}

6 _5 q/ p& S0 s8 \4 X$ a1 n8 _- ]! Z4 G
/ {7 M& Z5 l3 C$ X4 |) \

3 x' k1 L2 _# y  w& l
' [& b' p6 P9 P1 r0 DTetris* CreateFiveTetris()
# a1 \- }% j6 o+ w) g* ]
) ]0 F, _" x9 }7 k
{
1 a$ ?1 M, k. D  R: n
                        static FiveTetris tetris;' J- S1 i9 ]/ G! d( X
0 v# k' g+ B* f0 u% p! b
tetris.InitPos();
( K" I: T# B. m! l& Z- i  U
                        return & tetris;; A$ I! ~; L  s1 ]

6 E! {, J2 d8 I}

: U: a, w/ p$ H
) E9 C' p$ |' e$ y
; \! z) u  M$ _# YTetris* CreateSixTetris()

6 F% Y; R4 O2 ]
# G) c4 H3 {2 \; \1 ^{

- h, c$ t& M. v. ?0 U% ]                        static SixTetris tetris;( M" q+ f$ h/ I; D9 v; a0 K3 v
6 T( `# [# [0 [' c2 z& R
tetris.InitPos();

! g% O" h: m; d                        return & tetris;
" J6 m1 I+ t+ D1 o3 M2 R$ n
% k& o9 O# w9 Q+ l}
' S* _$ N4 w4 {! Q8 S
3 D/ [5 @8 T3 p0 G4 O& D5 X

) k4 Z: Y% F2 t9 c! `$ C
: t; L( a" b( |( M. z3 e# G4 ?# d

& P  G  p* @9 b6 u' LTetris* CreateSevenTetris()

8 d5 p2 i" b7 W7 q5 I; F
8 R" ^* e- }6 X' [9 b& \4 u{
! c5 {; O# ~, Z# Q$ r* l
                        static SevenTetris tetris;
; K% I& u/ [- n0 w- U) k# K  Z3 V  a! Z* t: ^
tetris.InitPos();
8 a. {4 l* @7 H5 M
                        return & tetris;
; f) o" S8 \4 K% O/ X. m" o9 K1 b6 u7 b6 f; N* M( N
}

- ~# |  M$ M& w2 o1 S, t. N 0 h, [) L8 Q+ {6 b
private:! J2 r0 U1 ~+ }' `
+ I, D+ [, j* H, v1 Y' L
            typedef Tetris*(TetrisFactory::*PMA)();0 z) X8 \  i% S" j, }* m
/ H- U/ S- W" G. F  ~7 A" ]" z
std::map<
char,PMA> m_sel2TetrisMap;
, v# {6 G  F$ W4 k5 b! `
* D% @2 F6 E, L
$ r8 \/ Y; l$ F3 ]8 u( l
};1 l& c# g! |5 ?# \: g
  l8 v: |! d$ u. z# b$ u& B/ G) R
有兴趣的朋友可以下下来改改玩玩。
2 k( ?7 `4 _, G$ T: _% R0 j , S% ?; h: `; x" \2 L8 K
That’s all!/ i; r/ l" u, U% L2 q+ e( o

3 j5 Y4 k# F5 B- `Peter
3 K& ?7 j/ {; d; d; ~# \- R1 z7 K5 e- R7 u1 R
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-12-1 07:15 , Processed in 0.191551 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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