小游戏程序设计实验报告(小游戏设计论文)
C语言程序设计实验报告
兄弟,你莫搞笑的了,分都没有,还这么多的题...够得你等的呀
课程设计之打字游戏(c语言或c++),要详细的实验报告
打字游戏有很多种的,比如:出现一行字后让你限时打出屏幕上出现的字符,全对过关或者给出正确率。
至于详细的报告,需要更多的需求信息才能给出。
小游戏代码实验报告
Private Sub Form_Activate()
Option1.Caption = "石头"
Option2.Caption = "剪刀"
Option3.Caption = "布"
Option1.Value = False
Option2.Value = False
Option3.Value = False
End Sub
Private Sub Option1_Click()
Randomize
Select Case Int(3 * Rnd)
Case 0: MsgBox "对方也出石头!继续!"
Case 1: MsgBox "哈哈!你赢了!对方出的是剪刀!奖励你一个苹果!"
Case 2: MsgBox "你输了!对方出的是布哦!不好意思,苹果给对方了哈!"
End Select
Option1.Value = False
End Sub
Private Sub Option2_Click()
Randomize
Select Case Int(3 * Rnd)
Case 0: MsgBox "你输了!对方出的是石头哦!不好意思,苹果给对方了哈!"
Case 1: MsgBox "对方也出剪刀!继续!"
Case 2: MsgBox "哈哈!你赢了!对方出的是布!奖励你一个苹果!"
End Select
Option2.Value = False
End Sub
Private Sub Option3_Click()
Randomize
Select Case Int(3 * Rnd)
Case 0: MsgBox "哈哈!你赢了!对方出的是石头!奖励你一个苹果!"
Case 1: MsgBox "你输了!对方出的是剪刀哦!不好意思,苹果给对方了哈!"
Case 2: MsgBox "对方也出布!继续!"
End Select
Option3.Value = False
求一个五子棋程序设计实验报告
我给你一个c++五子棋的程序mian.cpp#include cstdio
#include string
#include cstdlib
#include ctime
#include Windows.h
#include "pl.h"
using namespace std;pl game;
pl game2;void srandput(int x,int y) {
srand(time(NULL));
do {
x = rand() % 20;
y = rand() % 20;
} while (!game.isok(x,y));
}void scanfput(int x,int y) {
do {
scanf("%d %d",x,y);
} while (!game.isok(x,y));
}int main() {
int x,y;
char who = com;
x = y = -1;
do {
if (who == com) who = me;
else who = com;
if (who == me) {
game.getxy(x,y);
printf("Com put chess in (%d,%d)\n",x,y);
game.printmap();
if (game.isend(x,y,com)) {
who = com;
break;
} game.sendxy(x,y);
printf("I put chess in (%d,%d)\n",x,y);
game.printmap();
if (game.isend(x,y,me)) break;
//system("pause");
}
else {
//srandput(x,y);
scanfput(x,y);
//game2.getxy(x,y);
//game2.sendxy(x,y);
}
} while (true);
if (who == me) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe);
puts("You Win, Computer Lose.");
}
else {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom);
puts("Computer Win, You Lose.");
}
printf("Use %d Steps\n",game.getstep());
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite);
} pi.hconst DWORD dwWhite = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;
const DWORD dwMe = FOREGROUND_GREEN;
const DWORD dwCom = FOREGROUND_RED;
//■□○●
char rec1[] = {-95,-10,0};
char rec2[] = {-95,-11,0};
char cir1[] = {-95,-16,0};
char cir2[] = {-95,-15,0};
//////////////////////////////////////////////////////////////////////////
//class pl
//////////////////////////////////////////////////////////////////////////
const int NMAX = 20;
const int MAX = 1200;
const char blank = '0';
const char me = '1';
const char com = '2';class pl {
public:
void sendxy(int ,int );
void getxy(int,int);
void initscore();
void refreshscore(char,int,int);
void calscore(char);
void solve(int ,int );
void printmap();
bool isok(int,int);
bool isend(int,int,char);
int getstep();
pl();
private:
int usestep;
int wincount;
char chess[NMAX][NMAX];
int win[2][MAX];
//ps,pt - me
//cs,ct - com
int ps[NMAX][NMAX],
cs[NMAX][NMAX];
bool pt[NMAX][NMAX][MAX],
ct[NMAX][NMAX][MAX];
};pl::pl() {
memset(chess,blank,sizeof(chess));
memset(pt,false,sizeof(pt));
memset(ct,false,sizeof(ct));
memset(win,0,sizeof(win));
wincount = 0;
usestep = 0;
initscore();
}void pl::printmap() {
int i,j; for (i=0;iNMAX;i++) {
printf("\t\t\t%d\t",i);
for (j=0;jNMAX;j++) {
if (chess[i][j] == me) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe);
printf("%s",cir2);
}
else if (chess[i][j] == com) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom);
printf("%s",cir2);
}
else printf("%s",rec2);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite);
}
putchar('\n');
}
printf("\n\t\t\t\t");
for (i=0;iNMAX;i++) printf("%2d",i);
putchar('\n');
}void pl::getxy(int x,int y) {
if (x==-1 y==-1) return;
refreshscore(com,x,y);
}bool pl::isok(int x,int y) {
return (chess[x][y] == blank);
}bool pl::isend(int x,int y,char who) {
int i,j;
int l,r,u,d,c1,c2,c3,c4;
if (x==-1 y==-1) return false;
l = r = u = d = 0;
c1 = c2 = c3 = c4 = 0;
for (i=1;i5 x+i NMAX;i++) {
if (who == chess[x+i][y]) u ++;
else break;
}
for (i=1;i5 x-i = 0;i++) {
if (who == chess[x-i][y]) d ++;
else break;
}
for (i=1;i5 y+i NMAX;i++) {
if (who == chess[x][y+i]) r ++;
else break;
}
for (i=1;i5 y-i = 0;i++) {
if (who == chess[x][y-i]) l ++;
else break;
}
for (i=1;i5 x+i NMAX y+i NMAX;i++) {
if (who == chess[x+i][y+i]) c1 ++;
else break;
}
for (i=1;i5 x+i NMAX y-i = 0;i++) {
if (who == chess[x+i][y-i]) c2 ++;
else break;
}
for (i=1;i5 x-i = 0 y-i = 0;i++) {
if (who == chess[x-i][y-i]) c3 ++;
else break;
}
for (i=1;i5 x-i = 0 y+i NMAX;i++) {
if (who == chess[x-i][y+i]) c4 ++;
else break;
}
return ( (u+1+d)=5 || (l+1+r)=5 || (c1+1+c3)=5 || (c2+1+c4)=5 );
}void pl::sendxy(int x, int y) {
solve(x,y);
usestep ++;
}//枚举赢的局面
void pl::initscore() {
int i,j,k;
//竖
for (i=0;iNMAX;i++) {
for (j=0;jNMAX-4;j++) {
for (k=0;k5;k++) pt[j+k][i][wincount] = ct[j+k][i][wincount] = true;
wincount ++;
}
}
//横
for (i=0;iNMAX;i++) {
for (j=0;jNMAX-4;j++) {
for (k=0;k5;k++) pt[i][j+k][wincount] = ct[i][j+k][wincount] = true;
wincount ++;
}
}
//斜1
for (i=0;iNMAX-4;i++) {
for (j=0;jNMAX-4;j++) {
for (k=0;k5;k++) pt[j+k][i+k][wincount] = ct[j+k][i+k][wincount] = true;
wincount ++;
}
}
//斜2
for (i=0;iNMAX-4;i++) {
for (j=NMAX-1;j=4;j--) {
for (k=0;k5;k++) pt[j-k][i+k][wincount] = ct[j-k][i+k][wincount] = true;
wincount ++;
}
}
}//计算全局位置的分值
void pl::calscore(char who) {
bool (*table)[NMAX][MAX];
int (*score)[NMAX];
int iwho;
if (who == me) {
table = pt;
score = ps;
iwho = 1;
}
else {
table = ct;
score = cs;
iwho = 0;
}
srand(time(NULL));
int i,j,k;
for (i=0;iNMAX;i++) {
for (j=0;jNMAX;j++) {
score[i][j] = 0;
if (chess[i][j] == blank) {
for (k=0;kwincount;k++) {
if (!table[i][j][k]) continue;
//分值的大小影响棋子位置的选择
srand(rand());
switch (win[iwho][k]) {
case 1:
score[i][j] += 1;
break;
case 2:
score[i][j] += 10;
break;
case 3:
score[i][j] += 100;
break;
case 4:
score[i][j] += 1000;
}
}
}
}
}
}void pl::solve(int x, int y) {
calscore(me);
calscore(com);
int i,j;
int me_score,com_score;
int me_x,me_y,com_x,com_y;
me_score = com_score = -1;
//选取我方或对方得分最大值
for (i=0;iNMAX;i++) {
for (j=0;jNMAX;j++) {
if (chess[i][j] == blank) {
if (me_score ps[i][j]) {
me_score = ps[i][j];
me_x = i;
me_y = j;
}
if (com_score cs[i][j]) {
com_score = cs[i][j];
com_x = i;
com_y = j;
}
}
}
}
if (me_score com_score) {
x = me_x;
y = me_y;
}
else {
x = com_x;
y = com_y;
}
refreshscore(me,x,y);
}//更新分数
void pl::refreshscore(char who,int x,int y) {
bool (*table)[NMAX][MAX];
bool (*antitable)[NMAX][MAX];
int iwho;
if (who == me) {
table = pt;
antitable = ct;
iwho = 1;
}
else {
table = ct;
antitable = pt;
iwho = 0;
}
chess[x][y] = who;
for (int i=0;iwincount;i++) {
//一方位置能胜利次数
if (table[x][y][i] win[iwho][i] INT_MAX) win[iwho][i] ++;
if (antitable[x][y][i]) {
//另一方无法放置
antitable[x][y][i] = false;
win[1-iwho][i] = INT_MAX;
}
}
}int pl::getstep() {
return usestep;
}
急求 设计贪吃蛇实验报告
学生课程设计(论文)
题 目: 贪吃蛇游戏程序设计指导
学生姓名: 学 号:200910801001
所在院(系): 计算机学院
专 业: 计算机科学与技术
班 级: 2009级一班
指导教师: 何春燕 职称: 讲 师
2010年06月 18日
目录
摘要…………………………………………………………6
1、设计要求………………………………………………….7
2、所用仪器设备…………………………………………….7
3、具体设计过程…………………………………………….8.
3.1、程序功能……………………………………………8
3.2设计思想………………………………………………8
3.3.设计的具体实现……………………………………8.
3.4 总体流程图………………………………………….14
3.5、程序代码编写及注释………………………………..15
3.6调试问题及解决方法…………………………………21
3.7调试结果…………………………………………….22.
4设计心得体会………………………………………………25.
5、参考文献………………………………………………..26
摘 要
编写C语言程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜爱的游戏,一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,这时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。作为一个完整的程序,尤其是一个完整的游戏,必须考虑人机交流与用户体验。游戏的界面不能太丑,更不能连个简单的界面都没有。游戏应该有个比较漂亮的界面,在有必要硬件支持和软件的支持下,游戏开发者必须最大限度的使游戏美观。游戏的美观是一方面,游戏的内在素质是另一方面。一个游戏的优劣,最终由玩家决定。在游戏与玩家见面之前,游戏开发者要设计一种让玩家投入的游戏模式,并且在一定的游戏规则下进行。
关键词 贪吃蛇 流程图 c语言 源程序 turbo C
贪吃蛇游戏程序设计
1、设计要求
通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。
(1).收集资料,分析课题,分解问题,形成总体设计思路;
(2).深入分析各个小问题,列出大纲,编写各部分程序模块;
(3).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍;
(4).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行;
(5).完成课程设计报告,并进行答辩
C语言是一种易学易懂的通用程序设计语言,由于它具有功能性强,运用简洁,灵活兼有高级语言与低级语言的优点,以及“目标程序效率高”可移植性和能在各种系统上普遍实现等特点使它成为当今世界上的主流程序设计语言之一,同时被选作目前全世界广泛应用,同时也是大学生必修的科目。作为一位当代的大学生更要很好的利用它,学好一门设计语言,实现学以至用。
制作C程序报告,可以巩固和加深自己对C语言课程的基本知识的理解和掌握,并且能够掌握C语言编程和程序调试的基本技能。
通过游戏程序的设计训练可以提高自己的基本技能,更好地掌握字符串的表示方法和字符串函数的功能、Tc图形操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高自己编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高运用C语言解决实际问题的能力,巩固C语言语法规则的理解和掌握,学会通过源程序写出流程图,提高自学以及查阅资料的能力。
2、所用仪器设备
1、能正常工作的计算机一台; 2、WindowsXP;
3、TC程序; 4、Microsoft Word2003;
3、具体设计过程
3.1、程序功能
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体叉蛇头撞倒自己身体游戏结束。
3.2 设计思想
程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇。
3.3.设计的具体实现
(1)函数定义
函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用
#define N 200
#include graphics.h/*图形头文件*/
#include stdlib.h/*包含rand等函数*/
#include dos.h/*包含bios函数*/
#define LEFT 0x4b00/*光标左键值*/
#define RIGHT 0x4d00/*光标右键值*/
#define DOWN 0x5000/*光标下键值*/
#define UP 0x4800/*光标上键值*/
#define ESC 0x011b/*ESC的ASCII码*/
int i,key;/*图形坐标变量及按键变量*/
int score=0;/*得分*/
int gamespeed=10000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[];/*蛇的横坐标*/
int y[];/*蛇的纵坐标*/
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*画界面函数*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
void main(void)/*主函数*/
(2)主函数main( )
主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序
void main(void)/*主函数*/
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
void Init(void)/*图形驱动*/
{
int gd=DETECT,gm;
initgraph(gd,gm,"c:\\tc"); /*第一个参数表示图形适配器的类型,第二个为在该类型下图形的显示模式,第三个参数指定驱动程序所在目录。*/
cleardevice();
}
(3) 画界面函数DrawK( )
主界面是一个封闭的围墙,用两个循环语句分别在水平和垂直方向输出连续的宽度和高度均的矩形方块,表示围墙,为了醒目,设置为白色。
void DrawK(void)/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
{
setbkcolor(0);/*设置当前背景颜色*/
setcolor(YELLOW);/*设置当前画线颜色*/
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i=600;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49); /*上边*/
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i=450;i+=10)
{
rectangle(50,i,59,i+10); /*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
(4)游戏具体过程函数GamePlay( )
这是游戏的主要组成部分,他采用将前一节的坐标赋给后一节,用背景颜色将最后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。
void GamePlay(void)/*玩游戏具体过程*/
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;/*蛇第二节*/
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);/*食物的颜色*/
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i0;i--)/*蛇的每个环节往前移动,贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction) /*定义1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;isnake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;
break;
}
}
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||snake.y[0]455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.xsnake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*-20表示尾巴长一节*/
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
setcolor(4);
for(i=0;isnake.node;i++)/*画出蛇*/
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UPsnake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else
if(key==LEFTsnake.direction!=1)
snake.direction=2;
else
if(key==DOWNsnake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
(5)游戏结束函数GameOver( )
游戏结束,清除屏幕,输出分数,显示游戏结束信息。
void GameOver(void)/*游戏结束*/
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"guojian");
getch();
}
void PrScore(void)/*输出成绩*/
{
char str[10];
setfillstyle(SOLID_FILL, WHITE);
bar(50,15,200,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
void Close(void)/*图形结束*/
{
getch();
closegraph();
}
3.4 总体流程图
}
3.5、程序代码编写及注释
#define N 200
#include graphics.h
#include stdlib.h
#include dos.h
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(gd,gm,"c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i=600;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49); /*上边*/
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i=450;i+=10)
{
rectangle(50,i,59,i+10); /*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;isnake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;
break;
}
}
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||
snake.y[0]455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.xsnake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i=0;isnake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UPsnake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else
if(key==LEFTsnake.direction!=1)
snake.direction=2;
else
if(key==DOWNsnake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戏结束*/
3.6调试问题及解决方法
将已改好的程序复制到Turbo C时,由于软件的内容过多会出现右移,以致大部分的内容无法复制到Turbo C的界面上,最后导致软件无法运行。解决方法:在改程序时应该把格式设置好,注意左对齐,同时一行的语句尽量的短,最好是一个语句占一行。
在将程序输入到TC中,对源程序进行编译、运行,发现程序存在的多处错误, 如下图所示:
可以按照程序运行的错误提示对原程序进行修改,在调试过程中有时也会遇到不懂的问题,我去图书馆或上网查阅一些资料或者是向老师请教也解决了对源程序一一修改直到运行成功。
3.7调试结果
1. 下图为程序调试编译结果:
2下图为程序调试运行结果(即贪吃蛇游戏界面)
4设计心得体会
经过短短两星期的计算机软件技术实习,让我对C程序有了一个更深的了解,以前总认为C语言很枯燥,认为那些我们所设计的程序没有什么用处,但现在通过设计贪吃蛇游戏这个程序使我懂得了如何将所学的知识运用于生活当中。虽然在刚开始设计程序时不太明白如何去设计这程序,但当我看完《C语言课程设计案例精编》并用C语言做出这个贪吃蛇程序后,让我深深感受到C程序的神奇。
在设计这个程序中我主要学会了如何运用以下有关C语言的知识
1) 函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序
十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增
加了程序的可读性。
2) 分析函数先从main()函数入手。Main()函数是C源程序编译时的开始,
从main()函数开始读函数可将其他函数的功能理解得更透彻。
3) 在做程序的时候先列框架,将这个程序所要达到的目的(功能)分析出
来,选择正确的数据结构然后在将程序模块化,按照模块编写函数更加简单合理。
4) 我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行
处理的函数,起功能我都有所了解。
同时我也获得了许多宝贵的经验:
1) 在设计程序之前,务必要对你所设计的题目和内容有一个系统的了解,
知道所设计的题目和内容包含那些资源。
2) 设计程序采用什么编程语言并不是非常重要,关键要有一个清晰的思路
和一个完整的软件流程图,因而,要先把设计原理与思路搞清楚,再把流程图画出来,这样设计起来就简单多了。
3) 在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改
进”是程序设计的必经之路,发现错误也是取得成绩的一种。
4) 要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而
应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。
5、参考文献
1.郭翠英,《C语言课程设计案例精编》,中国水利水电出版社,2004.3
2徐金梧,杨德斌等,《TURBO C实用大全》,机械工程出版社,1996.5
3李丽娟 《C语言程序设计教程》 人民邮电出版社
4林华聪 《C语言程序设计思想与实践》 冶金工业出版社
5张继温 《C语言程序设计教程》 高等教育出版社
6 潘云鹤,董金祥等著.计算机图形学——原理、方法及应用.北京:高等教育出版社,2003.12
7 孙家广等,计算机图形学(第三版),清华大学出版社,2004
8 陈元琰编著.计算机图形学实用技术.北京:科学出版社,2000
9和青芳著.计算机图形学原理及算法教程.北京:清华大学出版社
10 陆润民.C语言绘图教程.北京:清华大学出版社,1996
c语言实训贪吃蛇报告书
《高级语言程序设计》课程设计 实验报告
题目:贪吃蛇
专业:计算机
班级: 软件
姓名:
成绩:
指导教师:
完成日期:2008年09月23日
一、目的
1. 进一步掌握和利用C语言进行程设计的能力;
2、 进一步理解和运用结构化程设计的思想和方法;
3、 初步掌握开发一个小型实用系统的基本方法;
4、 学会调试一个较长程序的基本方法;
5、 学会利用流程图或N-S图表示算法;
6、 掌握书写程设计开发文档的能力(书写课程设计报告);
二、内容与设计思想。
(1).系统功能与分析(填写你所设计的菜单及流程图)。
功能:进行贪食蛇游戏
分析:定义键盘方向键操作,随机数发生器产生食物,并分别利用函数判断贪食蛇的长度及游戏是否成功等.
并能够输入游戏成绩.
(2).数据结构
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
}
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
(3).模块设计
根据功能需要:
源文件 :#include stdio.h
#include graphics.h
#include stdlib.h
#include dos.h
函数名 功能
void main() 游戏主程序
void Init(void); 图形驱动
void Close(void); 图形结束
void DrawK(void); 开始画面
void GameOver(void); 结束游戏
void GamePlay(void); 玩游戏具体过程
void PrScore(void); 输出成绩
(3)总体设计思想:
利用图形驱动,制作美观的游戏界面.
通过随机函数产生随机数,控制游戏过程食物的出现.
定义键盘操作,控制游戏过程蛇的移动方向.
画出边界,并判断游戏是否结束.
统计游戏过程蛇吃的食物数量,计算并输出游戏成绩.
(4)调试过程: 测试数据及结果,出现了哪些问题,如何修改的
这里,你就写一下你平时出错的地方,与如何修改的.这里我也不好帮你写.
(5)程序有待改进的地方及本次实习的收获和建议
收获:加深认识了程序编译过程的中团队合作的重要性.
提高了自己的编程能力
(7)源程序清单(主要代码)
清单只要将上面的程序全部粘帖就可以了.
谁能帮我写程序设计实训报告呀
只是个例子,不可照抄。
实验内容与要求:
[实验内容]
1、 通过本试验初步培养计算机逻辑解题能力。熟练掌握赋值语句和if语句的应用;掌握switch多路分支语句和if嵌套语句的使用
2、 将前期所学习到的基本数据类型、运算符和表达式等程序设计基础知识运用于具体的程序设计。
3、 进一步熟练掌握输入输出函数scanf, printf和getchar的使用,熟悉math.h中常用数学函数的使用方法
4、 掌握循环语句的应用方法。
5、 了解随机数生成函数。
[实验要求]
在规定期限独立完成实验内容
1、 提交实验报告(电子版)
2、 提交相应源程序文件(文件名 EX6_x姓名.c, 如EX6_1彭健.c)
3、 要求从简单到复杂,后面的要求均在前面的基础上进行修改,前六题,每题均需要保留各自的程序,六题以后,每题均在前一题基础上修改,保留最后一个程序即可(如做到第九题,则保留EX6_9姓名.c,做到第11题,则保留ex6_11姓名.c)
二、实验原理和设计方案:
1、函数头的选则,while循环语句,switch(case)语句,条件表达式,if else条件语句,自增运算符,设置复杂变量,输出随机操作数。
2、 变量要有分数变量和等级变量,要有选择算法题数的变量和计算正确与否的变量,要有随机输出的两个操作数变量和自己按运算符号输入结果的变量,最后还有判断是否要进行的变量字符。中间结果有选择运算符的switch()和分数等级的switch()和错题对题的自增和选择运算符计算的自增。
3、 问题的分析方法:先考虑设置整形变量和字符变量,考虑到要不断循环计算,选择用while语句来循环。在循环体中,将前面的输出提示运算符,和自行选择运算符、答案及输出随机操作数完成。再用switch语句对选择的运算符进行判断,并用变量进行自增运算,计算出错题于对题个数和选择了那种运算符号。在循环体最后用if else语句来判断是否继续执行还是跳出循环。最后根据自增计算的结果和公式进行分数计算,并用switch语句来是想等级的制定。
三、源代码
#includestdio.h
#includestdlib.h
#includetime.h
void main()
{
..........
}
四、试验结果和启发
因为输入y要继续循环,所以选择用while语句。在while语句中要结合前面的按提示计算,并嵌套switch语句并用条件表达式,来计算结果正确与否,计算的题型是什么。最后再用switch语句来完成分数等级的判断。
五、实验体会:
描述自己在编程或程序编译运行中遇到的难点和问题及解决的办法。
c语言程序设计实验报告80~100行,关于一种小游戏的,语句简单些,
#include stdio.h
#include stdlib.h
#include conio.h
#define MAX_PARKING_SIZE 10//停车场最大停车数量
#define PRIZE 10.00//停留每小时单价
#define true 1
#define false 0
typedef struct stack
{
long pos[MAX_PARKING_SIZE];//存储车牌号码
int time[MAX_PARKING_SIZE];//存储进入车站的时间
int point;//最后一辆车的位置指针
}Stack;//定义栈-模拟停车场
typedef struct queue
{
int num;//存储车牌号
struct queue *next;//指向下一辆车
}Queue;//定义队列-模拟停车场外
void InitStack(Stack *s)
{
s-point=-1;
}//初始化栈
Queue *InitQueue()//初始化队列
{
Queue *q;
q=(Queue *)malloc(sizeof(Queue));
q-next=NULL;
return q;
}
int StackPop(Stack *s,long *i,int *j)//退栈函数
{
if(s-point==-1)return false;
else
{
*i=s-pos[s-point];
*j=s-time[s-point];
s-point--;
return true;
}
}
int StackPush(Stack *s,long i,int j)//压栈函数
{
if(s-point==MAX_PARKING_SIZE-1)return false;
else
{
s-point++;
s-pos[s-point]=i;
s-time[s-point]=j;
return true;
}
}
int QueuePop(Queue **qH,long *i)//退队函数
{
Queue *temp;
if((*qH)-next==NULL)return false;
else
{
temp=(*qH)-next;
(*qH)-next=temp-next;
*i=temp-num;
free(temp);
return true;
}
}
int QueuePush(Queue **q,long i)//入队函数
{
Queue *temp;
if((temp=(Queue *)malloc(sizeof(Queue)))==NULL)return false;
else
{
(*q)-next=temp;
temp-num=i;
temp-next=NULL;
*q=temp;
return true;
}
}
int main()
{
int time,i,j,inStack,inQueue;
long num;
char state;
Stack park;
Queue *H,*p,*temp,*temp2;
H=InitQueue();
p=H;
system("color 9E");
InitStack(park);//初始化队列和栈
printf("**********这里是停车场管理程序,欢迎使用**************\n");
printf("\n停车场最大能停车%d辆,停车时间不得超过24小时,现在停车的单价为每小时%.2f元\n",MAX_PARKING_SIZE,PRIZE);
while(1)
{
inStack=inQueue=0;temp=H;
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 停车场管理系统 ┃\n");
printf("┃ (A或a)汽车到达和已到汽车查询 ┃\n");
printf("┃ (D或d)汽车离开 ┃\n");
printf("┃ (E或e)程序退出 ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n您的选择是:");
state=getche();
if(state=='a'||state=='A'||state=='d'||state=='D')
{
printf("\n输入车牌号(数字):");
scanf("%ld",num);
printf("\n输入到达或查询或离开的的时间(24小时制,单位:小时):");
scanf("%d",time);
}
if(state=='a'||state=='A')
{
for(i=0;i=park.point;i++)
if(park.pos[i]==num)
{
inStack=1;
break;
}//在车站中查找
for(j=1;temp-next!=NULL;j++)
{
temp2=temp;
temp=temp2-next;
if(temp-num==num)
{
inQueue=1;
break;
}
}//在车站外查找
if(inStack)
printf("\n查询结果:输入的汽车已经在车站中第%d个位置停留了%d个小时!\n",i+1,timepark.time[i]?time-park.time[i]:time+24-park.time[i]);
else if(inQueue)
printf("\n查询结果:输入的汽车已经在车站外第%d个位置等候\n",j);
else
{
if(StackPush(park,num,time)==false)
{
QueuePush(p,num);
printf("\n车站已满,车辆停在场外。\n");
}
else printf("\n车辆成功进站!\n");
}//如果车辆到达,当车站已满,停在车站外,否则,进入车站
}
else if(state=='d'||state=='D')//如果是离开
{
for(i=0;i=park.point;i++)
if(park.pos[i]==num)
{
inStack=1;
break;
}//在车站中查找
if(inStack)//如果在车站中
{
printf("正要离开的汽车在车站中第%d个位置停留了%d个小时,应付%.2f元\n",i+1,timepark.time[i]?time-park.time[i]:time+24-park.time[i],timepark.time[i]?(time-park.time[i])*PRIZE:(time+24-park.time[i])*PRIZE);
while(ipark.point)
{
park.pos[i]=park.pos[i+1];
park.time[i]=park.time[i+1];
i++;
}
park.point--;//把离开的车辆从车站中删除
if(H-next!=NULL)
{
QueuePop(H,num);
if(H-next==NULL)p=H;
StackPush(park,num,time);
printf("\n停车场空出一位置。场外等候的%d号汽车入站了!\n",num);
}//如果车站外有车,入站
}
else//不在车站中
{
for(i=1;temp-next!=NULL;i++)
{
temp2=temp;temp=temp2-next;
if(temp-num==num)
{
inQueue=1;
break;
}
}//查找是否在车站外
if(inQueue)
{
printf("\n汽车在停车场外,不收费\n",i);
temp2-next=temp-next;
if(temp==p)p=temp2;
free(temp);
}//在车站外
else printf("\n对不起,您输入了不存在的车牌号!\n");
}
}
else if(state=='e'||state=='E')
{
printf("\n");
break;
}
else printf("\n输入错误!\n");
}
return 0;
}