導航:首頁 > 編程語言 > 如何使用sc編程做小游戲

如何使用sc編程做小游戲

發布時間:2022-05-10 12:08:27

1. 如何用vb寫一個這樣的小游戲

把代碼復制到空窗體中按F5運行即可。

Option Explicit

Private WithEvents Timer1 As Timer
Private WithEvents Label1 As Label
Dim GFangXiang As Boolean
Dim HWB As Single
Dim She() As ShenTi
Dim X As Long, Y As Long
Dim ZhuangTai(23, 23) As Long
Private Type ShenTi
F As Long
X As Long
Y As Long
End Type

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim C As Long
If KeyCode = 27 Then End
If KeyCode = 32 Then
If Timer1.Enabled = True Then
Timer1.Enabled = False
Label1.Visible = True
Else
Timer1.Enabled = True
Label1.Visible = False
End If
End If
C = UBound(She)
If GFangXiang = True Then Exit Sub
Select Case KeyCode
Case 37
If She(C).F = 2 Then Exit Sub
She(C).F = 0
GFangXiang = True
Case 38
If She(C).F = 3 Then Exit Sub
She(C).F = 1
GFangXiang = True
Case 39
If She(C).F = 0 Then Exit Sub
She(C).F = 2
GFangXiang = True
Case 40
If She(C).F = 1 Then Exit Sub
She(C).F = 3
GFangXiang = True
End Select
End Sub

Private Sub Form_Load()
Me.AutoRedraw = True
Me.BackColor = HC000
Me.FillColor = 255
Me.FillStyle = 0
Me.ScaleWidth = 24
Me.ScaleHeight = 24
Me.WindowState = 2
Set Timer1 = Controls.Add(;VB.Timer;, ;Timer1;)
Set Label1 = Controls.Add(;VB.Label;, ;Label1;)
Label1.AutoSize = True
Label1.BackStyle = 0
Label1 = ;暫停;
Label1.ForeColor = RGB(255, 255, 0)
Label1.FontSize = 50
ChuShiHua
End Sub

Private Sub Form_Resize()
On Error GoTo 1:
With Me
If .WindowState lt;; 1 Then
.Cls
.ScaleMode = 3
HWB = .ScaleHeight / .ScaleWidth
.ScaleWidth = 24
.ScaleHeight = 24
Label1.Move (Me.ScaleWidth - Label1.Width) / 2, (Me.ScaleHeight - Label1.Height) / 2
HuaTu
Me.Line (X, Y)-(X + 1, Y + 1), RGB(255, 255, 0), BF
End If
End With
1:
End Sub

Private Sub Timer1_Timer()
Dim C As Long, I As Long
On Error GoTo 2:
QingChu
C = UBound(She)
Select Case She(C).F
Case 0
If ZhuangTai(She(C).X - 1, She(C).Y) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X - 1
She(C).Y = She(C - 1).Y
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X - 1, She(C).Y) = 1 Then
GoTo 2:
End If
Case 1
If ZhuangTai(She(C).X, She(C).Y - 1) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X
She(C).Y = She(C - 1).Y - 1
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X, She(C).Y - 1) = 1 Then
GoTo 2:
End If
Case 2
If ZhuangTai(She(C).X + 1, She(C).Y) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X + 1
She(C).Y = She(C - 1).Y
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X + 1, She(C).Y) = 1 Then
GoTo 2:
End If
Case 3
If ZhuangTai(She(C).X, She(C).Y + 1) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X
She(C).Y = She(C - 1).Y + 1
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X, She(C).Y + 1) = 1 Then
GoTo 2:
End If
End Select
ZhuangTai(She(0).X, She(0).Y) = 0
For I = 0 To C
Select Case She(I).F
Case 0
She(I).X = She(I).X - 1
Case 1
She(I).Y = She(I).Y - 1
Case 2
She(I).X = She(I).X + 1
Case 3
She(I).Y = She(I).Y + 1
End Select
Next
TiaoZheng
1:
GFangXiang = False
ZhuangTai(She(C).X, She(C).Y) = 1
HuaTu
Exit Sub
2:
If MsgBox(;游戲結束,點「是」重新開始游戲,點「否」;, vbYesNo, ;貪吃蛇;) = vbYes Then
ChuShiHua
Else
End
End If
End Sub

Private Sub ChuShiHua()
Me.Cls
Timer1.Enabled = True
Timer1.Interval = 200
Erase ZhuangTai
ReDim She(2)
She(0).F = 2
She(0).X = 9
She(0).Y = 11
ZhuangTai(9, 11) = 1
She(1).F = 2
She(1).X = 10
She(1).Y = 11
ZhuangTai(10, 11) = 1
She(2).F = 2
She(2).X = 11
She(2).Y = 11
ZhuangTai(11, 11) = 1
HuaTu
ChanShengShiWu
End Sub

Private Sub QingChu()
Dim I As Long
For I = 0 To UBound(She)
Me.Line (She(I).X, She(I).Y)-(She(I).X + 1, She(I).Y + 1), Me.BackColor, BF
Next
End Sub

Private Sub HuaTu()
Dim I As Long
For I = 0 To UBound(She)
Me.Circle (She(I).X + 0.5, She(I).Y + 0.5), 0.49, RGB(255, 255, 0), , , HWB
Next
End Sub

Private Sub TiaoZheng()
Dim I As Long
For I = 0 To UBound(She) - 1
She(I).F = She(I + 1).F
Next
End Sub

Private Sub ChanShengShiWu()
Randomize Timer
1:
X = Int(Rnd * 24)
Y = Int(Rnd * 24)
If ZhuangTai(X, Y) ; 0 Then GoTo 1:
ZhuangTai(X, Y) = 2
Me.Line (X, Y)-(X + 1, Y + 1), RGB(255, 255, 0), BF
End Sub

應該就是這個了

2. 怎麼自己做個小游戲

是這樣的:如果想 創個游戲,需一批昂多的資金。再弄 個公司,後來招聘人來工作,再買一些需要買的東西。弄的好會有其它公司的資金加入您的游戲。這些問題所以要長大了才能解決。 LZ,把分數給我吧!【純屬自己打字打的】

3. windows里的sc命令怎麼用

SC命令詳解(一個很有用的command)
作為一個命令行工具,SC.exe可以用來測試你自己的系統,你可以設置一個批處理文件來使用不同的參數調用 SC.exe來控制服務。
一.SC使用這樣的語法:
1. SC [Servername] command Servicename [Optionname= Optionvalues]
2. SC [command]
這里使用第一種語法使用SC,使用第二種語法顯示幫助。
下面介紹各種參數。
Servername
可選擇:可以使用雙斜線,如\\myserver,也可以是\\192.168.1.223來操作遠程計算機。如果在本地計算機上操作
就不用添加任何參數。
Command
下面列出SC可以使用的命令。
config----改變一個服務的配置。(長久的)
continue--對一個服務送出一個繼續控制的要求。
control----對一個服務送出一個控制。
create----創建一個服務。(增加到注冊表中)
delete----刪除一個服務。(從注冊表中刪除)
EnumDepend--列舉服務的從屬關系。
GetDisplayName--獲得一個服務的顯示名稱。
GetKeyName--獲得一個服務的服務鍵名。
interrogate--對一個服務送出一個詢問控制要求。
pause----對一個服務送出一個暫停控制要求。
qc----詢問一個服務的配置。
query----詢問一個服務的狀態,也可以列舉服務的狀態類型。
start----啟動一個服務。
stop----對一個服務送出一個停止的要求。
Servicename
在注冊表中為service key制定的名稱。注意這個名稱是不同於顯示名稱的(這個名稱可以用net start和服務控
制面板看到),而SC是使用服務鍵名來鑒別服務的。
Optionname
這個optionname和optionvalues參數允許你指定操作命令參數的名稱和數值。注意,這一點很重要在操作名稱和等
號之間是沒有空格的。一開始我不知道,結果………………,比如,start= optionvalues,這個很重要。
optionvalues可以是0,1,或者是更多的操作參數名稱和數值對。
如果你想要看每個命令的可以用的optionvalues,你可以使用sc command這樣的格式。這會為你提供詳細的幫助。
Optionvalues
為optionname的參數的名稱指定它的數值。有效數值范圍常常限制於哪一個參數的optionname。如果要列表請用
sc command來詢問每個命令。
Comments
很多的命令需要管理員許可權,所以我想說,在你操作這些東西的時候最好是管理員。呵呵!
當你鍵入SC而不帶任何參數時,SC.exe會顯示幫助信息和可用的命令。當你鍵入SC緊跟著命令名稱時,你可以得
到一個有關這個命令的詳細列表。比如,鍵入sc create可以得到和create有關的列表。
但是除了一個命令,sc query,這會導出該系統中當前正在運行的所有服務和驅動程序的狀態。
當你使用start命令時,你可以傳遞一些參數(arguments)給服務的主函數,但是不是給服務進程的主函數。
二.SC create
這個命令可以在注冊表和服務控制管理資料庫建立一個入口。
語法1
sc [servername] create Servicename [Optionname= Optionvalues]
這里的servername,servicename,optionname,optionvalues和上面的一樣,這里就不多說了。這里我們詳細說
明一下optionname和optionvalues。
Optionname--Optionvalues
描述
type=----own, share, interact, kernel, filesys
關於建立服務的類型,選項值包括驅動程序使用的類型,默認是share。
start=----boot, sys tem, auto, demand, disabled
關於啟動服務的類型,選項值包括驅動程序使用的類型,默認是demand(手動)。
error=----normal, severe, critical, ignore
當服務在導入失敗錯誤的嚴重性,默認是normal。
binPath=--(string)
服務二進制文件的路徑名,這里沒有默認值,這個字元串是必須設置的。
group=----(string)
這個服務屬於的組,這個組的列表保存在注冊表中的ServiceGroupOrder下。默認是nothing。
tag=----(string)
如果這個字元串被設置為yes,sc可以從CreateService call中得到一個tagId。然而,SC並不顯示這個標簽,所
以使用這個沒有多少意義。默認是nothing
depend=----(space separated string)有空格的字元串。
在這個服務啟動前必須啟動的服務的名稱或者是組。
obj=----(string)
賬號運行使用的名稱,也可以說是登陸身份。默認是localsys tem
Displayname=--(string)
一個為在用戶界面程序中鑒別各個服務使用的字元串。
password=--(string)
一個密碼,如果一個不同於localsystem的賬號使用時需要使用這個。
Optionvalues
Optionname參數名稱的數值列表。參考optionname。當我們輸入一個字元串時,如果輸入一個空的引用這意味著
一個空的字元串將被導入。
Comments
The SC CREATE command perFORMs the operations of the CreateService API function.
這個sc create命令執行CreateService API函數的操作。詳細請見CreateService。
例子1
下面這個例子在計算機上建立叫「mirror」的服務建立的一個注冊表登記,是自動運行服務,從屬於TDI組和NetBios服務。
C:\WINDOWS\system32>sc create mirror binPath= "D:\Ftp\新建文件夾\mirror.exe" type= own start= auto
[SC] CreateService SUCCESS
重啟後生效
例子2 刪除Mirror服務
C:\WINDOWS\system32>sc delete mirror binPath= "D:\Ftp\新建文件夾\mirror.exe" type= own start= auto
[SC] DeleteService SUCCESS
三. SC QC
這個SC QC「詢問配置」命令可以列出一個服務的配置信息和QUERY_SERVICE_CONFIG結構。
語法1
sc [Servername] qc Servicename [Buffersize]
Parameters
servername和servicename前面已經介紹過了,這里不再多說。
Buffersize,可選擇的,列出緩沖區的尺寸。
Comments
SC QC命令顯示了QUERY_SERVICE_CONFIG結構的內容。
以下是QUERY_SERVICE_CONFIG相應的區域。
TYPE------dwServiceType
START_TYPE----dwStartType
ERROR_CONTROL----dwErrorControl
BINARY_PATH_NAME--lpBinaryPathName
LOAD_ORDER_GROUP--lpLoadOrderGroup
TAG------dwTagId
DISPLAY_NAME----lpDisplayName
DEPENDENCIES----lpDependencies
SERVICE_START_NAME--lpServiceStartName
例1
下面這個例子詢問了在上面例子中建立的「mirror」服務的配置:
sc qc
sc顯示下面的信息:
SERVICE_NAME: mirror
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : D:\Ftp\
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : mirror
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
mirror有能力和其他的服務共享一個進程。這個服務 不依靠與其它的的服務,而且運行在lcoalsystem的安全上下關系中。這些都是調用QueryServiceStatus基本的返回,如果還需要更多的細節屆時,可以看看API函數文件。 mirror
四.SC QUERY
SC QUERY命令可以獲得服務的信息。
語法:
sc [Servername] query { Servicename | ptionname= Optionvalues... }
參數:
servername, servicename, optionname, optionvalues不在解釋。只談一下這個命令提供的數值。
Optionname--Optionvalues
Description
type=----driver, service, all
列舉服務的類型,默認是service
state=----active, inactive, all
列舉服務的狀態,默認是active
bufsize=--(numeric values)
列舉緩沖區的尺寸,默認是1024 bytes
ri=----(numeric values)
但開始列舉時,恢復指針的數字,默認是0
Optionvalues
同上。
Comments
SC QUERY命令可以顯示SERVICE_STATUS結構的內容。
下面是SERVICE_STATUS結構相應的信息:
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN32_EXIT_CODE----dwWin32ExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint
在啟動計算機後,使用SC QUERY命令會告訴你是否,或者不是一個啟動服務的嘗試。如果這個服務成功啟動,WIN32_EXIT_CODE區間會將會包含一個0,當嘗試不成功時,當它意識到這個服務不能夠啟動時,這個區間也會提供一個退出碼給服務。
例子
查詢「mirror'服務狀態,鍵入:
sc query mirror
顯示一下信息:
SERVICE_NAME: mirror
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
注意,這里存在一個給這個服務的退出碼,即使這個服務部不在運行,鍵入net helpmsg 1077,將會得到對1077錯誤信息的說明:
上次啟動之後,仍未嘗試引導服務。
所以,這里我想說一句,希望大家可以活用net helpmsg,這會對你的學習有很大的幫助。
下面在對SC query的命令在說明一下:
列舉活動服務和驅動程序狀態,使用以下命令:
sc query
顯示messenger服務,使用以下命令:
sc query messenger
只列舉活動的驅動程序,使用以下命令:
sc query type= driver
列舉Win32服務,使用以下命令:
sc query type= service
列舉所有的服務和驅動程序,使用以下命令:
sc query state= all
用50 byte的緩沖區來進行列舉,使用以下命令:
sc query bufsize= 50
在恢復列舉時使用index=14,使用以下命令:
sc query ri=14
列舉所有的互動式服務,使用以下命令:
sc query type= service type= interact
五、sc命令啟動已經禁用的服務,例如:啟動telnet服務
sc config tlntsvr start= auto
net start tlntsvr

4. scratch怎樣用隱藏和顯示來做游戲

用的話和呃,收藏游戲是可以進行收藏起來的,把它直接收藏就可以了

5. sc.exe是個什麼程序

是應用程序

sc - sc.exe - 進程信息
進程文件:sc 或者 sc.exe
進程名稱:A tool to aid in developing services for WindowsNT
描述:
SC.exe 檢索和設置有關服務的控制信息。可以使用 SC.exe 來測試和調試服務程序。可以設置存儲在注冊表中的服務屬性來控制如何在啟動時和作為後台程序運行時啟動服務應用程序
出品者: Microsoft Corporation
屬 於:Microsoft® Windows® Operating System.
文件版本:5.1.2600.0 (xpclient.010817-1148)
系統進程: 否
後台程序: 是
使用網路: 是
硬體相關: 否
常見錯誤: 未知N/A
內存使用: 未知N/A
安全等級 (0-5): 2
間諜軟體: 否
Adware: 否
廣告軟體: 否
木馬: 否
如果版本號和出品人不正確有可能是病毒!

6. 空之軌跡SC的代碼怎樣使用

網上有個空之軌跡sc修改器,漆黑之牙版本的!很不錯,所有物品都能修改,人物等級也可以,建議你去下載個,比用代碼修改簡單,方便!

7. 用VB怎麼做一個小游戲啊

下面是個程序!希望有用

'定義蛇的運動速度枚舉值
Private Enum tpsSpeed
QUICKLY = 0
SLOWLY = 1
End Enum

'定義蛇的運動方向枚舉值
Private Enum tpsDirection
D_UP = 38
D_DOWN = 40
D_LEFT = 37
D_RIGHT = 39
End Enum

'定義運動區域4個禁區的枚舉值
Private Enum tpsForbiddenZone
FZ_TOP = 30
FZ_BOTTOM = 5330
FZ_LEFT = 30
FZ_RIGHT = 5730
End Enum

'定義蛇頭及身體初始化數枚舉值
Private Enum tpsSnake
SNAKEONE = 1
SNAKETWO = 2
SNAKETHREE = 3
SNAKEFOUR = 4
End Enum

'定義蛇寬度的常量
Private Const SNAKEWIDTH As Integer = 100

'該過程用於顯示游戲信息
Private Sub Form_Load()
Me.Show
Me.lblTitle = "BS貪食蛇 — (版本 " & App.Major & "." & App.Minor & "." & App.Revision & ")"
Me.Caption = Me.lblTitle.Caption
frmSplash.Show 1
End Sub

'該過程用於使窗體恢復原始大小
Private Sub Form_Resize()
If Me.WindowState <> 1 Then
Me.Caption = ""
Me.Height = 6405 '窗體高度為 6405 緹
Me.Width = 8535 '窗體寬度為 8535 緹
Me.Left = (Screen.Width - Width) \ 2
Me.Top = (Screen.Height - Height) \ 2
End If
End Sub

'該過程用於重新開始開始游戲
Private Sub cmdGameStart_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
msg = MsgBox("您確認要重新開始游戲嗎?", 4 + 32, "BS貪食蛇")
If msg = 6 Then Call m_subGameInitialize
End Sub

'該過程用於暫停/運行游戲
Private Sub chkPause_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Me.chkPause.Caption = "暫停游戲(&P)" Then
Me.tmrSnakeMove.Enabled = False
Me.tmrGameTime.Enabled = False
Me.picMoveArea.Enabled = False
Me.lblPauseLab.Visible = True
Me.chkPause.Caption = "繼續游戲(&R)"
Else
Me.tmrSnakeMove.Enabled = True
Me.tmrGameTime.Enabled = True
Me.picMoveArea.Enabled = True
Me.lblPauseLab.Visible = False
Me.chkPause.Caption = "暫停游戲(&P)"
End If
End Sub

'該過程用於顯示游戲規則
Private Sub cmdGameRules_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
MsgBox " BS貪食蛇:一個規則最簡單的趣味游戲,您將用鍵盤" & Chr(13) & _
"上的4個方向鍵來控制蛇的運動方向。在運動過程中蛇" & Chr(13) & _
"不能後退,蛇的頭部也不能接觸到運動區域的邊線以外" & Chr(13) & _
"和蛇自己的身體,否則就游戲失敗。在吃掉隨機出現的" & Chr(13) & _
"果子後,蛇的身體會變長,越長難度越大。祝您好運!!", 0 + 64, "游戲規則"
End Sub

'該過程用於顯示游戲開發信息
Private Sub cmdAbout_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
MsgBox "BS貪食蛇" & "(V-" & App.Major & "." & App.Minor & "版本)" & Chr(13) & Chr(13) & _
"" & Chr(13) & Chr(13) & _
"由PigheadPrince設計製作" & Chr(13) & _
"CopyRight(C)2002,BestSoft.TCG", 0, "關於本游戲"
End Sub

'該過程用於退出遊戲
Private Sub cmdExit_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
msg = MsgBox("您要退出本游戲嗎?", 4 + 32, "BS貪食蛇")
Select Case msg
Case 6
End
Case 7
Me.chkWindowButton(2).Value = 0
Exit Sub
End Select
End Sub

'該過程用於拖動窗體_(點擊圖標)
Private Sub imgWindowTop_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Sub

'該共用過程用於處理窗體控制按鈕組的相關操作_(鎖定、最小化、退出)
Private Sub chkWindowButton_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button <> 1 Then Exit Sub
Select Case Index
Case 0 '鎖定窗體
If Me.chkWindowButton(0).Value = 1 Then
Me.imgWindowTop.BorderStyle = 0
Me.imgWindowTop.Enabled = False
Else
Me.imgWindowTop.BorderStyle = 1
Me.imgWindowTop.Enabled = True
End If
Case 1 '最小化
Me.WindowState = 1
Me.chkWindowButton(1).Value = 0
Me.Caption = "BS貪食蛇 — (V-" & App.Major & "." & App.Minor & "版本)"
Case 2 '退出
Beep
msg = MsgBox("您要退出本游戲嗎?", 4 + 32, "BS貪食蛇")
Select Case msg
Case 6
End
Case 7
Me.chkWindowButton(2).Value = 0
Exit Sub
End Select
End Select
End Sub

'該過程用於設置蛇運動速度的快慢
Private Sub hsbGameSpeed_Change()
Me.tmrSnakeMove.Interval = Me.hsbGameSpeed.Value
End Sub

'該過程用於通過鍵盤的方向鍵改變蛇的運動方向
Private Sub picMoveArea_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case g_intDirection
Case D_UP
If KeyCode = D_DOWN Then Exit Sub
Case D_DOWN
If KeyCode = D_UP Then Exit Sub
Case D_LEFT
If KeyCode = D_RIGHT Then Exit Sub
Case D_RIGHT
If KeyCode = D_LEFT Then Exit Sub
End Select
g_intDirection = KeyCode
End Sub

'該計時循環過程用於計算游戲耗費的秒數並顯示
Private Sub tmrGameTime_Timer()
g_lngGameTime = g_lngGameTime + 1
Me.lblGameTime.Caption = g_lngGameTime & "秒"
End Sub

'該計時循環過程用於控制蛇的行動軌跡
Private Sub tmrSnakeMove_Timer()
Dim lngSnakeX As Long, lngSnakeY As Long, lngSnakeColor As Long
Dim lngPointX As Long, lngPointY As Long, lngPointColor As Long
Randomize
Me.picMoveArea.SetFocus
Me.picMoveArea.Cls
'確認蛇頭的運動方向並獲取新的位置
Select Case g_intDirection
Case D_UP '向上運動
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_CurY - SNAKEWIDTH
Case D_DOWN '向下運動
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_CurY + SNAKEWIDTH
Case D_LEFT '向左運動
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_CurX - SNAKEWIDTH
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
Case D_RIGHT '向右運動
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_CurX + SNAKEWIDTH
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
End Select
'根據新的位置繪制蛇頭
lngSnakeX = g_udtSnake(SNAKEONE).Snake_CurX
lngSnakeY = g_udtSnake(SNAKEONE).Snake_CurY
lngSnakeColor = g_udtSnake(SNAKEONE).Snake_Color
Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor
'移動蛇身體其他部分的位置
For i = 2 To g_intSnakeLength
g_udtSnake(i).Snake_CurX = g_udtSnake(i - 1).Snake_OldX
g_udtSnake(i).Snake_CurY = g_udtSnake(i - 1).Snake_OldY
lngSnakeX = g_udtSnake(i).Snake_CurX
lngSnakeY = g_udtSnake(i).Snake_CurY
lngSnakeColor = g_udtSnake(i).Snake_Color
Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor
Next i
'更新蛇舊的坐標位置
For j = 1 To g_intSnakeLength
g_udtSnake(j).Snake_OldX = g_udtSnake(j).Snake_CurX
g_udtSnake(j).Snake_OldY = g_udtSnake(j).Snake_CurY
Next j
'判斷蛇在移動中是否到了禁區而導致游戲失敗
If m_funMoveForbiddenZone(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then
Beep
MsgBox "您的蛇移動到了禁區,游戲失敗!", 0 + 16, "BS貪食蛇"
Me.tmrSnakeMove.Enabled = False
Me.tmrGameTime.Enabled = False
Me.picMoveArea.Visible = False
Exit Sub
End If
'判斷蛇在移動中是否碰到了自己的身體而導致游戲失敗
If m_funTouchSnakeBody(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then
Beep
MsgBox "您的蛇在移動中碰到了自己的身體,游戲失敗!", 0 + 16, "BS貪食蛇"
Me.tmrSnakeMove.Enabled = False
Me.tmrGameTime.Enabled = False
Me.picMoveArea.Visible = False
Exit Sub
End If
'判斷蛇是否吃到了果子
If m_funEatPoint(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then
'累加玩家的得分並刷新得分顯示
g_intPlayerScore = g_intPlayerScore + 1
Me.lblYourScore.Caption = g_intPlayerScore & "分"
Call m_subAddSnake '加長蛇的身體
Call m_subGetPoint '獲取下一個果子的位置和顏色
Else
'繪制果子
lngPointX = g_udtPoint.Point_X
lngPointY = g_udtPoint.Point_Y
lngPointColor = g_udtPoint.Point_Color
Me.picMoveArea.PSet (lngPointX, lngPointY), lngPointColor
End If
End Sub

'該私有子過程用於初始化游戲
Private Sub m_subGameInitialize()
Erase g_udtSnake '清空蛇的結構數組
g_intPlayerScore = 0 '清空玩家的得分
g_lngGameTime = 0 '清空游戲耗費的秒數
g_intDirection = D_DOWN '設定蛇的初始運動方向為下
g_intSnakeLength = 4 '設定蛇的初始長度
ReDim g_udtSnake(1 To g_intSnakeLength) '重新定義蛇的長度
'定義蛇頭部的數據
With g_udtSnake(SNAKEONE)
.Snake_OldX = 530
.Snake_OldY = 530
.Snake_Color = vbBlack
End With
'定義蛇身第2節的數據
With g_udtSnake(SNAKETWO)
.Snake_OldX = 530
.Snake_OldY = 430
.Snake_Color = vbGreen
End With
'定義蛇身第3節的數據
With g_udtSnake(SNAKETHREE)
.Snake_OldX = 530
.Snake_OldY = 330
.Snake_Color = vbYellow
End With
'定義蛇身第4節的數據
With g_udtSnake(SNAKEFOUR)
.Snake_OldX = 530
.Snake_OldY = 230
.Snake_Color = vbRed
End With
Me.picMoveArea.Visible = True
Me.lblYourScore.Caption = g_intPlayerScore & "分"
Me.lblGameTime.Caption = g_lngGameTime & "秒"
Me.tmrSnakeMove.Interval = Me.hsbGameSpeed.Value
Me.tmrSnakeMove.Enabled = True
Me.tmrGameTime.Enabled = True
Call m_subGetPoint '獲取第一個果子的位置和顏色
End Sub

'該私有子過程用於返回獲取的果子的位置和顏色信息
Private Sub m_subGetPoint()
Dim lngRedValue As Long, lngGreenValue As Long, lngBlueValue As Long
Dim lngPointX As Long, lngPointY As Long, lngPointColor As Long
'隨機獲取果子的顏色
lngRedValue = Int((255 - 0 + 1) * Rnd + 0)
lngGreenValue = Int((255 - 0 + 1) * Rnd + 0)
lngBlueValue = Int((255 - 0 + 1) * Rnd + 0)
lngPointColor = RGB(lngRedValue, lngGreenValue, lngBlueValue)
'隨機獲取果子的位置
lngPointX = Int((FZ_LEFT - FZ_RIGHT + 1) * Rnd + FZ_RIGHT)
lngPointY = Int((FZ_TOP - FZ_BOTTOM + 1) * Rnd + FZ_BOTTOM)
Me.PSet (lngPointX, lngPointY), lngPointColor
'設置函數返回值
With g_udtPoint
.Point_X = lngPointX
.Point_Y = lngPointY
.Point_Color = lngPointColor
End With
End Sub

'該私有子過程用於加長蛇的身體
Private Sub m_subAddSnake()
Dim udtSnakeTemp() As Snake
Dim lngSnakeX As Long, lngSnakeY As Long, lngSnakeColor As Long
'備份蛇原先身體的數據並使蛇的身體加長
ReDim udtSnakeTemp(1 To g_intSnakeLength)
For k = 1 To g_intSnakeLength
With udtSnakeTemp(k)
.Snake_CurX = g_udtSnake(k).Snake_CurX
.Snake_CurY = g_udtSnake(k).Snake_CurY
.Snake_OldX = g_udtSnake(k).Snake_OldX
.Snake_OldY = g_udtSnake(k).Snake_OldY
.Snake_Color = g_udtSnake(k).Snake_Color
End With
Next k
g_intSnakeLength = g_intSnakeLength + 1
ReDim g_udtSnake(g_intSnakeLength)
'將備份蛇身體的數據返回到加長的蛇身數組中
For l = 1 To g_intSnakeLength - 1
With g_udtSnake(l)
.Snake_CurX = udtSnakeTemp(l).Snake_CurX
.Snake_CurY = udtSnakeTemp(l).Snake_CurY
.Snake_OldX = udtSnakeTemp(l).Snake_OldX
.Snake_OldY = udtSnakeTemp(l).Snake_OldY
.Snake_Color = udtSnakeTemp(l).Snake_Color
End With
Next l
'寫入新加入的身體數據
Select Case g_intDirection
Case D_UP
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX + SNAKEWIDTH
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY
.Snake_Color = g_udtPoint.Point_Color
End With
Case D_DOWN
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX - SNAKEWIDTH
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY
.Snake_Color = g_udtPoint.Point_Color
End With
Case D_LEFT
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY + SNAKEWIDTH
.Snake_Color = g_udtPoint.Point_Color
End With
Case D_RIGHT
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY - SNAKEWIDTH
.Snake_Color = g_udtPoint.Point_Color
End With
End Select
lngSnakeX = g_udtSnake(g_intSnakeLength).Snake_CurX
lngSnakeY = g_udtSnake(g_intSnakeLength).Snake_CurY
lngSnakeColor = g_udtSnake(g_intSnakeLength).Snake_Color
Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor
End Sub

'該自定義函數用於返回運動的蛇是否到達禁區而導致游戲失敗
Private Function m_funMoveForbiddenZone(SnakeX As Long, SnakeY As Long) As Boolean
If (SnakeX >= FZ_LEFT And SnakeX <= FZ_RIGHT) And (SnakeY >= FZ_TOP And SnakeY <= FZ_BOTTOM) Then
m_funMoveForbiddenZone = False
Else
m_funMoveForbiddenZone = True
End If
End Function

'該自定義函數用於返回運動的蛇是否碰到自己的身體而導致游戲失敗
Private Function m_funTouchSnakeBody(SnakeX As Long, SnakeY As Long) As Boolean
For m = 2 To g_intSnakeLength
If SnakeX = g_udtSnake(m).Snake_CurX And SnakeY = g_udtSnake(m).Snake_CurY Then
m_funTouchSnakeBody = True
Exit For
Else
m_funTouchSnakeBody = False
End If
Next m
End Function

'該自定義函數用於返回運動的蛇是否吃到了果子
Private Function m_funEatPoint(SnakeX As Long, SnakeY As Long) As Boolean
If Abs(SnakeX - g_udtPoint.Point_X) <= SNAKEWIDTH And Abs(SnakeY - g_udtPoint.Point_Y) <= SNAKEWIDTH Then
m_funEatPoint = True
Else
m_funEatPoint = False
End If
End Function

'(API函數調用過程_用以實現無標題窗體的拖動操作)---------------------------------

'RleaseCapture函數用以釋放滑鼠捕獲
Public Declare Function ReleaseCapture Lib "user32" () As Long

'SendMessage函數用作向Windows發送移動窗體的消息
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As _
Long, ByVal wMsg As Long, ByVal wParam As Long, IParam As Any) As Long

Public Const WM_SYSCOMMAND = &H112 '聲明向Windows發送消息的常量
Public Const SC_MOVE = &HF012 '聲明控制移動窗體常量

'(游戲變數聲明部分)-------------------------------------------------------------

'定義蛇的數據類型結構
Public Type Snake
Snake_OldX As Long
Snake_OldY As Long
Snake_CurX As Long
Snake_CurY As Long
Snake_Color As Long
End Type

'定義果子的數據類型結構
Public Type Point
Point_X As Long
Point_Y As Long
Point_Color As Long
End Type

'定義蛇的動態數組
Public g_udtSnake() As Snake

'定義果子
Public g_udtPoint As Point

'定義蛇的長度
Public g_intSnakeLength As Integer

'定義蛇的顏色
Public g_lngSnakeColor As Long

'定義蛇的運動方向
Public g_intDirection As Integer

'定義玩家的得分
Public g_intPlayerScore As Integer

'定義游戲耗費的秒數
Public g_lngGameTime As Long

8. 如何用VC做個簡單小程序(詳見問題)

您好!
雖然有點多,但對您總是有好處的,看得越多,好處也越多。呵呵

C++語言相對於C語言來說引入了兩個大的新東西,一個就是面向對象(具體來將就是類
),另外就是模板技術(模板編程或者叫泛型編程是進來非常流行的技術,在C#中雖然還
沒有對泛型編程的支持,但是相信在將來也一定會加入這一功能),模板是C++中比較復
雜的部分,但是作為一個真正的C++程序員,這部分很重要。尤其是對C++標准程序庫
的掌握尤為重要。
剛開始的時候千萬不要直撲VC中的各種向導和設計器。因為依賴開發環境生成的很多代碼
會把我們搞糊塗,也不利於我們學習C++語言本身。我的建議就是生成一個空的控制台工
程,然後自己向裡面添加文件。
如下就是一個簡單的控制台程序:
//robindy/list.cpp

#i nclude
#i nclude

using namespace std;

int main()
{
list coll;

for(char c = 'a'; c <= 'z'; ++c)
{
coll.push_back(c);
}

list::const_iterator pos;
for(pos = coll.begin(); pos != coll.end(); ++pos)
{
cout << *pos << ' ';
}
cout << endl;

return 0;
}

對using namespace std;的解釋:
所謂namespace,是指標識符的各種可見范圍。C++標准程序庫中的所有標識符都被定義於一個名為std的namespace中。
由於namespace的概念,使用C++標准程序庫的任何標識符時,可以有三種選擇:
1、直接指定標識符。例如std::ostream而不是ostream。完整語句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using關鍵字。
using std::cout;
using std::endl;
以上程序可以寫成
cout << std::hex <<3.4 << endl;
3、最方便的就是使用using namespace std;這樣命名空間std內定義的所有標識符都有效(曝光)。就好像它們被聲明為全局變數一樣。那麼以上語句可以如下寫:
cout << hex << 3.4 << endl;

這段程序用到了標准模板庫,在屏幕上列印字元a~z,其中main函數的標記式只有兩種是被
C++標准委員會接受的,只有以下兩種寫法是符合C++標準的,是可移植的。即:
int main()
{
}

int main(int argc, char* argv[])
{
}
C++在main()的末尾定義了一個隱式的return 0; 但是在VC中必須顯式的寫出return語句。
在BCB中可以不寫return而編譯通過。
這段程序中用到了STL中的容器:鏈表。先是向鏈表中插入26個字母,然後從遍歷鏈表,輸
出字元。
我不建議初學者一開始就從模板庫入手,但是我建議應該逐漸地有意識地學習模板庫。如
我們應該熟悉cout和cin的用法(位於iostream),而減少使用老式的C函數庫中printf和sc
anf等。

從控制台入手的好處就是避免我們理解VC中向導等工具生成的其他代碼,整個程序的流程
很清楚。新手學習VC的一大難點就是搞不清楚整個程序的流程(從那條語句開始執行,然後
從那條語句退出。MFC做了太多封裝,掩蓋了事實的真相,^_^)。通過控制台我們可以很快
地學習C++語言中的很多新特性。如類的封裝、繼承和多態等。通過這個時期的學習,要
能夠掌握三個東西: C++關鍵字、語法(重點是和面向對象有關的,以及模板)、C++
標准程序庫(知道怎麼使用即可,要徹底掌握需要很多時間和精力)。至於與界面有關的
東東(MFC中很大一部分是與界面相關的類,所以我認為MFC很臃腫而無聊!回頭看過以前
用MFC寫的程序,有一種「垃圾」的感覺。)
自己做個測試:
寫一個控制台程序,在其中體現出類的繼承,函數重載,動態多態(通過虛函數實現),
數據封裝,C++標准庫的運用。
如果你能夠輕松搞定,恭喜你,你已經通過C++語言關了。不過C++實在是一個復雜的
東東,其中有各種千奇百怪的語法現象,如果沒有三、五年的功力,千萬不要說自己懂C+
+。^_^。
推薦書籍《Thinking in C++》(有精力的話,可以直接讀原版)
《Essential C++》

本來我計劃繼續說說如何來進入C++世界的,但是琢磨了一下,覺得還是要先解決一個問
題:為什麼要學習C++?我覺得在軟體開發這個行當了里除了為了生計外,學習新東西都
是應該以興趣為導向的。所以撇開我個人對C++的偏愛,我想為你樹立起學習C++的信
心和興趣。當初我對自己學習C++的第一個忠告就是:不能半途而廢!起初是興趣驅動,
後來則是生計所需,最後還是回歸到了興趣。畢竟我從中得到了樂趣,這就足夠了。在學
一個新東西前,解決動機問題很重要。就如同殺人一樣,如果只是突然興起,那麼等嘗試
了以後,是沒有成就感的。革命先烈們為我們作出了很好的榜樣,就算我們在學習C++的
道路上遇到了太多困惑和痛苦,但是我們畢竟為自己的信念做了努力,我們知道自己在
做什麼,知道自己在追求什麼。

C++適合做什麼樣的開發?
C++是一門廣泛用於工業軟體研發的大型語言。具有很高的復雜性和解決問題的能力。C
++不僅在開發上極具價值,同時在學術界也就有很高的價值。有關C++的文章應該可以
用浩如煙海來形容了吧。C++的世界級經典書籍也是數不勝數。然而,目前開發語言是如
此地繁榮,就連微軟也在推出了新的開發語言C#。一個不可否認的現實是,在低階程序設
計領域,C++擠壓著C同時也在承受著C的強烈反彈,前段時間看了據說是微軟操作系統源代
碼的東東,其中很多還是C語言。而在高階程序設計領域,Java和C#正在不斷蠶食著C++的
地盤。也許Java和C#的狂潮終將迫使C++回歸本位— 回到它有著根本性優勢的開發領域:
低級系統程序設計、高級大規模高性能應用設計、嵌入式程序設計、通用程序設計以及數
值科學計算等。果真如此,我認為這未嘗不是一件好事。電力系統軟體所要求的高性能和
大規模數值計算正是C++所擅長的。就我所接觸的南瑞和魯能,很多涉及到電力系統計算
的軟體如PAS等,都是用C++來開發的。在電力系統軟體開發這塊陣地,C++大有用武之
地。C++吸引如此之多的智力投入,以至於這個領域的優秀作品,包括重量級的軟體產品、
程序庫以及書籍等,數不勝數。在C++之父Bjarne Stroustrup的個人主頁上,有一頁
列出了一些(全部或大部分)使用C++編寫的系統、應用程序和庫。
下面是一些例子(摘自榮耀網站):
o Adobe Systems:所有主要應用程序都使用C++開發而成,比如Photoshop & ImageReady
、Illustrator和Acrobat等。
o Maya:知道「蜘蛛人」、「指環王」的電腦特技是使用什麼軟體做出來的嗎?沒錯,就
是Maya。
o Amazon.com:使用C++開發大型電子商務軟體。
o Apple:部分重要「零件」採用C++編寫而成。
o AT&T:美國最大的電訊技術提供商,主要產品採用C++開發。
o Google:Web搜索引擎採用C++編寫。
o IBM:OS/400。
o Microsoft:以下產品主要採用C++(Visual C++)編寫:
o Windows XP Windows NT:NT4、2000 Windows 9x:95、98、Me Microsoft Office:Wo
rd、Excel、Access、PowerPoint、Outlook Internet Explorer,包括Outlook Express
Visual Studio:Visual C++、Visual Basic、Visual FoxPro .NET Framework類庫採用C
#編寫,但C#編譯器自身則使用C++編寫而成。Exchange SQL Server FrontPage Project
所有游戲......
o KDE:K Desktop Environment(Linux)。
o Symbian OS:最流行的蜂窩電話OS之一。

C++源於C語言,還記得很久以前學習C語言的時光(那是一段快樂而充實的時光),可是
現在學習C++,並不是在C的基礎上加上了類而已,如果這樣認為,我們是耍不好C++的
。因此,C++絕不是C的升級或擴充,我們應該把C++當作一門新語言來學習(C++之
父Bjarne Stroustrup語)。

寫程序首先希望是程序能正確執行,其次是效率能夠被接受,再次就是易於維護。C++是
一個難學易用的語言。C++提供了太多可選擇的東西,而且使用使用C++來寫程序可以
有四種思考模式:基於過程、基於對象、面向對象和泛型。我們使用一種語言來寫程序,
並不意味著就是使用語言本身,換句話說,我們更多的時候是使用程序庫在寫程序。比如
MFC、STL、ATL、VCL等等。其中要使用C++來寫出結構優美、性能卓越、代碼簡潔、易於
維護的代碼,首推C++標准程序庫。STL對效率做了嚴格的要求,而且使用STL寫出來的程
序簡潔美觀(前段時間我特意貼了一個要求對若干整數進行排序的帖子,其實目的就是用來
展示STL的簡潔優雅)。一旦習慣使用泛型思維來考慮問題,我們能夠充分體會到模板帶來的美!
對於數值計算來說,C++標准程序庫可以充分滿足現代化服務和商業計算對數據、信息的即
時回應的要求。

我覺得學好一門語言最重要的就是實踐。也就是多「寫」!「工程經驗之積累」對已具有
一段開發時間的程序員而言,非常重要!只有在不斷的積累中,我們才能漸漸體會到C++
語言中的一些背後的東西。對於這點,沒有大量程序代碼寫作經驗的菜鳥,也可以藉助《
Effective C++》先攢一些經驗值。《Effective C++》是一本好書!。Meyers的書絕對值
得一讀,Meyers可以說當今C++社群中數一數二的技術專家。

推薦網站:
www.royaloo.com

以下文字應該是去年所塗鴉而成,主要是關於動態內存分配的,在這里將其重新看了看
,覺得還是寫得太淺薄了。因為內存是程序運行的「運動場」,對場地的了解程度會直接
影響到我們程序運行的流暢度和穩定性。
C++提供了操作符new來在堆上分配內存,操作符delete來釋放內存。有些情況下,我
們需要對內存的分配和釋放進行更好的控制。許多程序創建和釋放一些重要類的大量的對
象,如tree nodes,linked lists links,points,lines,messages,etc.使用通用的內存分
配器如new和delete來進行這些對象的分配和釋放有時將支配程序的運行時間和內存需求。
兩方面的因素:通用內存分配操作的運行和空間的耗費以及不同對象大小引起的內存碎片
。類使用定製的內存分配器將加快模擬器、編譯器和類似程序的執行速度。
例外一種需要更好的內存控制的情況是:需要在有限資源的情況下長時間不間斷運行
的程序。實時系統經常需要用最少的耗費來獲取有保證的可預期的內存。這也就導致了更
好的內存控制的需要。一般來說,這些程序都避免使用動態的內存分配,而使用特殊目的
的內存分配器來管理有限資源。
此外,還有一些情況下由於硬體或系統的要求,需要將對象放在指定的內存位置。這也
需要進行定製的內存管理(通過重載new來加以實現)。
在C++ Release 2.0中,為了滿足以上需求,內存管理機製做了相應的修改。主要是引
進了operator new [] 和 operator delete []。
new操作符的作用范圍(Scope for operator new Functions)
操作符(Operator) 范圍(Scope)
::operator new Global
class-name::operator new Class
operator new的第一個參數必須是類型size_t(在STDDEF.H中定義的類型),返回類型
為void *。
當分配內建(built-in)類型的對象、未包含用戶自定義的new操作符函數的類對象、任何
類型的數組時,使用全局new操作符函數。當在類中自定義new操作符時,分配該類對象的
內存時,調用該類的new操作符。如下:
#i nclude
#i nclude
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
int main()
{
Blanks *a5 = new( 0xa5 ) Blanks;//創建對象Blanks,並且初試化為0xa5
return a5 != 0;
}
new操作符可以重載,而delete卻不行。因為等到需要釋放的時候,我們所能得到的就
是一個指針。而且該指針可能不是原先的對象類型指針(有可能進行了類型轉換)。實際
上,當使用new獲得一個指向一片內存的指針時,在該片內存前有一個指示器(indicator)
,記錄實際分配的內存數量。當調用delete時,可以獲知需要釋放的內存大小。
數組的釋放(Deallocating Arrays):
void f( )
{
X* p1 = new X[10];
//...
delete [] X;
}
為什麼不使用delete [10] X;來釋放內存?Bjarne Stroustrup稱這種做法容易導致錯
誤,而將記錄元素個數的任務放在delete的實現中了。
至於為什麼C++中未內建垃圾收集器(Garbage Collection)的原因,看《C++語言的設
計和演化》(En) Bjarne Stroustrup 機械工業出版社(俗稱:D&E)可以得到答案。
此外,C++標准庫中提供了一種智能型指針auto_ptr,這種指針可以幫助我們防止「被
異常拋出時發生資源泄漏」。但是缺點是該智能型指針不能指向數組,因為其內部釋放內
存是通過delete而非delete [] 來進行的。所以,只能使用其來指向一個單個對象。

模板部分是C++中比較難的部分,也是C++的魅力所在。以下文字是我以前看過的,具
體出處不清楚了。今天稍微整理了一下,作為模板介紹的一個單元。

為什麼要使用模板

對於除類型之外,其餘都相同的函數(譬如quicksort),我們一般有3種解決辦法。
1、針對每個不同的類型重復地編寫函數實體(C語言的做法):
int* quicksort(int a[]) {... }
double* quicksort(double a[]) {... }

2、使用Object(Java的做法)或者void*
缺點有兩個
效率問題方面也有問題
類型檢查問題
3、使用宏預處理機制
缺點:只是愚蠢的文本替換,而且也不會考慮作用域和類型安全。
然而,應用模板卻可以避免這些缺點,我們可以編寫:
template
T* quicksort(T a[]) {... }
優點:
代碼簡潔優雅,所有參數類型都以T來代替,真正實現了類型無關性。
更好的類型安全性,所有的類型檢查都是在編譯期進行,而且避免使
用指針。
不存在繼承,效率高。(1)沒有虛函數;(2)所有的一切工作都是
在編譯期完成,大大提高運行效率。
目的:告訴編譯器如何做出最佳的選擇,而且這種選擇
全部是在編譯期完成的。

模板的機制:特化 和 實參演繹
1、特化
基本模板:
template
class A { // (1)
void f(T1 a, T2 b);
}
局部特化(偏特化):
template class A { // (2)
void f(int a, T2 b);
}
或者
template> class A { // (3)
void f(T a, T b);
}
全局特化(顯式特化):
template<>
class A {
void f(int a, int b); // (4)
}
使用示例:
A* p1; //將使用(4) ——全局特化
A* p2; //將使用(3) ——局部特化
A* p3; //將使用(2) ——局部特化
A* p4; //將由(1) ——基本模板——生成
//A
優點:
由:全局特化->局部特化->基本模板,這種特化順序的選擇與匹配(重載解析規則)是由編譯器自動進行的,無需人工參與。
可以根據不同的情況(諸如類型不同,條件不同),給出不同的實現,從而獲得更加靈活的針對性。
可以針對任何變化,改善了程序的擴展性。
2 實參演繹
T const& f(T const& a, T const& b)
{
return a + b; //1處
}
int g = f(1,2);
實際上f(1,2)要匹配的函數是int const& f(int const&,int const&);
而這個函數又是怎麼來的呢?
優點:
再也無需提供一對尖括弧和裡面的實參,諸如f(1,2),有了
實參演繹,我們就可以寫成f(1,2)。

模板的應用
1、標准庫(STL)——到處都是模板代碼
標准庫=演算法+容器+迭代器
如list /
2、類型無關性(T)
3、trait和policy
(1)trait: 主要用到了許多typedef和特化,指定的是一種特性。
// traits/accumtraits3.hpp
template
lass AccumulationTraits;
c template<>
class AccumulationTraits {
public:
typedef int AccT;
static AccT const zero = 0;
};
template<>
class AccumulationTraits {
public:
typedef int AccT;
static AccT const zero = 0;
};
template<>
class AccumulationTraits {
public:
typedef long AccT;
static AccT const zero = 0;
};
(2)policy:通常表現為某個函數,指定的是一種行為
class SumPolicy {
public:
template
static void accumulate (T1& total, T2 const & value) {
total += value;
}
};
(3)trait和policy的用法:
template>
class Accum {
public:
typedef typename Traits::AccT AccT;
static AccT accum (T const* beg, T const* end) {
AccT total = Traits::zero();
while (beg != end) {
Policy::accumulate(total, *beg);
++beg;
}
return total;
}
};
4、Metaprogramming
編譯期計算、遞歸的思想
5、新形式的設計模板
(第三、第四、第五點以後再詳細介紹)

《C++ Templates中文版》的具體介紹
第1部分介紹了模板的基本概念,以教程的風格來介紹這些基本概念。
第2部分闡述了模板的語言細節,可以作為一本基於模板的構造的參考手冊。
第3部分介紹了C++模板所支持的基本設計技術,范圍覆蓋從微小的概念一直延伸到復雜的用法;一些技術在別的書籍都沒有出現過。
第4部分基於前兩部分,深入討論了各種使用模板的普通應用程序。

9. sc怎麼入門呢

寫這個東西的目的在於讓大家了解一下sc這個服務管理程序的使用,另一方面也是為了讓大家更進一步的了解到nt,2000的服務的一些基礎問題,如果有時間,希望大家好好看看。再來結合起上一次如何打開termservice服務的那篇文章,在服務方面大家應該比較了解了。用這個東西就可以刪除在別人機器里留下的如ffsniffer, sksockerver這些東西,不用再擔心,裝上了刪除不了。但是畢竟這個東西還是ms的產品,所以,如eventlog這樣的服務,是不可以用它關閉的。累呀累呀,寫了我整整一個早上,就是不知道有沒有人看!

我們知道在mstools sdk,也就是在resource kit有一個很少有人知道的命令行軟體,sc.exe,這個軟體向所有的

windows nt和windows 2000要求控制他們的api函數。我們可以在命令行里通過對這些函數設定參數的方式來設定

他們(api)。sc.exe也可以顯示服務的狀態,同時也可以從狀態結構區域里重新找到存儲在裡面的數值。它還可以

列出遠程計算機的服務函數或者是服務狀況結構。
sc.exe這個開發工具至少可以比服務控制面板程序和網路命令行界面(net.exe,這個東西可以告訴你一個服務是

在運行中,還是停止,還是暫停。)這兩個東西提供更多的細節和准確的信息。雖然上述兩個東西在正常工作的

情況下,對於完整的調試是非常好用的,但是如果有新的服務,或者新的代碼被開發出來的時候,這兩個工具提

供的信息可能造成誤導。這也就是我們需要用到sc的原因。
下面舉列說明,如果在開發階段,你的服務在掛住在一個start-pending的時候,控制面板和net.exe同樣報告服

務是在運行的。但它掛在一個stop-pending的時候,net.exe報告它運行,而控制面板著報告它停止,如果你試著

啟動它,這是控制面板則會告訴你這個服務正在運行。難道這不是很困惑嗎?呵呵!
sc.exe可以讓你詢問服務的狀況和取出存儲在狀態結構區域內的數值,控制面板和net.exe不提供服務完整的狀況

。但是無論如何,sc程序可以告訴你這個服務准確的情形,同樣也可以給你看最後的checkpoint數和等待提示。

這個checkpoint,我叫它檢查點(我覺得他就像一個程序調試時置的斷點),所以我們也可以把看作為一個調試工

具,因為它可以提供一個關於在程序停止時還要沿著初始化繼續前進多久准確報告。
sc.exe也可以允許你調用很多的服務控制api函數,可以讓你從命令行里改變大量的參數。這位服務開發者們提供

了很多的優勢。例如,它提供了一個方便的方式來創建或者在注冊表和服務控制管理資料庫中配置服務信息。開

發者們不需要在手動的在注冊表裡單獨的設置鍵值來配置服務,也不用重起機器來強迫服務控制管理資料庫升級


作為一個命令很工具,sc.exe可以用來測試你自己的系統,你可以設置一個批處理文件來使用不同的參數調用

sc.exe來控制服務。這個很有用,如果你想看看你的服務不斷的啟動和停止,我沒有試過哦!讓一個服務一下子

打開,一下子關閉,聽上去很不錯的。如果你的服務進程裡面有多個進程的話,你可以保持一個進程繼續運行不

讓它走開,然後讓另一個不斷的打開在關閉,還可以尋找一下內存缺乏導致不完全清楚的證據。
下面介紹sc,sc qc,and sc query

sc使用這樣的語法:
1. sc [servername] command servicename [optionname= optionvalues]

2. sc [command]

這里使用第一種語法使用sc,使用第二種語法顯示幫助。

下面介紹各種參數。

servername
可選擇:可以使用雙斜線,如\\myserver,也可以是\\192.168.0.1來操作遠程計算機。如果在本地計算機上操作

就不用添加任何參數。

command
下面列出sc可以使用的命令。

config----改變一個服務的配置。(長久的)

continue--對一個服務送出一個繼續控制的要求。

control----對一個服務送出一個控制。

create----創建一個服務。(增加到注冊表中)

delete----刪除一個服務。(從注冊表中刪除)

enumdepend--列舉服務的從屬關系。

getdisplayname--獲得一個服務的顯示名稱。

getkeyname--獲得一個服務的服務鍵名。

interrogate--對一個服務送出一個詢問控制要求。

pause----對一個服務送出一個暫停控制要求。

qc----詢問一個服務的配置。

query----詢問一個服務的狀態,也可以列舉服務的狀態類型。

start----啟動一個服務。

stop----對一個服務送出一個停止的要求。

servicename
在注冊表中為service key制定的名稱。注意這個名稱是不同於顯示名稱的(這個名稱可以用net start和服務控

制面板看到),而sc是使用服務鍵名來鑒別服務的。

optionname
這個optionname和optionvalues參數允許你指定操作命令參數的名稱和數值。注意,這一點很重要在操作名稱和等

號之間是沒有空格的。一開始我不知道,結果………………,比如,start= optionvalues,這個很重要。

optionvalues可以是0,1,或者是更多的操作參數名稱和數值對。
如果你想要看每個命令的可以用的optionvalues,你可以使用sc command這樣的格式。這會為你提供詳細的幫助。

optionvalues
為optionname的參數的名稱指定它的數值。有效數值范圍常常限制於哪一個參數的optionname。如果要列表請用

sc command來詢問每個命令。

comments
很多的命令需要管理員許可權,所以我想說,在你操作這些東西的時候最好是管理員。呵呵!

當你鍵入sc而不帶任何參數時,sc.exe會顯示幫助信息和可用的命令。當你鍵入sc緊跟著命令名稱時,你可以得

到一個有關這個命令的詳細列表。比如,鍵入sc create可以得到和create有關的列表。
但是除了一個命令,sc query,這會導出該系統中當前正在運行的所有服務和驅動程序的狀態。

當你使用start命令時,你可以傳遞一些參數(arguments)給服務的主函數,但是不是給服務進程的主函數。

sc create
這個命令可以在注冊表和服務控制管理資料庫建立一個入口。

語法1
sc [servername] create servicename [optionname= optionvalues]

這里的servername,servicename,optionname,optionvalues和上面的一樣,這里就不多說了。這里我們詳細說

明一下optionname和optionvalues。

optionname--optionvalues
描述

type=----own, share, interact, kernel, filesys
關於建立服務的類型,選項值包括驅動程序使用的類型,默認是share。

start=----boot, sys tem, auto, demand, disabled
關於啟動服務的類型,選項值包括驅動程序使用的類型,默認是demand(手動)。

error=----normal, severe, critical, ignore
當服務在導入失敗錯誤的嚴重性,默認是normal。

binpath=--(string)
服務二進制文件的路徑名,這里沒有默認值,這個字元串是必須設置的。

group=----(string)
這個服務屬於的組,這個組的列表保存在注冊表中的servicegrouporder下。默認是nothing。

tag=----(string)
如果這個字元串被設置為yes,sc可以從createservice call中得到一個tagid。然而,sc並不顯示這個標簽,所

以使用這個沒有多少意義。默認是nothing

depend=----(space separated string)有空格的字元串。
在這個服務啟動前必須啟動的服務的名稱或者是組。

obj=----(string)
賬號運行使用的名稱,也可以說是登陸身份。默認是localsys tem

displayname=--(string)
一個為在用戶界面程序中鑒別各個服務使用的字元串。

password=--(string)
一個密碼,如果一個不同於localsys tem的賬號使用時需要使用這個。

optionvalues
optionname參數名稱的數值列表。參考optionname。當我們輸入一個字元串時,如果輸入一個空的引用這意味著

一個空的字元串將被導入。

comments
the sc create command performs the operations of the createservice api function.
這個sc create命令執行createservice api函數的操作。詳細請見createservice。

例1
下面這個例子在一台叫做(\\myserver)的計算機上為一個叫「newservice」的服務建立的一個注冊表登記。
sc \\myserver create newservice binpath= c:\winnt\sys tem32\newserv.exe

按照默認,這個服務會建立一個win32_share_process使用service_demand_start啟動方式。這將不會有任何從屬

關系,也將會按照localsys tem安全上下關系來運行。

例2
下面這個例子將在本地計算機上,建立一個服務,它將會是一個自動運行服務,並且運行在他自己的進程上。它

從屬於tdi組和netbios服務上。注意,你必須在從屬中間增加一個空格的引用。

sc create newservice binpath= c:\winnt\sys tem32\newserv.exe type= own
start= auto depend= "+tdi netbios"

例3
服務開發者可以通過臨時改變二進制路徑(影像路徑)的方式來將這個服務運行在內核調試器的上下關系中。下

面這個例子就可以讓我們看到如何改變服務的配置。

sc config newservice binpath= "ntsd -d c:\winnt\sys tem32\newserv.exe"
這個例子會引起服務控制管理器調用ntsd.exe使用下例的參數字元串:
"-d c:\nt\sys tem32\newserv.exe"

當系統裝入newserv.exe時ntsd將會轉而打斷調試器,所以斷點可以被設置在服務代碼里。

sc qc
這個sc qc「詢問配置」命令可以列出一個服務的配置信息和query_service_config結構。

語法1
sc [servername] qc servicename [buffersize]

parameters
servername和servicename前面已經介紹過了,這里不再多說。

buffersize,可選擇的,列出緩沖區的尺寸。

comments

sc qc命令顯示了query_service_config結構的內容。

以下是query_service_config相應的區域。
type------dwservicetype
start_type----dwstarttype
error_control----dwerrorcontrol
binary_path_name--lpbinarypathname
load_order_group--lploadordergroup
tag------dwtagid
display_name----lpdisplayname
dependencies----lpdependencies
service_start_name--lpservicestartname

例1

下面這個例子詢問了在上面例子中建立的「newservice」服務的配置:

sc \\myserver qc newservice

sc顯示下面的信息:

service_name: newservice
type : 20 win32_share_process
start_type : 3 demand_start
error_control : 1 normal
binary_path_name : c:\winnt\sys tem32\newserv.exe
load_order_group :
tag : 0
display_name : newservice
dependencies :
service_start_name : localsys tem

newservice有能力和其他的服務共享一個進程。但是它不是自動啟動的。二進制文件名是newserv.exe。這個服務

不依靠與其它的的服務,而且運行在lcoalsys tem的安全上下關系中。這些都是調用queryservicestatus基本的返

回,如果還需要更多的細節屆時,可以看看api函數文件。

sc query

sc query命令可以獲得服務的信息。

語法:
sc [servername] query { servicename │ optionname= optionvalues... }

參數:

servername, servicename, optionname, optionvalues不在解釋。只談一下這個命令提供的數值。

optionname--optionvalues
description

type=----driver, service, all
列舉服務的類型,默認是service

state=----active, inactive, all
列舉服務的狀態,默認是active

bufsize=--(numeric values)
列舉緩沖區的尺寸,默認是1024 bytes

ri=----(numeric values)
但開始列舉時,恢復指針的數字,默認是0

optionvalues
同上。

comments

sc query命令可以顯示service_status結構的內容。

下面是service_status結構相應的信息:
type------dwservicetype
state------dwcurrentstate, dwcontrolsaccepted
win32_exit_code----dwwin32exitcode
service_exit_code--dwservicespecificexitcode
checkpoint----dwcheckpoint
wait_hint----dwwaithint

在啟動計算機後,使用sc query命令會告訴你是否,或者不是一個啟動服務的嘗試。如果這個服務成功啟動,win32_exit_code區間會將會包含一個0,當嘗試不成功時,當它意識到這個服務不能夠啟動時,這個區間也會提供一個退出碼給服務。

例子

查詢「newservice"服務狀態,鍵入:

sc query newservice

顯示一下信息:

service_name: newservice
type : 20 win32_share_process
state : 1 stopped
(not_stoppable,not_pausable,ignores_shutdown)
win32_exit_code : 1077 (0x435)
service_exit_code : 0 (0x0)
checkpoint : 0x0
wait_hint : 0x0

注意,這里存在一個給這個服務的退出碼,即使這個服務部不在運行,鍵入net helpmsg 1077,將會得到對1077錯誤信息的說明:

上次啟動之後,仍未嘗試引導服務。

所以,這里我想說一句,希望大家可以活用net helpmsg,這會對你的學習有很大的幫助。

下面在對sc query的命令在說明一下:

列舉活動服務和驅動程序狀態,使用以下命令:
sc query

顯示messenger服務,使用以下命令:
sc query messenger

只列舉活動的驅動程序,使用以下命令:
sc query type= driver

列舉win32服務,使用以下命令:
sc query type= service

列舉所有的服務和驅動程序,使用以下命令:
sc query state= all

用50 byte的緩沖區來進行列舉,使用以下命令:
sc query bufsize= 50

在恢復列舉時使用index=14,使用以下命令:
sc query ri=14

列舉所有的互動式服務,使用以下命令:
sc query type= service type= interact

好了,說到這里。sc命令基本上已經說完了。希望大家好好看看,呵呵!相信會有幫助的!!

閱讀全文

與如何使用sc編程做小游戲相關的資料

熱點內容
管家婆輝煌2加密狗挪到另一台電腦 瀏覽:760
摩托車在哪裡app看考題 瀏覽:356
蘋果5app在哪裡設置 瀏覽:737
如何查看伺服器的磁碟使用 瀏覽:165
python蒙特卡洛模型投點圖 瀏覽:330
安卓手機屬於什麼介面 瀏覽:742
微信群推廣網站源碼 瀏覽:764
九江離鷹潭源碼 瀏覽:719
python可以當作函數的返回值 瀏覽:422
地鐵逃生體驗服怎麼進入安卓 瀏覽:833
齊魯工惠app的中獎記錄在哪裡 瀏覽:759
linuxkill命令詳解 瀏覽:103
dhcp伺服器動態分配地址 瀏覽:265
門禁卡加密了能破解嗎 瀏覽:215
在哪裡下載百度網盤app 瀏覽:917
伺服器要升級什麼意思 瀏覽:831
銀行還房貸解壓方法 瀏覽:702
伺服器主機辦公如何提速 瀏覽:920
cad列印為pdf 瀏覽:418
賣手錶的app哪裡可以賣 瀏覽:55