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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
' ]5 f' q8 U0 X, g! S
1% N1 M5 G$ g2 j! A! j+ k! s
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
9 O$ q$ C4 |4 H% F/ p* o8 P; ~9 Y* f# {: a" {, m) M) O
& S0 |7 H5 T7 i) z$ i( h
Factorycode如下:: u5 N0 p% e4 @, N4 m3 G
  K% U+ L+ h2 x( I$ ]9 Y0 O6 X7 ^
/*************************************- _* E& ?: t0 U: T2 T

- A6 O. }9 M6 m* L/ s  B* author:hgf_starlovecpp@hotmail.com

( n" w/ c9 L& ^2 W# K. n2 z6 S% G7 ^# [! E' a$ G9 [, B
* version:1.0

$ x+ a( A/ K0 n5 L( p- l) y) k9 e+ e; V# i
* description: just for fun
$ H% t1 F. h7 k2 n$ ?: Y

0 A' x5 B! G# r" z( O5 o! P. D5 ^* todo: hard code exists need to fixed

  l0 [) I& b& Y- W0 G; \
4 M% @3 s( O3 I3 z3 p% K9 ?7 v4 Y**************************************/
% k: V  }% w& b; Z

4 g7 Q: ]2 _( [1 q7 Q  a( d" R#pragma once, G" }7 h! f9 r0 R; B, N) U. C
#include <map>
# m% C, W8 e) D9 q0 E6 x#include "Tetris.h"
4 D4 W2 v% {0 C/ x' U5 D2 S#include "OneTetris.h"
9 J5 z5 o+ C. O" y#include "TwoTetris.h"
# p/ u! F. g3 t/ Y3 i#include "ThreeTetris.h"# @7 u& Z" C% f1 F" V5 \
#include "FourTetris.h"
; S, {* H& e4 R! h5 p% H#include "FiveTetris.h"& I+ }) k5 X: q5 e" e% o: G$ w+ a
#include "SixTetris.h"* ~$ V7 F% \; @. r
#include "SevenTetris.h"
. Z& C$ B; h( E) Y( V  o . L/ n( m3 O9 s$ m, z
class TetrisFactory4 n  I$ V& x3 _
{
5 F) b2 z9 Z5 X- l" ]% Y4 Npublic:
1 e, R( D- e9 M- k 0 c& C# B3 P8 k1 l6 V! k/ V

2 L# Z1 R. i- h0 O9 W: @2 j% _4 a: g1 wTetrisFactory(
void)
0 H2 ?/ ~3 C+ M- g

4 T4 b4 \) k* Y5 w0 \6 S% O) x% e{
5 g! K4 h* t, t" @0 Q' {

  E1 _( }2 i( {  }+ k2 _m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

$ }& x, D6 [: `7 W. S: g" D4 [0 w0 t7 M7 c
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
4 c3 H) y4 x; y$ ]6 X. P6 o; p
6 H* P( C, N# [9 W# S6 t# `
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
/ s% B# ?" J; M

4 m4 W8 ^0 H+ i9 Lm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

4 P' A( L- D7 M- d/ y/ x; {; m/ X# m4 G( S
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

4 ]& e/ q# q9 w- x( y; k: e0 f9 G7 r6 f9 [( F6 ~9 b
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

8 w! e* ~8 y7 {. y0 ]7 m
. l. d/ L+ f/ a" ?2 Um_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
/ Q1 d; m0 F+ i% m
/ q1 K8 C; [4 O$ }% n$ t  K# m
}

5 E! M. r& ~- g- B  c( W9 Z# Tpublic:2 ]$ @0 M9 D, z
7 a0 m' ^, I- v4 `

/ v! s- O3 H, A! T~TetrisFactory(
void)
9 ^  U; e2 n4 @

' Y; H' Y7 S+ u/ a$ W+ p8 q( N{

8 @" u* `  U! O0 v- d; v) v" k2 t) x% y5 W
}

4 y3 Q) g' t9 F5 A# L- ^4 T% T
2 Z# P" p0 o' j% @, k" xTetris* CreateTetris(
char sel)

' U. g3 p$ T0 s6 y; D/ C# ^
- J9 \4 K( L4 z* r4 R: q! p. X  W4 X{
0 v4 P* S/ a2 j! A' L& P
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();9 q+ f' ]. M+ t7 J* ^7 d

$ f% e! f+ O$ i}

" y$ T" y' I' R3 K% tprivate:' q$ ~8 H. u" u
+ |" w, @! o+ ]% g
) O, Q- ]) Z& u2 U* k/ v
% p& c1 V7 S( N1 b5 x* v3 d
Tetris* CreateOneTetris()
, Y- i4 G& S; j9 K$ n6 Z2 P

9 r- Q# J; s( c) I2 V% L{
* q! a% ~1 S9 \+ n* y+ r
                        static OneTetris tetris;
# _& x9 ~' I! P  ]6 I) H! w2 ?. M* C9 |% T& o
tetris.InitPos();

7 |% ^" t' ^9 b# S& v0 o                        return & tetris;  F; R7 k, Z5 E; J
! y( o( }/ m* [/ p3 x
}

: {) o; c6 o8 r$ _4 u
8 f& {0 E; w7 R+ {6 B" K
* w2 v0 Z" F" s  L6 Y, b1 _/ y* H
; V$ z7 n; N- U' ^
Tetris* CreateTwoTetris()
- E, K6 h+ V! a; l  D1 l

$ N1 |3 L4 ?! U" G+ T; v4 Y{

: ^0 L% a6 r. G9 s7 {( ]6 H                        static TwoTetris tetris;
( {3 V4 B, D+ K/ }0 `4 ~( T7 Q2 T* a% A1 I7 R
tetris.InitPos();
2 y0 O; @! h- T, m5 ^* G
                        return & tetris;8 W1 N9 l  D0 V. \" B

0 g% o$ i% o3 f5 T7 ^& U}

$ U; x& i; Q' b+ T* V% X' c# u$ P) v/ ~7 X' o. N1 {5 [" C( ?

1 F* O1 o+ y' }) u
' l* d( {3 u- m1 l# c" e; cTetris* CreateThreeTetris()
* P" Z4 v3 T" x# w9 q0 |

0 S5 a: r/ W5 T6 `{
  |0 O+ I' t) e: x1 G9 c
                        static ThreeTetris tetris;. d  m& ~' x( Y. |4 @4 @
0 x' z  U8 q3 D3 S' i, c
tetris.InitPos();
1 u! F/ X7 I# P

. ?$ }& j3 D- o# J; C# v" B' N4 n
& [: a9 n( @9 {$ D, d! I/ m% d
return & tetris;
4 H  {4 }; L% y0 U1 T) ?: N+ C
0 U4 r1 ^8 }9 b
}

$ A) c9 j2 N' z8 S: l' ]" w2 H# B  u6 l% R+ Z1 e) e( D

2 u  P; _0 X" Z% d  Y, p5 z( Q
3 u$ u! w0 G% B+ f+ MTetris* CreateFourTetris()

1 e3 R3 E; G( Y' a" K
+ Z2 U8 x7 [; B- j8 ~1 ^8 Q2 }{
+ n3 t3 C2 o1 m5 T, R
                        static FourTetris tetris;
& }: m4 h9 F, r2 `% F! `: r) F! ?1 |% ]8 Q: {3 z4 U0 J$ u7 m9 b
tetris.InitPos();
! n* ]. i. X6 i# r! ^/ a, w
                        return & tetris;& N) ^' f8 ?- n
. _2 `  e/ v( D
}
2 g  J6 s/ m& o5 r% L  Y( w/ @
2 j2 z" a* j1 J6 A

- r' R# X# A+ r# m, }8 |& k
( D3 u' I3 ~$ {" g' s- rTetris* CreateFiveTetris()
- \3 t+ m+ H, _5 T, u8 S) T
+ N8 ], l9 y. u! v
{

' z9 `. I3 f$ H' P% ^) V8 ?                        static FiveTetris tetris;6 y  R, K/ u' ~: S: k! P

# m# m# @- \9 @3 atetris.InitPos();
5 d5 j# Q# c3 [: |( J+ @# |
                        return & tetris;1 K4 K! \- H) w

/ v3 |7 F) ^- q3 v; Q& j2 I( ^}
: O- x% g5 h4 d

. Z! ~* w% p, l& i. O- w+ x2 n# \/ `! o
Tetris* CreateSixTetris()
9 p; y8 E5 X% n. u9 p8 M

' U: W7 L6 P$ N& F4 k/ L{

$ |, v+ ]3 _6 I% T: G/ p                        static SixTetris tetris;
9 a* U9 K% T! M" A; F
1 X5 U' I' t- x; j9 [  mtetris.InitPos();
+ a( @. o. A( w$ l9 e
                        return & tetris;
1 y; w; N4 V6 u6 F- I
. d) |( U3 j0 k7 S- V: D! q; B; s1 g}

2 Y: ?# O' {0 [0 e$ y
" p' `; D) u, J* a
" z7 r4 V( Z- f% a# y9 y  u) y( k# J
  V3 S; w" O2 n; C7 Y+ w+ J9 p8 J

% y! y6 t. S) y& hTetris* CreateSevenTetris()

) d6 d. p" b  v9 p- @3 u2 q; g1 k7 P, r) O! P9 i  |* M
{

0 N8 L6 Q! C+ n: Q  U8 Z                        static SevenTetris tetris;  R/ A2 U8 P- F5 Y1 ?+ c1 k0 w

: L1 D* W8 \; d% [7 B) ytetris.InitPos();
" x9 t/ d& y# H5 o' S" l5 I
                        return & tetris;. i& N7 z3 m  D( g7 u( ~( m. M
: L6 {3 Z7 Z1 o4 T! l
}

7 _: _/ n4 ^  b$ n' ? ! c. l/ j* K) A/ ]  k
private:
$ f; A" O. S% J" @4 N& Y0 x
+ M( g2 C* i$ h3 ~0 i            typedef Tetris*(TetrisFactory::*PMA)();7 t2 \6 s7 |  ~( x9 C. h( H
7 ~+ p$ `0 L* s! Z; P' t
std::map<
char,PMA> m_sel2TetrisMap;

3 v/ {4 A. [4 Q' O# I1 w$ q* A
- e7 y' O8 K) B# |. {- t% p1 O; ?

; o* _+ f: \9 C' W+ l* x; `4 [};7 L) R7 E" _1 J2 ~( I4 E8 y1 x6 U

8 Y* p( d- M$ j5 `7 d有兴趣的朋友可以下下来改改玩玩。) c/ B& n( l) c, x

; _5 J4 f6 K" v0 ]3 EThat’s all!6 }  M. y. `4 y; n% Z  k% W5 N0 W

1 b, Y& `5 O& p8 C7 E5 J) dPeter , M- w& W/ E: z1 q; T
7 s) M- {0 c8 h) k! H, i
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-3-5 14:25 , Processed in 0.091726 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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