急求一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;
}