《軟件項(xiàng)目實(shí)訓(xùn)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《軟件項(xiàng)目實(shí)訓(xùn)報(bào)告.doc(32頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
遼寧工程技術(shù)大學(xué)
大型軟件項(xiàng)目實(shí)訓(xùn)報(bào)告
教學(xué)單位 軟件學(xué)院
專(zhuān) 業(yè) 軟件工程
班 級(jí) 08 - 3
學(xué)生姓名 張興堂
學(xué) 號(hào) 0820010329
指導(dǎo)教師 陳 虹
一、實(shí)訓(xùn)目的
通過(guò)外出實(shí)訓(xùn)提高自己的實(shí)戰(zhàn)能力,對(duì)軟件編程項(xiàng)目有更深刻的理解。根據(jù)企業(yè)對(duì)人才的具體需求,針對(duì)軟件學(xué)院應(yīng)屆畢業(yè)生,開(kāi)展以大型軟件工程項(xiàng)目為目的的實(shí)戰(zhàn)訓(xùn)練,有效提升學(xué)生的項(xiàng)目實(shí)戰(zhàn)能力和適應(yīng)市場(chǎng)的能力,最終實(shí)現(xiàn)學(xué)生比較理想的就業(yè)率和就業(yè)質(zhì)量。
二、實(shí)訓(xùn)時(shí)間和地點(diǎn)
1.實(shí)訓(xùn)時(shí)間:2011年11月1月~2012年1月6日
2.實(shí)訓(xùn)地點(diǎn):北京達(dá)內(nèi)
三、實(shí)訓(xùn)單位簡(jiǎn)介
達(dá)內(nèi)IT培訓(xùn)集團(tuán)是中國(guó)高端IT培訓(xùn)機(jī)構(gòu),致力于培養(yǎng)面向電信和金融領(lǐng)域的Java、C++、C#/.Net、測(cè)試、嵌入式、PHP等方面中高端軟件人才,由美國(guó)國(guó)際數(shù)據(jù)集團(tuán)IDG、集富亞洲JAFCOASIA和高盛集團(tuán)投資,是國(guó)內(nèi)首家獲得國(guó)際風(fēng)險(xiǎn)投資的IT培訓(xùn)機(jī)構(gòu)。經(jīng)過(guò)8年運(yùn)營(yíng),達(dá)內(nèi)IT培訓(xùn)集團(tuán)實(shí)現(xiàn)了95%的專(zhuān)業(yè)就業(yè)率,78%的口碑入學(xué)率,學(xué)員平均畢業(yè)薪資3800元/首月平均薪資。目前,達(dá)內(nèi)IT培訓(xùn)團(tuán)已經(jīng)發(fā)展成為集培訓(xùn)、咨詢(xún)、開(kāi)發(fā)、人才服務(wù)于一體的高新技術(shù)集團(tuán)公司,公司下設(shè)達(dá)內(nèi)高端IT培訓(xùn)、達(dá)內(nèi)軟件人才服務(wù)中心、達(dá)內(nèi)軟件研發(fā)中心?! ∵_(dá)內(nèi)IT培訓(xùn)集團(tuán)以中關(guān)村科技園區(qū)為依托,在中國(guó)軟件業(yè)發(fā)達(dá)城市——北京、上海、廣州、深圳、大連、南京、武漢、杭州、西安、蘇州、成都、太原20大城市,建立了近40家培訓(xùn)中心,占地2萬(wàn)平米,年培訓(xùn)1萬(wàn)多名軟件人才。已累計(jì)為IBM、微軟、摩托羅拉、華為、中軟、用友、Yahoo、阿里巴巴、TOM、新浪、搜狐、百度、聯(lián)想、神州數(shù)碼、大唐電信、亞信等知名IT企業(yè)培養(yǎng)輸送了5萬(wàn)多名中高級(jí)軟件人才,目前達(dá)內(nèi)全國(guó)擁500多名員工,年產(chǎn)值近2億元,是中國(guó)最大的中高端軟件人才培訓(xùn)機(jī)構(gòu)。 由于達(dá)內(nèi)IT培訓(xùn)集團(tuán)優(yōu)秀的教學(xué)效果和行業(yè)領(lǐng)先的經(jīng)營(yíng)模式贏得了社會(huì)各界的廣泛贊譽(yù)和好評(píng),近年來(lái)達(dá)內(nèi)榮獲了各界權(quán)威機(jī)構(gòu)的頒獎(jiǎng):達(dá)內(nèi)成為業(yè)界唯一的一家2006、2007、2008、2009連續(xù)4年入選德勤評(píng)選的“中國(guó)高科技高成長(zhǎng)50強(qiáng)公司”、“亞太地區(qū)高科技高成長(zhǎng)500強(qiáng)公司”,中關(guān)村管理委員會(huì)指定的“軟件人才培養(yǎng)示范基地”、被《計(jì)算機(jī)世界》評(píng)選的“就業(yè)服務(wù)杰出貢獻(xiàn)獎(jiǎng)”、被《中國(guó)計(jì)算機(jī)報(bào)》評(píng)選的“最具影響力培訓(xùn)機(jī)構(gòu)獎(jiǎng)”、被搜狐評(píng)為“中國(guó)十大教育集團(tuán)”、被騰訊評(píng)為“中國(guó)大學(xué)生心目中最具影響力的IT品牌”等等。
四、實(shí)訓(xùn)內(nèi)容
1.實(shí)訓(xùn)期間完成的學(xué)習(xí)任務(wù)
一.Linux系統(tǒng)操作命令
首先,我們學(xué)習(xí)了最基礎(chǔ)的系統(tǒng)操作指令。因?yàn)樵趯W(xué)習(xí)過(guò)程中c和c++代碼的編程和修改在linux系統(tǒng)下,所以我們集中精力花費(fèi)了3天時(shí)間學(xué)習(xí)指令操作。
命令:
文檔統(tǒng)計(jì): wc日期: date cal關(guān)機(jī) poweroff windows:shutdown
Reboot exit find grep find [目錄列表] 匹配標(biāo)準(zhǔn) -name size -type -atime
通配符
操作目錄下有需要通配的內(nèi)容的時(shí)候采使用通配符。
*
[]
(1) 列舉
(2) 范圍
?
!
{}; | 將上一個(gè)命令的輸出作為下一個(gè)命令的輸入 cat /etc/passwd | grep -n root
tee
ls -l | tee a.txt
ln 硬連接 軟連接
ln file02 file ln -s file02 sfile
users:
who:
who am i:
whoami:
系統(tǒng)進(jìn)程信息 ps
ps u:詳細(xì)方式顯示當(dāng)前終端下的進(jìn)程的信息
ps -e:當(dāng)前正在運(yùn)行的所有進(jìn)程
sleep 10&
kill PID
jobs: 查看任務(wù)
kill %n fg %n bg %n stop %n ctrl+c / z
man 幫助手冊(cè)
(1) 系統(tǒng)命令
(2) 系統(tǒng)調(diào)用 open
(3) 庫(kù)函數(shù) fopen
(4) (5) (6) (7) (8) 管理員的命令 ifconfig service
ifconfig
ip地址:netmask: 默認(rèn)網(wǎng)關(guān):
域名解析 netstat ping ip export
HOME: PWD: PATH: LANG: CC: CCC: PS1: PS2
export PS1=""
~/.bashrc source ~/.bashrc xxx.sh
#!/bin/bash cal date ls vi
命令模式: i a h j k l ctrl+b f shift+9 0 w e b $ 0 x 5x X 5X dd 5dd
yw yy p r R u : undo #G
底行命令模式:
set nu
set cindent:按照C語(yǔ)言的風(fēng)格進(jìn)行自動(dòng)縮進(jìn)。
set tabstop=4:設(shè)置tab按鍵的長(zhǎng)度
行號(hào)+回車(chē)
字符串n N
/n個(gè)空格 %s/string/replace/g
w filename
#1,#2 w filename
q q! wq
gedit kate
C程序的開(kāi)發(fā)執(zhí)行次序:
1 寫(xiě)源文件,后綴名 .c
2 對(duì)代碼中的指令進(jìn)行預(yù)處理,以#開(kāi)頭的
3 代碼編譯,生成 xx.o/xx.obj
4 代碼的連接生成可執(zhí)行文件 a.out/xx.exe
5 加載文件,把文件從硬盤(pán)讀入內(nèi)存
6 執(zhí)行
gcc 的選項(xiàng):
-c 只編譯不連接
-E 只作預(yù)處理
-S 匯編代碼
-std=c89/c99
-o 改變最后的可執(zhí)行文件的名字
二.linu下c程序開(kāi)發(fā)
庫(kù)函數(shù) sqrt 開(kāi)平方 #include
連接的時(shí)候需要連接 數(shù)學(xué)庫(kù)gcc xxx.c -lm
舉例: 打印1-30 之間不能被4整除的整數(shù)。
while循環(huán)
while(表達(dá)式)
{
語(yǔ)句;
}
int i = 1;
while(i<11)
{
printf("%d ",i++);
}
舉例 : 猜數(shù)游戲。
隨機(jī)數(shù):
#include
rand() 偽隨機(jī)數(shù)
srand() 設(shè)置隨機(jī)數(shù)種子
#include
time() 獲取系統(tǒng)的時(shí)間
time(0):返回一個(gè)時(shí)間
1970年1月1號(hào)0:0:0 到現(xiàn)在 所經(jīng)過(guò)的秒數(shù)
隨機(jī)數(shù):
srand(time(0));
rand()產(chǎn)生一個(gè)隨機(jī)數(shù)。無(wú)限循環(huán):死循環(huán)
while(1)
for(;;)
do-while循環(huán):
do
{
語(yǔ)句;
}while(表達(dá)式);
緩沖區(qū):
輸入:
scanf(數(shù)據(jù)類(lèi)型);
scanf("%*[^\n]");
* : 將讀取到的內(nèi)容忽略掉
[^\n] : 非\n的字符
scanf("%*c");
if(scanf()==0)
{
}
輸出緩沖區(qū):
<1> \n
<2> 程序結(jié)束
<3> 滿(mǎn) 4kb
<4> 人工刷新
fflush(stdout);//stdin stderr
一維數(shù)組:
數(shù)據(jù)類(lèi)型相同的一組數(shù)據(jù)。(結(jié)構(gòu)體) 數(shù)組的定義:
數(shù)據(jù)類(lèi)型 數(shù)組名[數(shù)組的長(zhǎng)度];
char int float 結(jié)構(gòu)體
int a[5];
下標(biāo):
數(shù)組的初始化:
int a[5] = {1,2,3,4};
int a[5] = {0};
指定初始化:
int a[5] = {[3] = 4};
二維數(shù)組:
數(shù)據(jù)類(lèi)型 數(shù)組名[行][列]
行下標(biāo) 列下標(biāo)
for()
{
for()
a[i][j] = 0;
}
一維:
for()
{
a[i] = 0;
}
二維數(shù)組初始化:
int a[2][3] = {{},{}};
函數(shù)的返回值:
<1> 函數(shù)返回值的類(lèi)型必須和return返回值的類(lèi)型一致。
<2> 如果函數(shù)沒(méi)有返回值 指定 void
<3> C語(yǔ)言中 返回值類(lèi)型可以省略 默認(rèn) int
參數(shù):形式參數(shù)
<1> 多個(gè)形式參數(shù)之間使用逗號(hào)分割
<2> 每個(gè)形式參數(shù)必須有類(lèi)型的說(shuō)明
float x,y,z;
float aver(float x,y)//錯(cuò)誤
<1> C語(yǔ)言中沒(méi)有bool類(lèi)型
#include
bool true false
本質(zhì)就是一個(gè)整數(shù)
<2> #include
double sqrt(double);
gcc xxx.c -lm
<3> 函數(shù)調(diào)用
函數(shù)名(實(shí)際參數(shù));
形式參數(shù)和實(shí)際參數(shù): 參數(shù)名可以不一樣
函數(shù)聲明:
C語(yǔ)言規(guī)定:函數(shù)在使用之前必須聲明。
聲明:
函數(shù)頭;
bool prime(int);
可以不寫(xiě)形式參數(shù)的名字。
隱式聲明:
如果函數(shù)在使用之前并沒(méi)有進(jìn)行聲明,編譯器會(huì)自動(dòng)創(chuàng)建
一個(gè)隱式聲明,返回值類(lèi)型為 int
實(shí)際參數(shù)--->形式參數(shù)
值傳遞: 拷貝一份數(shù)組賦值給形式參數(shù)。
float aver(float x,float y);
t = aver(i,j);
i--->x
j--->y
aver返回值--->t
注意: 實(shí)際參數(shù)和形式參數(shù)名字一樣,存儲(chǔ)空間不一樣。
高內(nèi)聚 低耦合"
數(shù)組可以作為函數(shù)的參數(shù):
函數(shù)調(diào)用傳遞的是數(shù)組的名字
(數(shù)組第一個(gè)元素的地址)
數(shù)組的長(zhǎng)度 = sizeof(數(shù)組名)/sizeof(元素)
不能實(shí)現(xiàn): 數(shù)組傳遞的是地址。
sizeof(地址) = 4
形式參數(shù)為數(shù)組的時(shí)候,我們應(yīng)該設(shè)計(jì)兩個(gè)參數(shù):
一個(gè)數(shù)組 另外一個(gè) 數(shù)字的長(zhǎng)度
int function(int a[],int length,...)
const:
使用const修飾的變量,只讀變量。
如果形式參數(shù)傳遞的是地址,不希望在被調(diào)函數(shù)中修改地址上的
內(nèi)容 可以使用const來(lái)修飾形參
void f(const int a[],int length);
return :
main函數(shù)中使用
整個(gè)程序結(jié)束。
遞歸: 如果一個(gè)函數(shù)調(diào)用了它本身,遞歸函數(shù)。
指針的初級(jí):
指針 就是內(nèi)存的地址,指針變量就是存儲(chǔ)地址的變量。
定義一個(gè)指針變量:
數(shù)據(jù)類(lèi)型 *變量名;
指針變量所保存的地址--->內(nèi)存上的數(shù)據(jù)類(lèi)型。
* : 告訴編譯器后面的變量是一個(gè)指針變量
指針初始化:
int *q = NULL;//NULL 0 0.0
空指針:不指向任何地方
指針的賦值:
q = &i;
運(yùn)算符:
* 取對(duì)應(yīng)地址上的內(nèi)容。
const與指針:
(1) const int *q
: q指向的數(shù)據(jù)數(shù)值不能改變 q本身可以改變。
(2) int * const q
: q本身不可以改變,q指向的數(shù)值是可以改變的。
數(shù)組名
(3) const int * const q
字符串: string類(lèi)型
三種表現(xiàn)形式:
(1)字面值常量“abcde”,不能作為變量,可以賦值給變量。
程序段(代碼段)后面\0結(jié)束
數(shù)值相同的字面值常量在代碼段只有一份。
(2)char arr[20]表示字符串類(lèi)型的變量(數(shù)組)
后面一定加上\0
printf("%s",arr);--->arr是數(shù)組的名字
一直打印直到遇到\0
(3)int a[10];int* q=&a[0];
char str[20];char *q=&str[0];
指針?lè)绞酱鎯?chǔ)字符串常量的地址。
考慮緩沖區(qū)的大小,可能會(huì)導(dǎo)致緩沖區(qū)溢出。
<3>fgets(char *s,size_t size,FILE* stream);
s:指向緩沖區(qū)的指針
size:緩沖區(qū)的大小
stream:文件指針--->stdin
注意:fgets會(huì)在整個(gè)字符串后面增加\n
操作字符串的庫(kù)函數(shù):
#include
strcpy
char* strcpy(char* dest,char* src);
作用:將src指向的字符串拷貝呆dest指向的緩沖區(qū)中。
返回值:dest數(shù)值(地址)。
使用:
char str1[20];
char str2[20];
strcpy(str1,str2);
strcpy(str1,"hello");
注意:strcpy不考慮第一個(gè)參數(shù)指向緩沖區(qū)大小。
char* strncpy(char* dest,const char* src,size_t size);
strcat:
char* strcat(char *dest,char* src);
作用:將src指向的字符串鏈接到dest指向的字符串結(jié)尾的地方
注意:不會(huì)考慮dest指向的緩沖區(qū)的大小。
char* strncat(char* dest,char* src,size_t size);
strlen:---->sizeof
char name[20] = "hello";
sizeof(name)---->20:數(shù)組所占用的內(nèi)存
int strlen(char* s);
strlen(name) = 5;
測(cè)量字符串的長(zhǎng)度,不包含結(jié)尾的\n
strcmp:對(duì)比兩個(gè)字符串
int strcmp(char* s1,char* s2)
"abc"
"acb"
返回值有三種可能:
1 0 相等
2 正數(shù) s1>s2
3 負(fù)數(shù) s1printf("i/j = %d",i/j);
PRINT(x/y)
--->printf("x/y = %d",x/y);
#define PRINT(n) printf("...",n)
#運(yùn)算符: 可以將宏中的參數(shù)轉(zhuǎn)換為字面值常量。
限定: #運(yùn)算符只能出現(xiàn)在帶參數(shù)的宏替換列表中
字符串: "abc""de" = "abcde"
#define PRINT(n) printf(#n" = %d\n",n)
--> "i/j"" = %d\n"--->"i/j = %d\n"
##運(yùn)算符
作用:將兩個(gè)標(biāo)識(shí)符粘合在一起組成一個(gè)新的標(biāo)識(shí)符
需求: int float
int max_int()---->整數(shù)
float max_float()--->浮點(diǎn)數(shù)
.#define MAX(type) type max_##type() ...
MAX(int)---> int max_int()
MAX(float)---> float max_float()
需要很多標(biāo)識(shí)符名字。
#define MK_ID(n) i_##n
MK_ID(1) ---> i_1
MK_ID(32) ---> i_32
條件編譯:
就是根據(jù)預(yù)處理的結(jié)果來(lái)包含或者排除某一段代碼。
#if #endif
預(yù)處理器判斷#if后面的宏目前的數(shù)值
0--->#if 和 #endif之間的代碼排除
非零 保留
defined
#if defined DEBUG ---> DEBUG是不是已經(jīng)定義為一個(gè)宏
#ifdef = #if defined
debug:調(diào)試
n多條調(diào)試語(yǔ)句(printf)
release:發(fā)布
//#define DEBUG
#ifdef DEBUG
調(diào)試語(yǔ)句
#endif
#ifndef--->#if not defined
#include "test.h"
#include "test.h"
makefile:
由很多條規(guī)則組成的:
目標(biāo)文件: 依賴(lài)文件
生成目標(biāo)文件所執(zhí)行的指令
選擇一條規(guī)則來(lái)執(zhí)行
make 目標(biāo)文件
如果想要使用定義在其他文件中的全局變量
請(qǐng)使用 extern 聲明
extern int user_id;
自定義頭文件:
系統(tǒng)提供的頭文件:
stdio.h stdlib.h stdbool.h string.h unistd.h math.h
time.h stdarg.h等等
多文件程序中,共享全局變量 宏定義共享 函數(shù)聲明共享
類(lèi)型定義共享需要使用頭文件。
可以使用條件編譯防止重復(fù)引用。
/************/
#ifndef SYSTEM_H
#define SYSTEM_H
#include
#include
#include "s1.h"
#include "s2.h"
#define PI 3.14
#define MAX 2000
extern int i;
extern int j;
//函數(shù)的生命
int max_min(int,int);
void show();
//類(lèi)型定義
struct s
{};
#endif
static :
靜態(tài)局部變量
靜態(tài)全局變量
static int user_id = 15;
即使使用 extern int user_id;
static修飾函數(shù)
這個(gè)函數(shù)只能在本文件中使用。
結(jié)構(gòu)體:
數(shù) 組: 相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)的集合。
結(jié)構(gòu)體: 不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)的集合。
結(jié)構(gòu)體:
定義或者使用一個(gè)結(jié)構(gòu)體變量之前,先進(jìn)行類(lèi)型定義。
結(jié)構(gòu)體變量的定義:
struct employee em;
初始化:
struct employee em = {101,"guo",M,20,5000};
2. 實(shí)訓(xùn)期間完成的實(shí)踐項(xiàng)目
我在達(dá)內(nèi)老師的帶領(lǐng)下,學(xué)習(xí)了c和c++基礎(chǔ)之后,做了一個(gè)貪吃蛇的小游戲,雖然游戲比較簡(jiǎn)略,但是基本功能已經(jīng)實(shí)現(xiàn)。
(1).功能介紹:
產(chǎn)生一個(gè)固定大小沒(méi)有辯解的游戲區(qū)域,蛇從區(qū)域的中心開(kāi)始,由玩家通過(guò)鍵盤(pán)控制蛇的運(yùn)動(dòng)方向,用蛇頭去吃隨機(jī)分布在游戲區(qū)域內(nèi)的食物;
蛇的運(yùn)動(dòng)限制在游戲區(qū)域內(nèi),游戲區(qū)域沒(méi)有辯解,所以蛇在區(qū)域內(nèi)做循環(huán)運(yùn)動(dòng):
蛇的運(yùn)動(dòng)方向?yàn)橹本€運(yùn)動(dòng),只走橫和豎的方向,不走斜線;
蛇的運(yùn)動(dòng)速度由游戲的難度來(lái)控制,難度越高速度越快,游戲難度分為9個(gè)等級(jí);
蛇的身體長(zhǎng)度從1開(kāi)始每吃掉一份食物就增加一個(gè)長(zhǎng)度;食物的出現(xiàn)按照隨機(jī)分布原則,蛇吃掉一份后隨機(jī)在游戲區(qū)域內(nèi)放一份新的食物;
游戲的結(jié)束條件為:在控制蛇的過(guò)程中蛇頭碰到蛇的身體的任何部位;
設(shè)計(jì)者應(yīng)該首先考慮實(shí)現(xiàn)一個(gè)可以游動(dòng)的蛇。通過(guò)尋找規(guī)律,對(duì)實(shí)際對(duì)象進(jìn)行抽象概括建立對(duì)象模型,首先從物理的角度來(lái)分析蛇得運(yùn)動(dòng)規(guī)律。它是蠕動(dòng)的,像水一樣流動(dòng)。他有個(gè)特性就是身體的每一個(gè)點(diǎn)都經(jīng)過(guò)他頭部所在的點(diǎn),他每一個(gè)時(shí)刻骨節(jié)所要運(yùn)動(dòng)的目的地是他前一個(gè)骨節(jié)所在的位置。所以我們事先必須了解并掌握一些基本的畫(huà)圖函數(shù),并學(xué)會(huì)調(diào)用和運(yùn)行。
(2).用流程圖示出程序的主要控制流程和處理流程
游戲載入內(nèi)存并初始化界面
判斷游戲是否開(kāi)始
單擊按鈕
開(kāi)始游戲
沒(méi)有開(kāi)始游戲,就返回初始界面
貪吃蛇開(kāi)始移動(dòng)(初始方向向左)
根據(jù)鍵盤(pán)消息判斷蛇頭的運(yùn)動(dòng)方向
根據(jù)蛇頭的坐標(biāo)和食物的坐標(biāo)判斷蛇是否已經(jīng)得到食物
如果已經(jīng)得到食物,則蛇的身體加長(zhǎng),積分器加一
如果沒(méi)有得到食物,則蛇的身體不變,積分器不變
根據(jù)蛇頭的坐標(biāo)、蛇身體的坐標(biāo)和墻壁的坐標(biāo)判斷蛇是否已經(jīng)撞墻或者自己咬到自己
如果沒(méi)有撞墻并且沒(méi)有自己咬到自己則程序繼續(xù)進(jìn)行
如果已經(jīng)撞墻或者自己咬到自己則程序終止
貪吃蛇程序結(jié)束
積分器開(kāi)始計(jì)分
下面是項(xiàng)目代碼:
#include
#include
#include
#include
#include
#define NUM 60
struct direct //用來(lái)表示方向的
{
int cx;
int cy;
};
typedef struct node //鏈表的結(jié)點(diǎn)
{
int cx;
int cy;
struct node *back;
struct node *next;
}node;
void initGame(); //初始化游戲
int setTicker(int); //設(shè)置計(jì)時(shí)器
void show(); //顯示整個(gè)畫(huà)面
void showInformation(); //顯示游戲信息(前兩行)
void showSnake(); //顯示蛇的身體
void getOrder(); //從鍵盤(pán)中獲取命令
void over(int i); //完成游戲結(jié)束后的提示信息
void creatLink(); //(帶頭尾結(jié)點(diǎn))雙向鏈表以及它的操作
void insertNode(int x, int y);
void deleteNode();
void deleteLink();
int ch; //輸入的命令
int hour, minute, second; //時(shí)分秒
int length, tTime, level; //(蛇的)長(zhǎng)度,計(jì)時(shí)器,(游戲)等級(jí)
struct direct dir, food; //蛇的前進(jìn)方向,食物的位置
node *head, *tail; //鏈表的頭尾結(jié)點(diǎn)
int main()
{
initscr();
initGame();
signal(SIGALRM, show);
getOrder();
endwin();
return 0;
}
void initGame()
{
cbreak(); //把終端的CBREAK模式打開(kāi)
noecho(); //關(guān)閉回
curs_set(0); //把光標(biāo)置為不可見(jiàn)
keypad(stdscr, true); //使用用戶(hù)終端的鍵盤(pán)上的小鍵盤(pán)
srand(time(0)); //設(shè)置隨機(jī)數(shù)種子
//初始化各項(xiàng)數(shù)據(jù)
hour = minute = second = tTime = 0;
length = 1;
dir.cx = 1;
dir.cy = 0;
ch = A;
food.cx = rand() % COLS;
food.cy = rand() % (LINES-2) + 2;
creatLink();
setTicker(20);
}
//設(shè)置計(jì)時(shí)器(這個(gè)函數(shù)是書(shū)本上的例子,有改動(dòng))
int setTicker(int n_msecs)
{
struct itimerval new_timeset;
long n_sec, n_usecs;
n_sec = n_msecs / 1000 ;
n_usecs = ( n_msecs % 1000 ) * 1000L ;
new_timeset.it_interval.tv_sec = n_sec;
new_timeset.it_interval.tv_usec = n_usecs;
n_msecs = 1;
n_sec = n_msecs / 1000 ;
n_usecs = ( n_msecs % 1000 ) * 1000L ;
new_timeset.it_value.tv_sec = n_sec ;
new_timeset.it_value.tv_usec = n_usecs ;
return setitimer(ITIMER_REAL, &new_timeset, NULL);
}
void showInformation()
{
tTime++;
if(tTime >= 1000000) //
tTime = 0;
if(1 != tTime % 50)
return;
move(0, 3);
//顯示時(shí)間
printw("time: %d:%d:%d %c", hour, minute, second)
second++;
if(second > NUM)
{
second = 0;
minute++;
}
sf(minute > NUM)
{
minute = 0;
hour++;
}
//顯示長(zhǎng)度,等級(jí)
move(1, 0);
int i;
for(i=0;inext->cx && 1==dir.cx)
|| (0==head->next->cx && -1==dir.cx)
|| (LINES-1==head->next->cy && 1==dir.cy)
|| (2==head->next->cy && -1==dir.cy))
{
over(1);
return;
}
//如果蛇頭砬到自己的身體,則游戲結(jié)
if(* == mvinch(head->next->cy+dir.cy, head->next->cx+dir.cx) )
{
over(2);
return;
}
insertNode(head->next->cx+dir.cx, head->next->cy+dir.cy);
/蛇吃了一個(gè)“食物”
if(head->next->cx==food.cx && head->next->cy==food.cy)
{
lenChange = true;
length++;
//恭喜你,通關(guān)
if(length >= 50)
{
over(3);
return;
}
//重新設(shè)置食物的位置
food.cx = rand() % COLS;
food.cy = rand() % (LINES-2) + 2;
}
if(!lenChange)
{
move(tail->back->cy, tail->back->cx);
printw(" ");
deleteNode();
}
move(head->next->cy, head->next->cx);
printw("*");
}
void show()
{
signal(SIGALRM, show); //設(shè)置中斷信號(hào)
showInformation();
showSnake();
refresh(); //刷新真實(shí)屏幕
}
void getOrder()
{
//建立一個(gè)死循環(huán),來(lái)讀取來(lái)自鍵盤(pán)的命令
while(1)
{
ch = getch();
if(KEY_LEFT == ch)
{
dir.cx = -1;
dir.cy = 0;
}
else if(KEY_UP == ch)
{
dir.cx = 0;
dir.cy = -1;
}
else if(KEY_RIGHT == ch)
{
dir.cx = 1;
dir.cy = 0;
}
else if(KEY_DOWN == ch)
{
dir.cx = 0;
dir.cy = 1;
}
setTicker(20);
}
}
void over(int i)
{
//顯示結(jié)束原因
move(0, 0);
int j;
for(j=0;jcx = 5;
temp->cy = 10;
head->back = tail->next = NULL;
head->next = temp;
temp->next = tail;
tail->back = temp;
temp->back = head;
}//在鏈表的頭部(非頭結(jié)點(diǎn))插入一個(gè)結(jié)點(diǎn)
void insertNode(int x, int y)
{node *temp = (node *)malloc( sizeof(node) );
temp->cx = x;
temp->cy = y;
temp->next = head->next;
head->next = temp;
temp->back = head;
temp->next->back = temp;
}//刪除鏈表的(非尾結(jié)點(diǎn)的)最后一個(gè)結(jié)點(diǎn)
void deleteNode()
{
node *temp = tail->back;
node *bTemp = temp->back;
bTemp->next = tail;
tail->back = bTemp;
temp->next = temp->back = NULL;
free(temp);
temp = NULL;
}//刪除整個(gè)鏈表
void deleteLink()
{
while(head->next != tail)
deleteNode();
head->next = tail->back = NULL;
free(head);
free(tail);
}
下面是程序流程圖:
五、實(shí)訓(xùn)收獲與體會(huì)
通過(guò)這次課程設(shè)計(jì)的實(shí)訓(xùn),增加了我學(xué)習(xí)軟件技術(shù)的興趣,雖然還不明確軟件技術(shù)包含的具體內(nèi)容,但從C++語(yǔ)言這門(mén)課程開(kāi)始,已發(fā)現(xiàn)程序設(shè)計(jì)的樂(lè)趣,在學(xué)習(xí)C++語(yǔ)言的過(guò)程中也學(xué)到了許多計(jì)算機(jī)應(yīng)用基礎(chǔ)知識(shí),對(duì)計(jì)算機(jī)的機(jī)體也有了一個(gè)大體的了解。
在實(shí)際操作過(guò)程中犯的一些錯(cuò)誤還會(huì)有意外的收獲,感覺(jué)實(shí)訓(xùn)很有意思。在具體操作中對(duì)這學(xué)期所學(xué)的C++語(yǔ)言的理論知識(shí)得到鞏固,達(dá)到實(shí)訓(xùn)的基本目的,也發(fā)現(xiàn)自己的不足之出,在以后的上機(jī)中應(yīng)更加注意,同時(shí)體會(huì)到C++語(yǔ)言具有的語(yǔ)句簡(jiǎn)潔,使用靈活,執(zhí)行效率高等特點(diǎn)。發(fā)現(xiàn)上機(jī)實(shí)訓(xùn)的重要作用,特別是對(duì)數(shù)組和循環(huán)有了深刻的理解。
通過(guò)實(shí)際操作,學(xué)會(huì) C++語(yǔ)言程序編程的基本步驟、基本方法,開(kāi)發(fā)了自己的邏輯思維能力,培養(yǎng)了分析問(wèn)題、解決問(wèn)題的能力。深刻體會(huì)到“沒(méi)有做不到的,只有想不到的”,“團(tuán)結(jié)就是力量”,“實(shí)踐是檢驗(yàn)真理的標(biāo)準(zhǔn)”,“不恥下問(wèn)”……的寓意。
在此希望以后應(yīng)多進(jìn)行這樣的實(shí)訓(xùn),加長(zhǎng)設(shè)間,培養(yǎng)學(xué)生獨(dú)立思考問(wèn)題的能力,提高實(shí)際操作水平。
六、致謝
通過(guò)本次項(xiàng)目實(shí)訓(xùn)我要感謝學(xué)校領(lǐng)導(dǎo)給我們提供了這次機(jī)會(huì),讓我們自己有出去體會(huì)生活,自己做項(xiàng)目的深刻體會(huì)。這次實(shí)訓(xùn)讓我明白我自己之前的學(xué)習(xí)還是差很多,只有不斷的努力,才能學(xué)好。還要感謝達(dá)內(nèi)公司對(duì)我的指導(dǎo),我自己的努力固然重要,但是達(dá)內(nèi)的優(yōu)秀教師給我做的培訓(xùn),講的理論都讓我受益匪淺,讓我對(duì)軟件有了一個(gè)新的概念新的理解。
指
導(dǎo)
教
師
意
見(jiàn)
指導(dǎo)教師簽字:
年 月 日
成績(jī)
備注
鏈接地址:http://www.3dchina-expo.com/p-8901403.html