问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

急求一C语言小游戏源程序 至少1000行哈 最好有解释

发布网友 发布时间:2022-06-19 13:52

我来回答

4个回答

热心网友 时间:2022-06-19 14:20

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
typedef struct node
{
char data;
struct node *next;
}stack;//定义栈
//入栈操作
stack *push(stack *top,char x)
{
stack *p;
p=(stack *)malloc(sizeof(stack));//开辟节点
if(p==NULL)//如果开辟失败
{
printf("error!\n");
exit(1);
}
x=p->data;
p->next=top;
top=p;
return top;
}
//出栈操作
stack *pop(stack *top)
{
if(top==NULL)
{
printf("stack is null\n");
return top;
}
stack *q;
q=top;
top=top->next;
free(q);//释放节点
return top;
}
//读取栈顶元素
char get(stack *top)
{
if(top==NULL)//如果栈为空
{
printf("stack is null\n");
exit(1);
}
return top->data;
}
stack *getdel(stack *top,char *x)//读取栈顶元素,并删除
{
*x=get(top);
top=pop(top);
return top;
}
void change(char *a,char *b)//将中缀表达式转换为后缀表达式
{
int i=0,j=0;
char ch;
stack *top=NULL;
while(a[i]!='\0')
{
if(isdigit(a[i]))//如果读到数字
{
do
{
b[j]=a[i];//直接送入b
j++;i++;
}while(a[i]!='.');
b[j]='.';
}
if(a[i]=='(')//如果读到'('
top=push(top,a[i]);//直接压入栈中
if(a[i]==')')//如果读到')'
{
ch=get(top);//读取栈顶元素
while(ch!='(')
{
b[j]=ch;//送入b
j++;
top=pop(ch);
ch=get(top);
}
}
if(s[i]=='+'||s[i]=='-')
{
if(top!=NULL)
{
ch=get(top)
while(ch!='(')
{
b[j]=ch;
top=pop(top);
if(top==NULL)
break;
else
ch=get(top);
}
}
top=push(top,a[i])
}
if(a[i]=='*'||a[i]=='/')
{
if(top!=NULL)
{
ch=get(top)
while(ch=='*'||ch=='/')
{
b[j]=ch;
top=pop(top);
if(top==NULL)
break;
else
ch=get(top);
}
}
top=push(top,a[i])
}
i++;
}
while(top!=NULL)//若栈非空,则将栈中运算符依次出栈,送入b
top=getdel(top,&b[j++]);
}
int fun(char *s)//计算结果
{
stack *top=NULL;
int i=0,k=0,r,n,m;
while(s[i]!='\0')
{
if(isdigit(s[i]))//如果是数字
{
do
{
k=10*k+s[i]-48;//转换成数字
i++;
}while(s[i]!='.')
top=push(top,k);
k=0;
}
//如果读到运算符,则栈依次弹出两个数n和m,然后以m运算符n的形式计算,最后将结果入栈
if(s[i]=='+')
{
top=getdel(top,&n);
top=getdel(top,&m);
r=n+m;
top=push(top,r);
}
if(s[i]=='-')
{
top=getdel(top,&n);
top=getdel(top,&m);
r=n-m;
top=push(top,r);
}
if(s[i]=='*')
{
top=getdel(top,&n);
top=getdel(top,&m);
r=n*m;
top=push(top,r);
}
if(s[i]=='/')
{
top=getdel(top,&n);
top=getdel(top,&m);
r=n/m;
top=push(top,r);
}
i++;
}
top=getdel(top,&r);//最后的结果为栈顶元素
return r;
}
int check(char *a)//判断输入表达式是否正确
{
int i=0;
char ch;
while((ch=a[i])!='\0')
{
if(isdigit(ch))//如果是数字
{
if(isdigit(a[i+1]))//如果还是数字
{
i++;//接着读取
coutinue;
}
if(a[i+1]!='.')
{
//若数字不宜'.'结束,则输出错误信息
printf("This is wrong expross format!!!\n");
return 1;
}
i++;
}
i++;
}
return 0;
}
void card()
{
srand(time(0));
int i;
for(i=0;i<4;i++)
{
printf("%3d",rand()%13+1);
}
printf("\n");
}
void main()
{
char a[100],b[100],ch;
while(1)
{
printf("four digits are:");
card();
do
{
printf("input expression:");
scanf("%s%c",a,&ch);
}while(check(a));
change(a,b);
printf("%s=%d\n“,a,fun(b));
if(fun(b)==24)printf("You right!\n");
else printf("You wrong!\n");
printf("y/n:");
ch=getchar();
if(ch=='n'||ch=='N') break;
}
}
注:表达式要求数字末尾有确认符'.'

热心网友 时间:2022-06-19 14:20

2从键盘输入任意10个数,求出其最大值和最小值
#include<stdio.h>
#define N 10
void main()
{
int *p,*t,a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
p=a;
t=a;
int max = *p;
int min = *t;
for(i=1;i<N;i++)
{
if(max < *(p+i))
max = *(p + i);

if(min > *(t+i))
min = *(t + i);
}
printf("%d %d\n",max,min);
}

热心网友 时间:2022-06-19 14:21

我介意你上网查急求一C语言小游戏源程序 至少1000行哈 最好有解释
我OK了

参考资料:我、、、

热心网友 时间:2022-06-19 14:22

/*===============================================
五子棋
================================================*/

#include "stdio.h"
#include "graphics.h"

#define LEFT 0x4b00 /*左键值*/
#define RIGHT 0x4d00 /*右键值*/
#define DOWN 0x5000 /*下键值*/
#define UP 0x4800 /*上键值*/
#define ESC 0x011b /* ESC键值*/
#define ENTER 0x1c0d /* 回车键值*/

int x=-1, y = 0; /*纪录棋子移动点的坐标值*/
int max_x, max_y;
int board_flag[15][15]; /*棋盘每格的状态纪录数组*/

void draw_board(); /*画棋盘15*15的棋盘*/
void show_init(int pat); /*棋子出现的初始位值*/
void hide(); /*恢复棋子上一步的状态*/
void show(int pat); /*显示棋子当前状态*/
void move(); /*移动棋子*/
int is_win(int pat); /*判断哪方赢了*/

void main()
{
int driver = DETECT, mode;
int i, j;

for(i=0; i<15; i++)
for(j=0; j<15; j++)
{
board_flag[i][j] = 0;
}

initgraph(&driver, &mode, "");

draw_board();
show_init(0);
move();

getch();
closegraph();
}

/*=======================================================================*/
void draw_board()
{
int i;

max_x = getmaxx();
max_y = getmaxy();

setfillstyle(1, BLUE); /*设置棋盘背景为蓝色*/
bar(0,0, max_x, max_y);

for(i=-7; i<=8; i++)
{
line(max_x/2-7*26, max_y/2 +i*26, max_x/2+8*26, max_y/2+i*26); /*画水平方向的线*/

line(max_x/2+i*26, max_y/2-7*26, max_x/2+i*26, max_y/2+8*26); /*画垂直方向的线*/
}
}
/*==========================================================================*/
void show_init(int pat)
{
setcolor(BLUE);
if(pat == 0)
{
setfillstyle(1, BLACK); /*设置填充的颜色*/
}
else
{
setfillstyle(1,WHITE); /*设置填充的颜色*/
}
x = -1;
y = 0;

fillellipse(max_x/2-8*26+13, max_y/2-7*26+13, 12,12);/*画出初始位值出现的棋子*/
}
/*============================================================================*/
void hide()
{
int m;

m = board_flag[x][y];
switch(m)
{
case 0: /*标志位为零时,说明此处背景色为蓝色*/
setfillstyle(1, BLUE);
break;
case 1: /*标志为1时,说明此处为一黑色棋子*/
setfillstyle(1, BLACK);
break;
case 2: /*标志为2时,说明此处为一白色棋子*/
setfillstyle(1, WHITE);
break;
default:
break;
}

fillellipse(max_x/2+(x-7)*26+13, max_y/2+(y-7)*26+13, 12,12); /*恢复棋子上一步状态*/
}
/*=============================================================================*/
void show(int pat)
{
switch(pat)
{
case 0:
setfillstyle(1, BLACK);
break;
case 1:
setfillstyle(1, WHITE);
break;
default:
break;
}

fillellipse(max_x/2+(x-7)*26+13, max_y/2+(y-7)*26+13, 12,12);/*画出当前位置棋子*/
}
/*=================================================================*/
void move()
{
int key;
int pat = 0;
/*---------------------------------------------------------------*/
for(;;)
{
key = bioskey(0);

switch(key)
{
case LEFT:
if(x == -1)
{
break;
}

hide();

x--;
x = x<0?0:x;
show(pat);
break;
case RIGHT:
if(x == -1)
{
setfillstyle(1, BLUE);
fillellipse(max_x/2 + (x-7)*26+13, max_y/2 + (y-7)*26+13, 12,12); /*上次棋子出现的位置消失*/
}
else
{
hide(); /*隐藏棋子*/
}
x++;
x = x>14?14:x;

show(pat); /*棋子显示*/
break;
case DOWN:
if(x == -1)
{
break;
}

hide();

y++;
y = y>14?14:y;

show(pat);
break;
case UP:
if(x == -1)
{
break;
}

hide();

y--;
y = y<0?0:y;

show(pat);
break;
case ENTER:
if(board_flag[x][y] != 0) /*防止空格处已经放置了棋子,又一次放置*/
{
break;
}

show(pat);
board_flag[x][y] = pat+1;
if(is_win(pat))
{
settextstyle(0, 0, 3);
setcolor(RED);
if(pat == 0)
{
outtextxy(max_x/2-80, max_y/2,"Black Win!");
}
else
{
outtextxy(max_x/2-80, max_y/2,"White Win!");
}
setcolor(BLUE);
getch();
exit(1);
}

if(pat == 0)
{
pat = 1;
}
else
{
pat = 0;
}
show_init(pat);

break;
case ESC:
exit(1);
break;
default:
break;
}
}
}
/*===============================================================*/
int is_win(int pat)
{
int i, j;
int cnt = 0;

/*判断是否五子连在一起*/

/*------------------------------------------------------------*/
/*判断水平方向*/
cnt = 0;
i = x;
while(i<15)
{
if(board_flag[i][y] == pat+1)
{
cnt++;
}
else
{
break;
}
i++;
}

i = x-1;
while(i>=0)
{
if(board_flag[i][y] == pat+1)
{
cnt++;
}
else
{
break;
}
i--;
}
if(cnt >= 5)
{
return 1;
}
/*-------------------------------------------------------*/
/*判断45度直线方向*/
cnt = 0;
i = x;
j = y;
while(i<15)
{
if(j<0)
{
break;
}
if(board_flag[i][j] == pat+1)
{
cnt++;
}
else
{
break;
}
i++;
j--;
}

i = x-1;
j = y+1;
while(i>=0)
{
if(j>14)
{
break;
}
if(board_flag[i][j] == pat+1)
{
cnt++;
}
else
{
break;
}
i--;
j++;
}

if(cnt >=5)
{
return 1;
}

/*----------------------------------------------------------------------------*/
/*判断垂直方向*/
cnt = 0;
j = y;
while(j>=0)
{
if(board_flag[x][j] == pat+1)
{
cnt++;
}
else
{
break;
}
j--;
}

j = y+1;
while(j<15)
{
if(board_flag[x][j] == pat+1)
{
cnt++;
}
else
{
break;
}
j++;
}

if(cnt>=5)
{
return 1;
}
/*----------------------------------------------------------------*/
/*判断135度直线方向*/
cnt = 0;
i = x;
j = y;
while(i>=0)
{
if(j<0)
{
break;
}

if(board_flag[i][j] == pat+1)
{
cnt++;
}
else
{
break;
}

i--;
j--;
}

i = x+1;
j = y+1;
while(i<15)
{
if(j>14)
{
break;
}
if(board_flag[i][j] == pat+1)
{
cnt++;
}
else
{
break;
}
i++;
j++;
}

if(cnt >= 5)
{
return 1;
}

return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
vivo y3t手机能拨打和接听电话,不能收发短信 vivoy3t手机突然接收不到短信 vivoy3短信消息怎么提醒 无奈什么意思是什么 怎样让炒出的丝瓜不发黑? 钟表是以什么计量时间 钟表以( )、()、( )计量时间。 钟表以( )、()、( )单位计量时间 紫荆花开放时间 《青春 须臾成殇》渭伊的txt全集下载地址 谁有K1男士梦幻三部曲的成分不要你给我介绍什么的我只到成分,M2的有... 什么护肤品能解决皮肤暗黄? 安斯满润肤霜成分 作文一位游客行至河边,要急着去对岸,可这时风高浪急,船不能过河,老艄公告诉他,等上一会,风也许就 曼巴狂蛇无线键盘怎么开启 抗战70周年银行发行金银纪念币吗 价格多少 厚脸皮真的有好处吗? 电脑屏幕有黑边与系统有关么? “天然新制冷技术”?到底是怎么回事? 谁有宋魏夫人的诗词,越多越好… 三亚千里之外交通网络有限公司怎么样? 三亚网页制作哪能做得好?新开公司要做企业站。 请问海南三亚的那家公司制作网站,百度搜索推广做的最好呢?谢谢_百度知 ... 三亚网站开发 攻城掠地187张苞副本怎么过 22号华正发债上市能挣多少钱 iPhone QQ怎么没法设置匿名消息 ...如果完成一台电脑的安装,硬件、系统软件、应用软件的安装顺序是... 电脑组装维护系列教程之应用软件安装 乌丹镇在林西县的正南方吗? 设计一些新奇的C语言程序,来实现3个数从大到小排列 ,越新奇越好_百度知 ... 跪求一个C语言小程序,100行左右,最好独特一点 以&quot;快乐都在对岸&quot;为作文题目 姓袁的男孩儿取名字 联想服务器RD650标配几块硬盘 关于i主题? 我想下载i主题? 长了肺结节,在饮食方面需要注意哪些问题? 德邦物流(方村西朗营业部)到新华南鞋城怎么走 头发细软,而且很容易出油,掉发,该用什么洗发 工字钢规格型号尺寸图 ...单EDM的设计及独立制作,这其中的edm是什么意思?求详解,谢谢 edm广告的EDM广告设计原则 大家制作LOGO通常用photoshop cs2 还是cs3? 北京的湖泊为什么都叫海呢? 猴子在河对岸看到苹果树,摘苹果的作文 3.14.你朋友问我今天是什么好日子? 当男友告诉你明天是2021314时该怎么回? 150平米左右的清吧 被同学起绰号叫小仓鼠,至今搞不明白什么意思,是褒义还是贬义,我跟他们...