使用C语言编写小游戏的方法是什么?
//声明
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#define SIZE 4
static int score=0
void putn(int n[][SIZE])
void getn(int n[][SIZE])
int isempty(int n[][SIZE])
int isfull(int n[][SIZE])
void math(int n[][SIZE],char c)
void tow(int n[][SIZE])
void toa(int n[][SIZE])
void tos(int n[][SIZE])
void tod(int n[][SIZE])
//主函数
int main()
{
int i,j
int n[SIZE][SIZE]
char c=' '
for(i=0i<SIZEi++)
{
for(j=0j<SIZEj++)
{
n[i][j]=0
}
}
printf( "***********************\n"
" 2048(%dX%d) \n"
" control:W/A/S/D \n"
"press any key to begin \n"
"***********************\n",SIZE,SIZE)
getch()
system("cls")
//n[0][1]=2048
//n[0][3]=2048
while(1)
{
if(isempty(n))
getn(n)
putn(n)
if(!isempty(n)&&isfull(n))
break
sleep(200)
c=getch()
while(c!='w'&&c!='a'&&c!='s'&&c!='d')
c=getch()
math(n,c)
system("cls")
}
printf(" Game Over!\n",score)
return 0
}
//函数
void putn(int n[][SIZE])
{
int i,j
for(i=0i<SIZEi++)
{
for(j=0j<SIZEj++)
printf("| ")
printf("|\n")
for(j=0j<SIZEj++)
{
if(n[i][j]==0)
printf("| ")
else
printf("|%4d ",n[i][j])
}
printf("|\n")
for(j=0j<SIZEj++)
printf("|_____")
printf("|\n")
}
printf("score: %d",score)
}
void getn(int n[][SIZE])
{
int a,b
a=rand()%SIZE
b=rand()%SIZE
while(n[a][b]!=0)
{
a=rand()%SIZE
b=rand()%SIZE
}
n[a][b]=2
}
int isempty(int n[][SIZE])
{
int i,j,count=0
for(i=0i<SIZEi++)
for(j=0j<SIZEj++)
if(n[i][j]==0)
count++
return count
}
int isfull(int n[][SIZE])
{
int i,j,count=0
for(i=0i<SIZEi++)
{
for(j=1j<SIZE-1j++)
{
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
count++
}
}
for(j=0j<SIZEj++)
{
for(i=1i<SIZE-1i++)
{
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
count++
}
}
return count>0?0:1
}
void math(int n[][SIZE],char c)
{
switch(c)
{
case 'w':tow(n)break
case 'a':toa(n)break
case 's':tos(n)break
case 'd':tod(n)break
default :
}
}
void tow(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(j=0j<SIZEj++)
{
for(a=0a<SIZEa++)
{
for(i=0i<SIZE-1i++)
{
if(n[i][j]==0)
{
n[i][j]=n[i+1][j]
n[i+1][j]=0
}
}
}
}
for(j=0j<SIZEj++)
{
for(a=0,i=0i<SIZEi++)
{
if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i+1][j])
{
m[a++]=n[i][j]+n[i+1][j]
score+=m[a-1]
n[i][j]=0,n[i+1][j]=0
}
}
for(i=0i<SIZEi++)
{
n[i][j]=m[i]
m[i]=0
}
}
}
void toa(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(i=0i<SIZEi++)
{
for(a=0a<SIZEa++)
{
for(j=0j<SIZE-1j++)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j+1]
n[i][j+1]=0
}
}
}
}
for(i=0i<SIZEi++)
{
for(a=0,j=0j<SIZEj++)
{
if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i][j+1])
{
m[a++]=n[i][j]+n[i][j+1]
score+=m[a-1]
n[i][j]=0,n[i][j+1]=0
}
}
for(j=0j<SIZEj++)
{
n[i][j]=m[j]
m[j]=0
}
}
}
void tos(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(j=SIZE-1j>=0j--)
{
for(a=SIZE-1a>=0a--)
{
for(i=SIZE-1i>0i--)
{
if(n[i][j]==0)
{
n[i][j]=n[i-1][j]
n[i-1][j]=0
}
}
}
}
for(j=SIZE-1j>=0j--)
{
for(a=SIZE-1,i=SIZE-1i>=0i--)
{
if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i-1][j])
{
m[a--]=n[i][j]+n[i-1][j]
score+=m[a+1]
n[i][j]=0,n[i-1][j]=0
}
}
for(i=SIZE-1i>=0i--)
{
n[i][j]=m[i]
m[i]=0
}
}
}
void tod(int n[][SIZE])
{
int i,j,a
int m[SIZE]
for(a=0a<SIZEa++)
m[a]=0
for(i=SIZE-1i>=0i--)
{
for(a=SIZE-1a>=0a--)
{
for(j=SIZE-1j>0j--)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j-1]
n[i][j-1]=0
}
}
}
}
for(i=SIZE-1i>=0i--)
{
for(a=SIZE-1,j=SIZE-1j>=0j--)
{
if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j]
n[i][j]=0
}
else if(n[i][j]==n[i][j-1])
{
m[a--]=n[i][j]+n[i][j-1]
score+=m[a+1]
n[i][j]=0,n[i][j-1]=0
}
}
for(j=SIZE-1j>=0j--)
{
n[i][j]=m[j]
m[j]=0
}
}
}
需要注意的是:
srand((unsigned) time(0)rand()是固定形式,不要更改任何一个字符!
如果不能编译,请把sleep(200)注释掉,如果提示不能找到system("cls")请把system("cls")更换为clrscr()。
c语言中没有类,只有结构,也可以像类一样编写,用结构,但其成员都是公开访问的,C++才有真正的类。
你可以先去【绘学霸】网站找“游戏设计/游戏制作”板块的【免费】视频教程-【点击进入】完整入门到精通视频教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=307&zdhhr-11y04r-1818074554951406228
想要系统的学习可以考虑报一个网络直播课,推荐CGWANG的网络课。老师讲得细,上完还可以回看,还有同类型录播课可以免费学(赠送终身VIP)。
自制能力相对较弱的话,建议还是去好点的培训机构,实力和规模在国内排名前几的大机构,推荐行业龙头:王氏教育。
王氏教育全国直营校区面授课程试听【复制后面链接在浏览器也可打开】: www.huixueba.com.cn/school/3dmodel?type=2&zdhhr-11y04r-1818074554951406228
在“游戏设计/游戏制作”领域的培训机构里,【王氏教育】是国内的老大,且没有加盟分校,都是总部直营的连锁校区。跟很多其它同类型大机构不一样的是:王氏教育每个校区都是实体面授,老师是手把手教,而且有专门的班主任从早盯到晚,爆肝式的学习模式,提升会很快,特别适合基础差的学生。
大家可以先把【绘学霸】APP下载到自己手机,方便碎片时间学习——绘学霸APP下载:www.huixueba.com.cn/Scripts/download.html
"扫雷"小游戏C代码
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
main( )
{char a[102][102],b[102][102],c[102][102],w
int i,j
int x,y,z[999]
int t,s
int m,n,lei
int u,v
int hang,lie,ge,mo
srand((int)time(NULL))
leb1:
printf("\n 请选择模式:\n 1.标准 2.自定义\n")
scanf("%d",&mo)
if(mo==2)
{do
{t=0printf("请输入\n行数 列数 雷的个数\n")
scanf("%d%d%d",&hang,&lie,&ge)
if(hang<2){printf("行数太少\n")t=1}
if(hang>100){printf("行数太多\n")t=1}
if(lie<2){printf("列数太少\n")t=1}
if(lie>100){printf("列数太多\n")t=1}
if(ge<1){printf("至少要有一个雷\n")t=1}
if(ge>=(hang*lie)){printf("雷太多了\n")t=1}
}while(t==1)
}
else{hang=10,lie=10,ge=10}
for(i=1i<=gei=i+1)
{do
{t=0z[i]=rand( )%(hang*lie)
for(j=1j<ij=j+1){if(z[i]==z[j]) t=1}
}while(t==1)
}
for(i=0i<=hang+1i=i+1)
{for(j=0j<=lie+1j=j+1) {a[i][j]='1'b[i][j]='1'c[i][j]='0'} }
for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1) {a[i][j]='+'} }
for(i=1i<=gei=i+1)
{x=z[i]/lie+1y=z[i]%lie+1c[x][y]='#'}
for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1)
{m=48
if(c[i-1][j-1]=='#')m=m+1if(c[i][j-1]=='#')m=m+1
if(c[i-1][j]=='#')m=m+1 if(c[i+1][j+1]=='#')m=m+1
if(c[i][j+1]=='#')m=m+1 if(c[i+1][j]=='#')m=m+1
if(c[i+1][j-1]=='#')m=m+1if(c[i-1][j+1]=='#')m=m+1
b[i][j]=m
}
}
for(i=1i<=gei=i+1)
{x=z[i]/lie+1y=z[i]%lie+1b[x][y]='#'}
lei=ge
do
{leb2:
system("cls")printf("\n\n\n\n")
printf(" ")
for(i=1i<=liei=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c ",w)
}
printf("\n |")
for(i=1i<=liei=i+1){printf("---|")}
printf("\n")
for(i=1i<=hangi=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c |",w)
for(j=1j<=liej=j+1)
{if(a[i][j]=='0')printf(" |")
else printf(" %c |",a[i][j])
}
if(i==2)printf(" 剩余雷个数")
if(i==3)printf(" %d",lei)
printf("\n |")
for(j=1j<=liej=j+1){printf("---|")}
printf("\n")
}
scanf("%d%c%d",&u,&w,&v)
u=u+1,v=v+1
if(w!='#'&&a[u][v]=='@')
goto leb2
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'lei=lei-1}
else if(a[u][v]=='@'){a[u][v]='?'lei=lei+1}
else if(a[u][v]=='?'){a[u][v]='+'}
goto leb2
}
a[u][v]=b[u][v]
leb3:
t=0
if(a[u][v]=='0')
{for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=1i<=hangi=i+1)
{for(j=liej>=1j=j-1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=hangi>=1i=i-1)
{for(j=1j<=liej=j+1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=hangi>=1i=i-1)
{for(j=liej>=1j=j-1)
{s=0
if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1
if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1
if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1
if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1
if(s==1)a[i][j]=b[i][j]
}
}
for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1
}
}
}
if(t==1)goto leb3
}
n=0
for(i=1i<=hangi=i+1)
{for(j=1j<=liej=j+1)
{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1}
}
}
while(a[u][v]!='#'&&n!=(hang*lie-ge))
for(i=1i<=gei=i+1)
{x=z[i]/lie+1y=z[i]%lie+1a[x][y]='#'}
printf(" ")
for(i=1i<=liei=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c ",w)
}
printf("\n |")
for(i=1i<=liei=i+1){printf("---|")}
printf("\n")
for(i=1i<=hangi=i+1)
{w=(i-1)/10+48printf("%c",w)
w=(i-1)%10+48printf("%c |",w)
for(j=1j<=liej=j+1)
{if(a[i][j]=='0')printf(" |")
else printf(" %c |",a[i][j])
}
if(i==2)printf(" 剩余雷个数")
if(i==3)printf(" %d",lei)printf("\n |")
for(j=1j<=liej=j+1) {printf("---|")}
printf("\n")
}
if(n==(hang*lie-ge)) printf("你成功了!\n")
else printf(" 游戏结束!\n")
printf(" 重玩请输入1\n")
t=0
scanf("%d",&t)
if(t==1)goto leb1
}
2.1程序功能介绍
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
2.2程序整体设计说明
一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。
2.2.1设计思路
这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块
2.2.2数据结构设计及用法说明
开始部分:
游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重 要变量的初始化。
运行部分:
作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:某个世界上突然出现一条蛇,它很短,它的运动神经异常,它没法停止自己的多动症在它的世界里就只有食物,它很饿,也很贪吃;同样在不明原因的情况下,食物从天而降,可惜的是没有落到嘴边;饥饿的主人公,不管它有没有毒,也不问食物的来历,径直向食物爬去;它吃到食物啦,它超出想象的同化能力让食物很快的成为自己身体的一部分,它的身子变长啦。当它吃到第一颗食物时,上帝有给它第二颗,于是它吃了第二颗,于是又变长了,于是又有第三颗??它的身子是一直的加长,它不管自己过长身体的麻烦——转身不便,继续吃下去,现在它是直接把巴张大,好让食物有个绿色通道。但是在某天的下午,它咬到了自己,它才想起自己是一条毒蛇,于是晕死过去(不是毒死);又或者它往食物冲锋的时候,它失去控制,撞到了墙上。
第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到自己或墙壁;由第四步起游戏有两条支线(A、B):
A :第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;
B:第四步,蛇碰到自己或墙壁,终止游戏。
结束部分:
游戏结束时,显示“GAME OVER”,已经是约定俗成的规律了,我的游戏也不例外。除了游戏结束画面外,我还设置了一个游戏退出画面,“善始善终”嘛。
有了上述的大致划分,我把整个程序划分成(13+2)个模块(其实就是函数)
2.2.3程序结构(流程图)
图2.1流程图
依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。
C语言中数据结构集中体现在数据类型上,因此在进行C语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。
现在分析一下贪吃蛇游戏中的元素,继而得出与它们对应的在程序中的描述:
蛇:
基本描述:长度,颜色,位置。
对应数据与数据类型:长度—虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位—节数,以固定长度的每节描述;坐标--整型;颜色--整型; 位置--X,Y坐标。
增加的描述:蛇运动的方向,蛇的生命。
对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整型数:3、4、2、1。生命就只有两种情况:死或生,对应0或1。
食物:
基本描述:颜色,位置。
对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置—X、Y坐标。
增加的描述:食物的存在。
对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0或1(没有食物或有食物)
其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。
还需要的变量:键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。
图2.2蛇的不停运动的关键算法的流程图
2.2.4各模块的功能及程序说明
主要模块的实现思路和算法的流程图说明:
关键所在——蛇不停移动的Snakemove():
蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有i+1节,由0到i节,第i节的坐标取第i-1节的坐标,第i-1节的坐标取第i-2节的坐标??直到第1节取第0节的坐标。而第0节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。
2.2.5程序结果
运行程序得到如下初始界面图:
图2.3程序结果图
用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示:
图2.4程序结果图
蛇没有碰到自己或墙壁,蛇继续前进:
图2.5程序结果图
游戏结束时,显示“GAME OVER”
图2.6程序结果图
2.3程序源代码及注释
#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
}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
registerbgidriver(EGAVGA_driver)
initgraph(&gd,&gm,"c:\\program files\\winyes\\tc20h\\bgi")
cleardevice()}
void DrawK(void){
setcolor(11)
setlinestyle(SOLID_LINE,0,THICK_WIDTH)
for(i=50i<=600i+=10) {
rectangle(i,40,i+10,49)
rectangle(i,451,i+10,460) }
for(i=40i<=450i+=10) {
rectangle(50,i,59,i+10)
rectangle(601,i,610,i+10) }}
void GamePlay(void){
randomize()
food.yes=1
snake.life=0
snake.direction=1
snake.x[0]=100snake.y[0]=100
snake.x[1]=110snake.y[1]=100
snake.node=2
PrScore()
while(1) {
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-1i>0i--) {
snake.x[i]=snake.x[i-1]
snake.y[i]=snake.y[i-1] }
switch(snake.direction) {
case 1:snake.x[0]+=10break
case 2: snake.x[0]-=10break
case 3: snake.y[0]-=10break
case 4: snake.y[0]+=10break }
for(i=3i<snake.nodei++) {
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.x&&snake.y[0]==food.y) {
setcolor(0)
rectangle(food.x,food.y,food.x+10,food.y-10)
snake.x[snake.node]=-20snake.y[snake.node]=-20
snake.node++
food.yes=1
score+=10
PrScore() }
setcolor(4)
for(i=0i<snake.nodei++)
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) }
if(snake.life==1)
break
key=bioskey(0)
if(key==ESC)
break
else
if(key==UP&&snake.direction!=4)
snake.direction=3
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4
}}
void GameOver(void){
cleardevice()
PrScore()
setcolor(RED)
settextstyle(0,0,4)
outtextxy(200,200,"GAME OVER")
getch()}
void PrScore(void){
char str[10]
setfillstyle(SOLID_FILL,YELLOW)
bar(50,15,220,35)
setcolor(6)
settextstyle(0,0,2)
sprintf(str,"score:%d",score)
outtextxy(55,20,str)}
void Close(void){
getch()
closegraph()
}
#include "graphics.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define ENTER 0x1c0d
int a[8][8]={0},key,score1,score2
char playone[3],playtwo[3]
void playtoplay(void)
void DrawQp(void)
void SetPlayColor(int x)
void MoveColor(int x,int y)
int QpChange(int x,int y,int z)
void DoScore(void)
void PrintScore(int n)
void playWin(void)
void main(void)
{
int gd=DETECT,gr
initgraph(&gd,&gr,"c:\\tc")
DrawQp()
playtoplay()
getch()
closegraph()
}
void DrawQp()
{
int i,j
score1=score2=0
setbkcolor(BLUE)
for(i=100i<=420i+=40)
{
line(100,i,420,i)
line(i,100,i,420)
}
setcolor(0)
setfillstyle(SOLID_FILL,15)
fillellipse(500,200,15,15)
setfillstyle(SOLID_FILL,8)
fillellipse(500,300,15,15)
a[3][3]=a[4][4]=1
a[3][4]=a[4][3]=2
setfillstyle(SOLID_FILL,WHITE)
fillellipse(120+3*40,120+3*40,15,15)
fillellipse(120+4*40,120+4*40,15,15)
setfillstyle(SOLID_FILL,8)
fillellipse(120+3*40,120+4*40,15,15)
fillellipse(120+4*40,120+3*40,15,15)
score1=score2=2
DoScore()
}
void playtoplay()
{
int x,y,t=1,i,j,cc=0
while(1)
{
x=120,y=80
while(1)
{
PrintScore(1)
PrintScore(2)
SetPlayColor(t)
fillellipse(x,y,15,15)
key=bioskey(0)
if(key==ESC)
break
else
if(key==ENTER)
{
if(y!=80&&a[(x-120)/40][(y-120)/40]!=1
&&a[(x-120)/40][(y-120)/40]!=2)
{
if(t%2==1)
a[(x-120)/40][(y-120)/40]=1
else
a[(x-120)/40][(y-120)/40]=2
if(!QpChange(x,y,t))
{
a[(x-120)/40][(y-120)/40]=0
cc++
if(cc>=64-score1-score2)
{
MoveColor(x,y)
fillellipse(x,y,15,15)
break
}
else
continue
}
DoScore()
break
}
else
continue
}
else
if(key==LEFT&&x>120)
{
MoveColor(x,y)
fillellipse(x,y,15,15)
SetPlayColor(t)
x-=40
fillellipse(x,y,15,15)
}
else
if(key==RIGHT&&x<400&&y>80)
{
MoveColor(x,y)
fillellipse(x,y,15,15)
SetPlayColor(t)
x+=40
fillellipse(x,y,15,15)
}
else
if(key==UP&&y>120)
{
MoveColor(x,y)
fillellipse(x,y,15,15)
SetPlayColor(t)
y-=40
fillellipse(x,y,15,15)
}
else
if(key==DOWN&&y<400)
{
MoveColor(x,y)
fillellipse(x,y,15,15)
SetPlayColor(t)
y+=40
fillellipse(x,y,15,15)
}
}
if(key==ESC)
break
if((score1+score2)==64||score1==0||score2==0)
{
playWin()
break
}
t=t%2+1
cc=0
}
}
void SetPlayColor(int t)
{
if(t%2==1)
setfillstyle(SOLID_FILL,15)
else
setfillstyle(SOLID_FILL,8)
}
void MoveColor(int x,int y)
{
if(y<100)
setfillstyle(SOLID_FILL,BLUE)
else
switch(a[(x-120)/40][(y-120)/40])
{
case 1:
setfillstyle(SOLID_FILL,15)break
case 2:
setfillstyle(SOLID_FILL,8)break
default:
setfillstyle(SOLID_FILL,BLUE)
}
}
int QpChange(int x,int y,int t)
{
int i,j,k,kk,ii,jj,yes
yes=0
i=(x-120)/40
j=(y-120)/40
SetPlayColor(t)
if(j<6)
{
for(k=j+1k<8k++)
if(a[i][k]==a[i][j]||a[i][k]==0)
break
if(a[i][k]!=0&&k<8)
{
for(kk=j+1kk<k&&k<8kk++)
{
a[i][kk]=a[i][j]
fillellipse(120+i*40,120+kk*40,15,15)
}
if(kk!=j+1)
yes=1
}
}
if(j>1)
{
for(k=j-1k>=0k--)
if(a[i][k]==a[i][j]||!a[i][k])
break
if(a[i][k]!=0&&k>=0)
{
for(kk=j-1kk>k&&k>=0kk--)
{
a[i][kk]=a[i][j]
fillellipse(120+i*40,120+kk*40,15,15)
}
if(kk!=j-1)
yes=1
}
}
if(i<6)
{
for(k=i+1k<8k++)
if(a[k][j]==a[i][j]||!a[k][j])
break
if(a[k][j]!=0&&k<8)
{
for(kk=i+1kk<k&&k<8kk++)
{
a[kk][j]=a[i][j]
fillellipse(120+kk*40,120+j*40,15,15)
}
if(kk!=i+1)
yes=1
}
}
if(i>1)
{
for(k=i-1k>=0k--)
if(a[k][j]==a[i][j]||!a[k][j])
break
if(a[k][j]!=0&&k>=0)
{
for(kk=i-1kk>k&&k>=0kk--)
{
a[kk][j]=a[i][j]
fillellipse(120+kk*40,120+j*40,15,15)
}
if(kk!=i-1)
yes=1
}
}
if(i>1&&j<6)
{
for(k=i-1,kk=j+1k>=0&&kk<8k--,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break
if(a[k][kk]&&k>=0&&kk<8)
{
for(ii=i-1,jj=j+1ii>k&&k>=0ii--,jj++)
{
a[ii][jj]=a[i][j]
fillellipse(120+ii*40,120+jj*40,15,15)
}
if(ii!=i-1)
yes=1
}
}
if(i<6&&j>1)
{
for(k=i+1,kk=j-1k<8&&kk>=0k++,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break
if(a[k][kk]!=0&&k<8&&kk>=0)
{
for(ii=i+1,jj=j-1ii<k&&k<8ii++,jj--)
{
a[ii][jj]=a[i][j]
fillellipse(120+ii*40,120+jj*40,15,15)
}
if(ii!=i+1)
yes=1
}
}
if(i>1&&j>1)
{
for(k=i-1,kk=j-1k>=0&&kk>=0k--,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break
if(a[k][kk]!=0&&k>=0&&kk>=0)
{
for(ii=i-1,jj=j-1ii>k&&k>=0ii--,jj--)
{
a[ii][jj]=a[i][j]
fillellipse(120+ii*40,120+jj*40,15,15)
}
if(ii!=i-1)
yes=1
}
}
if(i<6&&j<6)
{
for(k=i+1,kk=j+1kk<8&&kk<8k++,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break
if(a[k][kk]!=0&&kk<8&&k<8)
{
for(ii=i+1,jj=j+1ii<k&&k<8ii++,jj++)
{
a[ii][jj]=a[i][j]
fillellipse(120+ii*40,120+jj*40,15,15)
}
if(ii!=i+1)
yes=1
}
}
return yes
}
void DoScore()
{
int i,j
score1=score2=0
for(i=0i<8i++)
for(j=0j<8j++)
if(a[i][j]==1)
score1++
else
if(a[i][j]==2)
score2++
}
void PrintScore(int playnum)
{
if(playnum==1)
{
setfillstyle(SOLID_FILL,BLUE)
bar(550,100,640,400)
}
setcolor(RED)
settextstyle(0,0,4)
if(playnum==1)
{
sprintf(playone,"%d",score1)
outtextxy(550,200,playone)
}
else
{
sprintf(playtwo,"%d",score2)
outtextxy(550,300,playtwo)
}
setcolor(0)
}
void playWin()
{
settextstyle(0,0,4)
setcolor(12)
if(score2>score1)
outtextxy(100,50,"black win!")
else
if(score2<score1)
outtextxy(100,50,"white win!")
else
outtextxy(60,50,"you all win!")
}
// greedsnake.cpp
#include <bios.h>
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
#include "conf.h"
typedef struct node
{
int x,y
struct node *next
}Node
typedef struct
{
Node *head,*tail
int length
}Snake
typedef struct
{
int left,top,right,bottom
}Frame
typedef enum //四个方向
{
up,down,left,right
}Direction
typedef enum
{
false,true
}bool//*/
void InitGraphMode()//初始化图形驱动
void CloseGraphMode()
void Foot(int,int)
void Head(int,int)
void CreateFrame()//完成整个游戏框架的绘制
void CreateSnake()//创建一条两个节点的蛇,蛇的每一节是队列中的一个节点
bool PlayGame()//游戏的主体函数,
int Hit(int,int) //判断是否越界,或者撞到自身,两个参数分别是新的头接点的x,y坐标
bool GameOver()//绘制游戏结束时弹出的对话框
void Enqueue(Node)//入队函数
Node Dequeue()//出队函数
void ClearKeyBuf()//清除键盘缓冲,此函数可以消除不停的按无效键的影响
Snake snake
Frame frame
void main()
{
InitGraphMode()
do
{
CreateFrame()
}while(PlayGame())
CloseGraphMode()
}
void InitGraphMode()
{
int gdriver=DETECT,gmode
initgraph(&gdriver,&gmode,"../bgi/")
cleardevice()
}
void CloseGraphMode()
{
cleardevice()
closegraph()
}
void CreateFrame()
{
setbkcolor(CYAN)
//下面的四行代码用于计算主框架的左上角和右下角的坐标
frame.left=(getmaxx()+1-BlockWidth*RowOfFrame)/2
frame.top=(getmaxy()+1-BlockHeight*ColumnOfFrame)/2
frame.right=frame.left+BlockWidth*RowOfFrame
frame.bottom=frame.top+BlockHeight*ColumnOfFrame
Head(frame.left+100,frame.top-20)
setfillstyle(SOLID_FILL,LIGHTGRAY)
bar(frame.left,frame.top,frame.right,frame.bottom)
setlinestyle(SOLID_LINE,1,1)
setcolor(DARKGRAY)
line(frame.left,frame.top,frame.right,frame.top)
line(frame.left,frame.top,frame.left,frame.bottom)
setlinestyle(SOLID_LINE,1,1)
setcolor(WHITE)
line(frame.left,frame.bottom,frame.right,frame.bottom)
line(frame.right,frame.top,frame.right,frame.bottom)
setlinestyle(DOTTED_LINE,1,1)
setcolor(BLUE)
for(int row=1row<RowOfFramerow++)
line(frame.left+row*BlockWidth,frame.top,frame.left+row*BlockWidth,frame.bottom)
for(int column=1column<ColumnOfFramecolumn++)
line(frame.left,frame.top+column*BlockHeight,frame.right,frame.top+column*BlockHeight)
Foot(frame.left,frame.bottom+20)
}
void CreateSnake()
{
Node *node1=new Node
Node *node2=new Node
node1->x=frame.left+BlockWidth
node1->y=frame.top
node1->next=NULL
snake.tail=node1
node2->x=frame.left
node2->y=frame.top
node2->next=snake.tail
snake.head=node2
snake.length=2
setfillstyle(SOLID_FILL,BLUE)
bar(snake.head->x+1,snake.head->y+1,snake.head->x+BlockWidth-1,snake.head->y+BlockHeight-1)
bar(snake.tail->x+1,snake.tail->y+1,snake.tail->x+BlockWidth-1,snake.tail->y+BlockHeight-1)
}
bool PlayGame()
{
int speed=300,key
Direction CurrentDirection=right
Node randomNode
Node newNode,outNode
bool neednode=true
bool overlap=false
int randx,randy
CreateSnake()
while(true)
{
if(neednode==true)
{
randomize()
do
{
randx=frame.left+rand()%RowOfFrame*BlockWidth
randy=frame.top+rand()%ColumnOfFrame*BlockHeight
for(Node *p=snake.headp!=NULLp=p->next)//hit itself
if(randx==p->x&&randy==p->y)
{overlap=truebreak}
}
while(overlap==true)
randomNode.x=randx
randomNode.y=randy
randomNode.next=NULL
setfillstyle(SOLID_FILL,RED)
bar(randomNode.x+1,randomNode.y+1,randomNode.x+BlockWidth-1,randomNode.y+BlockHeight-1)
neednode=false
}
if((key=bioskey(1))!=0)
{
switch(key)
{
case ESC: return false
case UP:
if(CurrentDirection!=down)
CurrentDirection=up
ClearKeyBuf()
break
case DOWN:
if(CurrentDirection!=up)
CurrentDirection=down
ClearKeyBuf()
break
case LEFT:
if(CurrentDirection!=right)
CurrentDirection=left
ClearKeyBuf()
break
case RIGHT:
if(CurrentDirection!=left)
CurrentDirection=right
ClearKeyBuf()
break
case PAGEUP:speed=speed-100
if(speed<100)
speed=100
ClearKeyBuf()
break
case PAGEDOWN:speed=speed+100
if(speed>500)
speed=500
ClearKeyBuf()
break
default :break
}
}
int headx=snake.tail->x
int heady=snake.tail->y
switch(CurrentDirection)
{
case up: heady-=BlockHeightbreak
case down: heady+=BlockHeightbreak
case left: headx-=BlockWidthbreak
case right: headx+=BlockWidthbreak
}
if(Hit(headx,heady)) //whether the snake hit the wall or itself
return GameOver()
else
{ //eat
if(headx==randomNode.x&&heady==randomNode.y)
{
Enqueue(randomNode)
setfillstyle(SOLID_FILL,BLUE)
bar(randomNode.x+1,randomNode.y+1,randomNode.x-1+BlockWidth,randomNode.y-1+BlockHeight)
neednode=true
}
else //no eat
{
newNode.x=headx
newNode.y=heady
newNode.next=NULL
Enqueue(newNode)
outNode=Dequeue()
setfillstyle(SOLID_FILL,LIGHTGRAY)
bar(outNode.x+1,outNode.y+1,outNode.x+BlockWidth-1,outNode.y+BlockHeight-1)
setfillstyle(SOLID_FILL,BLUE)
bar(newNode.x+1,newNode.y+1,newNode.x-1+BlockWidth,newNode.y-1+BlockHeight)
}
}
delay(speed)
}
}
void ClearKeyBuf()
{
do
bioskey(0)
while(bioskey(1))
}
void Foot(int x,int y)
{
setcolor(BLUE)
outtextxy(x,y,"writer:[T]RealXL E-MAIL:realgeneral@hotmail.com")
}
void Head(int x,int y)
{
setcolor(RED)
outtextxy(x,y,"GREEDY SNAKE")
}
void Enqueue(Node inNode)
{
Node *p=new Node
p->x=inNode.x
p->y=inNode.y
p->next=inNode.next
snake.tail->next=p
snake.tail=p
snake.length++
}
Node Dequeue()
{
Node *p=snake.head
Node outNode=*p
snake.head=p->next
snake.length--
delete p
return outNode
}
int Hit(int x,int y)
{
if(x<frame.left||x>=frame.right||y<frame.top||y>=frame.bottom)//hit the wall
return 1
Node *p=snake.head->next
for(int i=snake.length-1i>3i--,p=p->next)//hit itself
if(x==p->x&&y==p->y)
return 1
return 0
}
bool GameOver()
{
int x=getmaxx()/2-50
int y=getmaxy()/2-20
setfillstyle(SOLID_FILL,DARKGRAY)
bar(x+3,y+3,x+103,y+43)
setfillstyle(SOLID_FILL,MAGENTA)
bar(x,y,x+100,y+40)
setlinestyle(0,3,1)
setcolor(RED)
rectangle(x,y,x+100,y+40)
outtextxy(x+20,y+10,"GAGE OVER!")
char c
while(true) //按q或Q表示退出程序,按r或R表示重新开始游戏
{
c=getch()
if(c=='q'||c=='Q')
return false
else if(c=='r'||c=='R')
return true
}
}
C++五子棋源程序:
#include
#include
#include
#define backcolor CYAN
#define defaultcolor BLACK
#define linecolor MAGENTA
#define player1_color RED
#define player2_color WHITE
#define error_color RED
#define winner_color RED
const int left=40
const int top=390
const int d=30
const int line_num=9
const int turn=0
const int r=d/3
const int j=10
int x,y,k=1,step=(line_num+1)*(line_num+1)
union REGS regs1,regs2
class player1
class player2
class qipan{
public:
qipan()
~qipan(){}
void init_qipan()
friend void fall(player1 &num1,player2 &num2,qipan &num)
friend void input(player1 &num1,player2 &num2,qipan &num)
private:
int point[line_num+1][line_num+1]
}
class player1{
public:
player1()
~player1(){}
friend void fall(player1 &num1,player2 &num2,qipan &num)
friend void input(player1 &num1,player2 &num2)
friend int judge_winner(player1 &num1,player2 &num2)
private:
int point1[line_num+1][line_num+1]
}
class player2{
public:
player2()
~player2(){}
friend void fall(player1 &num1,player2 &num2,qipan &num)
friend void input(player1 &num1,player2 &num2,qipan &num)
friend int judge_winner(player1 &num1,player2 &num2)
private:
int point2[line_num+1][line_num+1]
}
void input(player1 &num1,player2 &num2)
void fall(player1 &num1,player2 &num2,qipan &num)
int judge_winner(qipan &num,player1 &num1,player2 &num2)
void inputerror()
void display_winner(int)
void main()
{
int driver=DETECT,mode
initgraph(&driver,&mode,"e:\tc30\bgi")
qipan num
player1 num1
player2 num2
while(step--)
{
input(num1,num2,num)
fall(num1,num2,num)
if(judge_winner(num1,num2))
{
display_winner(k)
}
}
// getchar()
}
qipan::qipan(void)
{ int j,i
char ch[2]="0"
setbkcolor(backcolor)
setcolor(linecolor)
for(i=0i<=line_numi++)
{
line(left,top-i*d,left+line_num*d,top-i*d)
}
for(i=0i<=line_numi++)
{
line(left+i*d,top,left+i*d,top-line_num*d)
}
for(i=0i<=line_numi++)
{ if(*ch=='9'+1) *ch='a'
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left+i*d-2,top+r+3,ch)
(*ch)=(*ch)+1
}
*ch='0'
for(i=0i<=line_numi++)
{if(*ch=='9'+1) *ch='a'
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left-r-10,top-d*i-3,ch)
(*ch)=(*ch)+1
}
setcolor(defaultcolor)
for(i=0i<=line_numi++)
{
for(j=0j<=line_numj++)
point[i][j]=0
}
}
void fall(player1 &num1,player2 &num2,qipan &num)
{
int flag=k%2
if(flag)
{ setcolor(player2_color)
num2.point2[x][y]=1
num.point[x][y]=2
circle(left+d*x,top-d*y,r)
setfillstyle(1,player2_color)
floodfill(left+d*x,top-d*y,player2_color)
}
else
{ num1.point1[x][y]=1
num.point[x][y]=1
setcolor(player1_color)
circle(left+d*x,top-d*y,r)
setfillstyle(1,player1_color)
floodfill(left+d*x,top-d*y,player1_color)
}
setcolor(defaultcolor)
}
void input(player1 &num1,player2 &num2,qipan &num)
{ char xx,yy
k++
while(1)
{
regs1.h.ah=0
xx=int86(22,®s1,®s1)-'0'
if(xx==('q'-'0')||xx==('Q'-'0'))
{ step=0
return
}
regs1.h.ah=0
yy=int86(22,®s1,®s1)-'0'
if(yy==('q'-'0')||yy==('Q'-'0'))
{
step=0
return
}
if(xx<0||xx>line_num)
{ inputerror()
continue
}
if(yy<0||yy>line_num)
{inputerror()
continue
}
if(num.point[xx][yy]==0)
{
break
}
else
{
inputerror()
continue
}
}
x=(int)xx
y=(int)yy
setcolor(backcolor)
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left+d*line_num/3,top+d*2,"Input error")
setcolor(defaultcolor)
}
player1::player1()
{
int i,j
for(i=0i<=line_numi++)
{
for(j=0j<=line_numj++)
point1[i][j]=0
}
}
player2::player2()
{ int i,j
for(i=0i<=line_numi++)
{
for(j=0j<=line_numj++)
point2[i][j]=0
}
}
void inputerror(void)
{ setcolor(error_color)
settextstyle(DEFAULT_FONT,HORIZ_DIR,1)
outtextxy(left+d*line_num/3,top+d*2,"Input error")
setcolor(defaultcolor)
}
int judge_winner(player1 &num1,player2 &num2)
{
int count=0,m=0,n=0,a=0,b=0,xx0,yy0
int flag=k%2
xx0=xyy0=y
if(!flag)
{ //left <------->right
while(xx0>=1&&m<4) {xx0--m++}
while(n<9&&xx0<=line_num)
{
if(num1.point1[xx0][y]==1)
{
count++
if(count==5) return 1
}
else
{
count=0
}
n++
xx0++
}
//up <------>down
count=0xx0=xm=0n=0
while(yy0>=1&&m<4){yy0--m++}
while(n<9&&yy0<=line_num)
{
if(num1.point1[x][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
n++
yy0++
}
//left up ----- right down
xx0=x
yy0=y
m=0
n=0
count=0
while(xx0>=1&&m<4){ xx0--a++m++} m=0
while(yy0<=line_num&&m<4){ yy0++b++m++}
if(a<=b)
{
xx0=x-ayy0=y+a
}
else
{
xx0=x-byy0=y+b
}
while(xx0<=line_num&&yy0>=0&&n<9)
{
if(num1.point1[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
xx0++
yy0--
n++
}
//right up <----->left down
count=0
a=0
b=0
n=0
m=0
xx0=x
yy0=y
while(xx0while(yy0if(a<=b)
{
xx0=x+a
yy0=y+a
}
else
{
xx0=x+b
yy0=y+b
}
while(xx0>=0&&yy0>=0&&n<9)
{
if(num1.point1[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
count=0
xx0--
yy0--
n++
}
//no winer
return 0
}
else
{
//left <------->right
while(xx0>=1&&m<4) {xx0--m++}
while(n<9&&xx0<=line_num)
{
if(num1.point1[xx0][y]==1)
{
count++
if(count==5) return 1
}
else
{
count=0
}
n++
xx0++
}
//up <------>down
count=0xx0=xm=0n=0
while(yy0>=1&&m<4){yy0--m++}
while(n<9&&yy0<=line_num)
{
if(num2.point2[x][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
n++
yy0++
}
//left up ----- right down
xx0=x
yy0=y
m=0
n=0
count=0
while(xx0>=1&&m<4){ xx0--a++m++} m=0
while(yy0<=line_num&&m<4){ yy0++b++m++}
if(a<=b)
{
xx0=x-ayy0=y+a
}
else
{
xx0=x-byy0=y+b
}
while(xx0<=line_num&&yy0>=0&&n<9)
{
if(num2.point2[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
{
count=0
}
xx0++
yy0--
n++
}
//right up <----->left down
count=0
a=0
b=0
n=0
m=0
xx0=x
yy0=y
while(xx0while(yy0if(a<=b)
{
xx0=x+a
yy0=y+a
}
else
{
xx0=x+b
yy0=y+b
}
while(xx0>=0&&yy0>=0&&n<9)
{
if(num2.point2[xx0][yy0]==1)
{
count++
if(count==5)
return 1
}
else
count=0
xx0--
yy0--
n++
}
//no winer
return 0
}
}
void display_winner(int k)
{
int flag=k%2
if(!flag)
{ setcolor(winner_color)
settextstyle(DEFAULT_FONT,HORIZ_DIR,2)
outtextxy(left+d*2,top+40,"Red is winner")
setcolor(defaultcolor)
step=0
getchar()
}
else
{ setcolor(winner_color)
settextstyle(DEFAULT_FONT,HORIZ_DIR,2)
outtextxy(left+2*d,top+40,"White is winner")
setcolor(defaultcolor)
step=0
}
}
编程如下:
#include
#include
#include
int main(int argc, char * argv[])
{
srand((unsigned)time(NULL))
int a = rand()%100
a+=1
int b,c
c = 0
while (c {
printf("Please enter a number: ")
if (scanf("%d", &b) == 0)
{
fprintf(stderr, "Invalid entry.\n")
return EXIT_FAILURE
}
else
{
if (b == a)
{
printf("You are correct, the number is %d!\n", a)
printf("You used %d times to get the answer.\n", c)
break
}
else if (b >a)
printf("The number is bigger than it suppose to.\n")
else
printf("The number is smaller than it suppose to.\n")
c++
}
if (c == 10)
{
printf("You used 10 times, please try again!\n")
break
}
}
return EXIT_SUCCESS
}
编程的注意事项:
1、程序不仅需要给计算机读 , 也要给程序员读。 程序设计风格的原则 , 代码应该清楚的和简单的 , 具有直截了当的逻辑 , 自然的表达式 , 通行的语言使用方式 , 有意义的名字和帮助作用和注释。
2、自定义类型名以大写字母开头,各单词之间以大写字母分隔,如 CallType (即骆驼式命 名法) 。 变量名以小写字母开头, 各单词之间以大写字母 分隔 (变量活动范围前缀以下划线 分隔) ,如 m_pReleaseIn。函数名以大写字母开头,各单词之间以大写字母分隔(进程、进 程页及子函数前缀以下划 线分隔) ,如 Sub_ErrorDealing。
3、命名宏定义时,表示最大个数时定义为 XXX_MAX_NUM(如最大子节点个数可用 SNODE_MAX_NUM表示) ,表示最大取值时定义为 XXX_MAX(如 PT 板 E1的最大取值 可用 PT_E1_MAX表示) 。定义最小个数时定义为 XXX_MIN_NUM,定义最小取值时定义 为 XXX_MIN。 (以防止下标使用时难以分辨是否需要减 1) 。
可以用C语言编写游戏的。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。