目录

对于基础知识的掌握

1.初识数据类型

2.变量,常量,字符串

3.运算符与表达式

小练习

1.输入输出的类别

2.运算符与判断语句

小练习

对于作业的反思

第一天

第二天

1.while类

2.for类

对于游戏复刻的体会

1,弹弹球

2.生命游戏

3.贪吃蛇


对于基础知识的掌握

本节主要认识了一系列的数据类型运算符表达式充实了自己的基础知识

1.初识数据类型

  1. 基本类型
  2. 空类型
  3. 指数类型
  4. 构造类型
  • 而在该章中主要学习了数据类型中的基本类型
  1. 基本整形【int】
  2. 浮点型【float】
  3. 字符型【char】
  • 基本整形 

根据字节数不同有分为如下几个类型,并且在整形的各各分类中均可在其前加unsigned来表示无符号的各类整形

分类
名称字节数数据类型
整型4int                                           
短整型2short
长整型4long
  • 浮点型

(与整形对应整数类似浮点型表示小数(实数)一类),与整数不同浮点数有两种表示方法(1)十进制小数型如:3.14(2)指数型如:314e-2

分类
名称字节数数据类型
单精度浮点型4float
双精度浮点型8double
长双精度浮点型16long double
  • 字符型

与前两类不同字符型不只包括数字还包括字母,专门符号,不能显示的字符等(详情见ASCLL字符集), 同时对于可输入字符来说可讲字符输入‘’中或直接输入ASCLL值

#include<stdio.h>
int main()
{
char ch1='a',ch2=97;
printf("%c\n",ch1,ch2);


}

如上述程序中ch1和ch2输出值均为a,而相应的无法输入字符也有自己的表达形式即转移字符"\"如\a(报警响铃)\b(退格符)\t(水平制表),\n(回车)\v(垂直制表),\f(换页)等其中\ddd,\xhh较为特殊前者表示3位8进制表示的ASCLL码值

后者为16值的ASCLL码值

#include<stdio.h>
int main()
{
int a=1;
long b=2;
short c=3;
float d=4.;
double e=5e-1;
long double f=7.1;
char g=97;
unsigned char h='a';
printf("%d,%d,%d\n",a,b,c);
printf("%f,%lf,%lf\n",c);
printf("%c,%c\n",g,h);
}

其中整形输出用%d字符型用%c浮点型用%f双精度浮点型用%lf如上图

同时在上图中使用的标识符和关键字也是学习的内容如abcd为标识符printf为关键字

标识符是指由编程者主观设计的符号

标记符的组成只能由字母开头切不能包含除下划线以外的符号并且不能为关键字

关键字是指在c语言中已经规定好的符号包含如下:

auto break case char int long register return

const continue default do short signed sizeof static

double else enum extern struct switch typedrf union

float for goto if unsigned void volatile while

2.变量,常量,字符串

同时在本章中学习了常量以及变量和常变量

常量即位赋予值而变量为被赋予值

常变量既是变量按我理解既是变量被固定                                                                                          

#include<stdio.h>
#define a 9
int main()
{
const int b=9

}

        其中#define和const int均为定义常变量的符号

字符串:顾名思义字符串是指将字符连成串如"wo ai c yu yan"就是一简单的字符串在c语言中字符串的输入与输出有一套专用的语句puts gets来代替一般的输入输出但字符串并非不能用一般输入输出操作如下图

代码1
#include<stdio.>
int main()
{char a[30];
gets(a[30]);
puts(a[30]);}


代码2
#include<stdio.h>
int main()
{char a[30];
scanf("%s",a[30]);
printf("%s",a[30]);
}

但能明显看出代码1比代码2简单

3.运算符与表达式

(1)算数运算符与表达式

运算符含义
*乘法运算符
/                除法运算符
%求余运算符
+加法运算符
-减法运算符

在算术表达式中若数据类型不同则会按照类型优先级进行转换类型优先级(图片源自网络)

#include<stdio.h>
int main()
{
float a=3.14;
double d,b=1.234;
int c=2;
d=c+b+a;
printf("%lf",d);
}

如该程序输出d为double型数据

(2)关系运算符与表达式

运算符含义
<小于
>大于
<=小于等于
>=大于等于
==等于
!=不等于

其中优先级为(<,<=,>,>=)高于(==,!=)结合性为自左向右

(3)逻辑运算符与表达式

运算符含义
逻辑'非‘
&&逻辑”与“
||逻辑”或“

优先级!>&&>||

逻辑表达式运算的结果只有两个即真和假但在c语言中用0来表示假用1来表示真

#include<stdio.h>
int main()
{int a=1,b=0;
printf("%d\n%d\n%d\n",!a,a&&b,a||b);

}

如上图 程序结果为0,0,1

小练习

在学习中接触越来越多的代码并在视频的引导下自己编辑了一个小程序用来判断某一年是否为润年

#include<stdio.h>
int main()
{int year,i;
printf("请输入任意一年份");
scanf("%d",&year);
i=year%4==0&&year%100!=0||year%400==0;
if(i>0)printf("这一年为润年");
else printf("这一年为平年");}

建立在前一节学习了数据的基础上,在第二节中学到了如何对数据进行操作.

1.输入输出的类别

函数含义
scanf格式输入函数
printf格式输出函数
getchar字符输入函数
putchar字符输入函数
gets字符串输入函数
puts字符串输出函数

由上图可知getchar和putchar是专门对字符的输入和输出同理gets和puts是对字符串的输入和输出

而在c语言中最普遍的输入输出就是scanf和printf在c语言中他们能够输出一切东西包括数值,符号,数组,字符,字符串,甚至汉字但是在拥有如此多功能的同时也给他加上了不少限定如输入输出butongd数据需要不同的格式字符其中包括

(1).d格式字符                                   
功能:用来输出十进制数
格式:%d:按整型数据的实际长度输出

(2)u格式字符
功能:以十进制数输出无符号整数
格式:%u:按整型数据的实际长度输出

(3).c格式字符
功能:输出单个字符
格式:%c:按整型数据的实际长度输出

(4).s格式字符
功能:输出字符串
格式:%s:按整型数据的实际长度输出

(5).f格式字符
功能:以小数形式输出单、双精度实数
格式:%f:按整型数据的实际长度输出

具体使用情况如下

代码1
#include<stdio.h>
int main()
{
int a;
char b;
float c;
scanf("%d\n%c\n%f\n",&a,&b,&c);
printf("%d\n%c\n%f\n",a,b,c);
char i[10];
scanf("%s",i); 
printf("%s",i);


}
代码2
#include<stdio.h>
int main()
{
	char i[10];
	char a;
    gets(i);
	a=getchar();
	puts(i);
    putchar(a);
	
}

2.运算符与判断语句

1.逻辑与关系运算符

准确来说这一课主要讲了判断语句但是在学习判断语句之前需要补充一些基础的运算符例如关系运算符和逻辑运算符其中关系运算符分为以下几种类型。

关系运算符含义
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

其中特别要注意“==”和“=”的区别前者表示符号前后的关系而后者为负值符号是指将符号后的数据赋予前者并无法判断前后两者的关系。

关系表达式:顾名思义是指由关系运算符构成的表达式。

而在前面的课程中我们已经浅浅的了解了逻辑运算符的类型和优先级在此就不再赘述,而通过学习发现在关系表达式中有与逻辑表达是相同的特点:结果的表示

在关系表达式与逻辑表达式中“0”都表示结果为假“1”都表示结果为真所以在编程中我们可以将逻辑表达式和关系表达式进行组合从而得到关系与逻辑符合表达式如下面的代码

#include<stdio.h>
int main()
{
int a=1,b=2,c=3,d=4;
int i,j,k;
i=a==b||a<b;
j=a>b&&c>b;
k=d>b&&d>a;
printf("%d,%d,%d",i,j,k);
return 0;
}

如图中代码所写如果运行后则会输出1,0,1

2.经过前面的铺垫我已经习的了学判断语句的资格在判断语句分为两类分别是if类和switch类

对于if语句来说一共有三种形式如下代码所示

#include<Stdio.h>
int main()
{
int a;
scanf("%d",a);
if(a==1)printf("第一类");


return 0;}


#include<Stdio.h>
int main()
{
int a;
scanf("%d",a);

if(a==2)printf("第二类");
else printf("第二类的第二分支");




return 0;}#include<Stdio.h>
int main()
{
int a,b;
scanf("%d",a);

if(a==3)printf("第三类"),scanf("%d",b);
else{if(b==3)printf("第三类的第二分支");
     else printf("第三类的第三分支");}



return 0;}

如图可视if语句虽然能够有多个分支但是较为麻烦于是多分枝问题便交给了同为判断语句的switch

在switch中通常是对某个量进行检查,检查方法是将此量放入switch中如switch(a)

注:该式子省略了代码标头和对a的定义目的是为了直观的表示出switch的运用方法

在switch中有专有的代码和便利switch运行的代码如专有代码

"case"该代码后通常跟随数字用来检测a是否等于该数字如果等于则进行该符号后边的代码。

"default"该代码类似与在if语句中的else是在该代码前的"case"对a检测无果是对switch的一个强行进行该代码后的代码的代码。

便利代码:"break"该代码是对case代码的一个终结,防止对a值判断的溢出。

对switch的运用如下

#include<Stdio.h>
int main()
{
scanf("%d",a);
switch(a)
{
case 1:printf("a为1");break;
case 2:printf("a为2");break;
case 3:printf("a为3");break;
case 4:printf("a为4");break;
case 5:printf("a为5");break;
default:printf("我爱c语言");
}
return 0;
}

小练习

给出三人体重求出三人体重最大值

#include<stdio.h>
int main()
{
    int a[3];
    int i=0,max=0;
    printf("依次输入3人的体重"); 
    for(i=0;i<3;i++)
    {
    	
    	scanf("%d",&a[i]);
    	
	}
	for(i=0;i<3;i++)
	{
		if(a[i]>max)
		{
			max=a[i];
			
		}
	}
    printf("三人中体重最重为%d\n",max);
	return 0;
}

对于作业的反思

我认为如果是学习进程不应该只拘泥于在课堂上的学习,在对作业的思考中解决问题也是学习的一种所以我把它写在这里

第一天

在昨天晚上我去写c语言的作业发现有一道题与之前的作业一模一样

心想这不轻松拿捏

便开始下笔编程。。。。。可是在编写滴时候却和第一次编写的时候一样无从下笔我心想这啥呀,我明明之前已经想了一下午编写出来了而且在编写后还去看了一遍老师的教程对比了标准答案虽然不一样但是还是对与我自己编写的程序非常的自信于是便没有对我的程序进行修改沉溺于自己编程的喜悦中,将自己编程几小时的困境忘于脑后,并且也没有对自己的错误思想进行改正,才酿成了现在的后果

于是在痛定思痛后我又一遍的去看了标准答案并且对于他的思路进行总结,如下

//第一种是对于i能被除以和本身外其他数整除的次数将其设为m并在最后输出时对m进行判断,若m>0则不是素数反之为素数 
//称之为对于特殊情况技术以便于根据计数来判断不同数据的不同类型 
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,m;
for(i=1;i<=100;i++)
{   
{
	for(j=2,k=sqrt(i);j<=k;j++)
	if(i%j==0)break;
}
if(j>k)printf("%d\n",i);
}}
//第二种是对当i被整除时被除数的大小判断,若在判断时j<=k(sqrt(i))则该循环未提前结束即可判断再j<=k(sqrt(i))中未有能够将i整除的存在及此i为素数。 
//若提前中断则表面该i不为素数。 
//该方法称之为对特殊情况提前中断法,对于特殊情况提前中断方便根据在改中断位置的数据类型 
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,m,k;

for(i=1;i<=100;i++)
{   k=sqrt(i);
	for(j=2,m=0;j<=k;j++)
	{
		if(i%j==0)m++;
	}
	if(m==0)printf("%d\n",i);
	
}
} 

第二天

今天写了昨天没写完滴作业

过程那叫一个坎坷阿

但是希望能在照抄中有收获

看看下边这个题

输入两个数并求取两个数的最大公约数和最小公倍数

我在看到题之后楞了几秒就立马去百度了最大公约数和最小公倍数的概念。。。

小学5年纪的内容在看了一遍后大约了解了一下概念和性质后开始思考如何编写这个程序

想了一通后求助了csdn(找答案去咯)

然后再别人的文章里我找回了初中数学老师教过的一种求最大公约数的一个编程方法:辗转相除法

在对着大佬的代码思考了几秒后我开始进行自己的编写,可是在编写完后进行编译。。。

下边红字一大堆我就开始找错误 

代码如下

#include<Stdio.h>
int main()
{
	int m,n,a,M,N;
	printf("输入两个数,m,n");
	scanf("%d %d",&m,&n);
	M=m;N=n;
	while(n!=0)
	{
		a=m%n;
		m=n;
		n=a;
	 } 
	 printf("两数的最大公约数为%d",m);
	 printf("两数的最小公倍数为%d",N*M/m);
}

在while语句中为辗转相除的步骤,我会牢牢记住他的

并且在最小公倍数数与最大公约数之间有着一个公式的联系

最小公倍数=两个数的乘积/最小公约数所以在以后的编程中如果需要求取最大公约数只需使用辗转相除法而求最小公倍数只需使用最小公倍数和最大公约数的关系

还有一题是对输入的一行字符中的各各数据类型进行分别计数 如字母 数字 空格 其他

在看到题时我是有一些思路的

比如用ascll值对这些数据类型进行分类

可是问题是如何分类  我想到了对该字符的ascll码值进行划分如大于多少小于多少为数字等等

可是我想不出如何获得这些数据的ascll码值并且不会表达大于多少且小于多少

我对他们的熟悉的仅仅是看见了能认出但是不能自己打出来

而且对于一行字符来说我虽然想到了用字符数组来进行输入但是我不知道要如何一个个的进行判断

于是我打开了csdn开启了搜索

#include<stdio.h>
int main()
{
	char c;
	int s=0,y=0,k=0,q=0
	;
	
	while((c=getchar())!='\n')
	{
		if(c==' '){k++;
		}
		else if((c>='A'&&c<='Z')||(c>='a'&&c<='z')){y++;
		}
		else if(c>='0'&&c<='9'){s++;
		}
		else q++;
	}
	printf("数字个数为%d字母个数为%d空格字数为%d其他字数为%d",s,y,k,q);
}

哈哈 大佬nb

我第一次对while这个函数印象那么深

连续两次作业都用他

我没想到getchar还能这么用,对于ascll码的取值需要加‘’对于范围的取值需要用&&来连接

这些明明在课上都学过可是在进行编辑是还是想不起来

看来正如学长所说编程需要多练


本节主要学习了循环语句在循环语句中有两大类的程序分为while类和for类

1.while类

while类分为两种一是while二是do while两者虽然都是循环程序但是在运行时有些许不同这个不同让我联想到了a++和++a,a++是先输出a再进行a=a+1对应while,++a是先进行a=a+1再输出a对应do while。具体区别如下

#include<stdio.h>
int main()
{
int x=0;
while(x>1)
{
x++;
}
printf("%d",x);
return 0;
}
2
#inlude<stdio.h>
int main()
{
int x=0;
do{
x++;
}
while(x>1);

printf("%d",x);


return 0;
}

其中代码1为while输出结果为0  代码2为do while输出结果为1并且在do while的)后边必须有;存在不然会编译错误。

对于while类语句的理解,感觉就像是if语句进行循环while()中的条件和if()里的条件都是用来判断是否进行下一步运算不同的是在进行完if语句后会直接进入下一步而在while中会再次进入while中对条件进行再次判断

2.for类

for也是循环语句的一种相比于while来说他的优点是简洁机会所有的条件都包括在for的()中

如下


#include<stdio.h>
int main()
{
int x;
for(x=0;x<=0;x++)
{
printf("%d",x);
}
return 0;
}

for()中用两个;分割开来的三个代码分别表示输入条件,判断条件,循环语句。{}中表示的是在循环语句后边进行的语句,也算是循环语句并且只有在进行完{}中的语句后才会再次进行判断条件的代码


对于游戏复刻的体会

我们小组要求复刻贪吃蛇这款经典小游戏,但是在复刻这个游戏之前还有很多基础的知识需要去学习,而我们学长给的教程非常有趣他是在一个个小游戏的学习中来让我们了解游戏的编程。

1,弹弹球

一款经典的小游戏,在接触这个教程之前我很难想象c语言编辑的代码如何使一个小球运动起来,

在这个游戏中我学到了如何去清屏使画面更迭从而达到拟动态感

代码为在'stdlib'中的system(“cls”);

清屏和循环结合就能达到动态效果

如下

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
	int k=0;
	int i,j;
	int x=0;
	int y=0;
	int velocity_x=1;
	int velocity_y=1;
	int height=20,bottom=0;
	int left=0  ,right=20;  
	while((k/height)!=3)
	{x=x+velocity_x;
	y=y+velocity_y;
	system("cls");
	for(i=0;i<x;i++)
	{
	printf("\n");
    }
	
	for(j=0;j<y;j++)
	{
	printf("  ");	
	}
	printf("o");
	sleep(6);
	if(x==height||x==bottom)velocity_x=-velocity_x;
	if(y==right||x==left)velocity_y=-velocity_y;
	k++;}
	/*
	for(x=1;x<10;x++){
	system("cls");
	for(i=0;i<x;i++)
	{
		printf("\n");
		
	}
	for(j=0;j<y;j++)
	{
		printf(" ");
	}
	printf("baiyanzuishuai");}
	printf("\n");*/
	return 0;
}

而在弹弹球游戏中最经典的是小球撞方块然后得分然后用小球接到落下的小球,这对我来说无疑是非常复杂的而在教材中提供了一个游戏模板可以将游戏数值的初始化和游戏的显示以及与用户操作有关的代码和与用户无关的代码,让我见识到了对于代码的规划,使我以后的代码更规范。

完整代码如下

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>

#define high 25
#define width 30

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
 } 

void gotoxy(int x,int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
	}	



int ball_x,ball_y;
int datewall[high][width]={0};
int position_x,position_y;
int size,left,right;
int ball_vx,ball_vy;

void startup()
{
	ball_x=5;
	ball_y=width/2;
	ball_vx=1;
	ball_vy=-1;
	datewall[ball_x][ball_y]=1;
	size=5;
	position_x=high-1;
	position_y=width/2;
	left=position_x-size;
	right=position_y+size;
	int k,i;
	for(k=left;k<=right;k++)
	datewall[position_x][k]=2;
	for(k=0;k<width;k++)
	{
		for(i=0;i<high/4;i++)
		{
			datewall[i][k]=3;
		}
		
	}
	
}
void show()
{
	gotoxy(0,0);
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if(datewall[i][j]==0)
			{
				printf(" ");
			}
			else if(datewall[i][j]==1)
			{
				printf("o");
			}
			else if(datewall[i][j]==2)
			{
				printf("*");
				
			}
			else if(datewall[i][j]==3)
			{
				printf("#");
			}
			
		}
		printf("|\n");
	}
	
	for(i=0;i<width;i++)
	{
		printf("-");
	}
	printf("\n");
}

void updatewithoutinput()
{
	if(ball_x==high-2)
	{
	if((ball_y>=left)&&(ball_y<=right))
	{
		
	}
	else
	{
		
		
	}
	}
	static int speed=0;
	if(speed<7)
	{
		speed++;
		
	}
	if(speed==7)
	{
		speed=0;
		datewall[ball_x][ball_y]=0;
		ball_x+=ball_vx;
		ball_y+=ball_vy;
		datewall[ball_x][ball_y]=1;
		if((ball_x==0)||(ball_x==high-2))
		{
			ball_vx=-ball_vx;
		}
		if((ball_y==0)||(ball_y==width))
		
		{
			ball_vy=-ball_vy;
		}
		if(datewall[ball_x-1][ball_y]==3)
		{
			ball_vx=-ball_vx;
			datewall[ball_x-1][ball_y]=0;
			
		}
	}
}
 
 void updatewithinput()
 {
 	char input;
 	if(kbhit())
 	{
 		input=getch();
 		if(input=='a'&&left>0)
 		{
 			datewall[position_x][right]=0;
 			position_y--;
 			left=position_y-size;
 			right=position_y+size;
 			datewall[position_x][left]=2;
		 }
		 if(input=='d'&&right<width-1)
		 {
		 	datewall[position_x][left]=0;
 			position_y++;
 			left=position_y-size;
 			right=position_y+size;
 			datewall[position_x][right]=2;
		 }
	 }
 }
 
 int main()
 {
 	HideCursor();
 	startup();
 	while(1)
 	{
 		show();
 		updatewithoutinput();
 		updatewithinput();
	 }
 }

在编程中不乏不少错误,对于编译错误还能及时改正但是对于编译正确但是却无法正常运行起来就很恼火,并且让我一次次的体会到抄都抄不对的”乐趣“

但是经过这个一次次修改的过程我也开始明白编代码需要耐心和细心我也会在以后的编程中更加的耐心和细心。

2.生命游戏

这个游戏我之前是没有听说过的但是在看了一边教程后我知道了他的基本逻辑,就是对生命的模拟在这个游戏中我学会了生成随机数函数是在’stdlib‘中的rand()函数

游戏代码如下

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>

#define high 40
#define width 180

int cells[high][width];

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
 } 

void gotoxy(int x,int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
	}	
	
void startup()
{
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			cells[i][j]=rand()%2;
			
		}
		
	}
}

void show()
{
	gotoxy(0,0);
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if(cells[i][j])
			{
				printf("*");
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
		
	}
	
	
	
}

void updatewithoutinput()
{
	int newcells[high][width];
	int cellnumber;
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			cellnumber=cells[i][j-1]+cells[i][j+1]+cells[i+1][j+1]+cells[i-1][j+1]+cells[i+1][j-1]+cells[i-1][j-1]
			+cells[i-1][j]+cells[i+1][j];
			if(cellnumber==3)
			{
				newcells[i][j]=1;
			}
			else if(cellnumber==2)
			{
				newcells[i][j]=cells[i][j];
			}
			else
			{
				newcells[i][j]=0;
			}
			
		}
	}
	
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			cells[i][j]=newcells[i][j];
		}
		
	}
}

void updatewithinput()
{
	
}

int main()
{
	HideCursor();
	startup();
	while(1)
	{
		show();
		updatewithoutinput();
		updatewithinput();
		
	}
	return 0;
	
}

3.贪吃蛇

对于贪吃蛇我感觉是结合了以前几款游戏的特点来做出的游戏它既有和弹弹球一样的可操作性也有和生命游戏一样的随机生成性。

代码如下

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>

#define high 30
#define width 30

int position_x,position_y;
int datewall[high][width]={0};
int oldhead_x,oldhead_y,oldtail_x,oldtail_y,newhead_x,newhead_y;
int food_x,food_y;

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
 } 

void gotoxy(int x,int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
	}	



void startup()
{
	int i,j;
	food_x=3,food_y=3;
	position_x=high/2;
	position_y=width/2;
	datewall[high/2][width/2]=1;
	for(i=0;i<=4;i++)
	{
		datewall[high/2][width/2-i]=1+i;
	}
	for(i=0;i<high;i++)
	{
	datewall[i][0]=-1;
	datewall[i][width-1]=-1;
		}
	
	for(i=0;i<width;i++)
	{
	datewall[0][i]=-1;
	datewall[high-1][i]=-1;
	}	
	datewall[food_x][food_y]=-2;

}	

void show()
{
	gotoxy(0,0);
	int i,j;
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if(datewall[i][j]==1)
			{
				printf("@");
			}
			else if(datewall[i][j]>1)
			{
				printf("*");
			}
			else if(datewall[i][j]==0)
		    {
		    	printf(" ");
			}
			else if(datewall[i][j]==-2)
			{
				printf("$");
			}
			else if(datewall[i][j]==-1)
			{
				printf("#");
			}
		}
		printf("\n");
	}
}

void updatewithoutinput()
{

}

void updatewithinput()
{


	char input;
	if(kbhit())
	{
				int i,j;
	int max=0;
	
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if(datewall[i][j]>0)
			{
				datewall[i][j]++; 
			}
		
		}
	}
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if(datewall[i][j]>max)
			{
				max=datewall[i][j];
				oldtail_x=i;
				oldtail_y=j;
			}
			if(datewall[i][j]==2)
			{
				oldhead_x=i;
				oldhead_y=j;
			}
		}
	}
	
		input=getch();
		if(input=='a')
		{
			
			 
			newhead_x=oldhead_x;
			newhead_y=oldhead_y-1;
		}
		if(input=='w')
		{
			
			 
			newhead_x=oldhead_x-1;
			newhead_y=oldhead_y;
		}
		if(input=='s')
		{
			
			 
			newhead_x=oldhead_x+1;
			newhead_y=oldhead_y;
		}
		if(input=='d')
		{
			
			 
			newhead_x=oldhead_x;
			newhead_y=oldhead_y+1;
		}
		if(datewall[newhead_x][newhead_y]==-2)
		{
			datewall[food_x][food_y]=0;
			food_x=rand()%(high-2);
			food_y=rand()%(width-2);
			datewall[food_x][food_y]=-2;
		}
		else
		{
			datewall[oldtail_x][oldtail_y]=0;
		}
		if(datewall[newhead_x][newhead_y]>0||datewall[newhead_x][newhead_y]==-1)
		{
			printf("游戏失败");
	        system("pause");
	        exit(0);
		}
		else
		{
			datewall[newhead_x][newhead_y]=1;
		}
	

	
}
}
int main()
{
	HideCursor();
	startup();
	while(1)
	{
		show();
		updatewithoutinput();
		updatewithinput();
	}
	return 0;
}

代码总数达到两百行,给我写崩溃了。

在游戏中我还学到了对于清屏的改进和对于光标的固定因为之前的清屏如果代码太多就会很花所以学习了这个

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
 } 

void gotoxy(int x,int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
	}	

虽然在教程中没提到这个代码中的每个字母代表什么而且在之前的课程中也没有介绍但是我相信我会在以后的学习中将他们全部掌握

还有对于操控的代码编程在之前读入输入的字符还需要在输入后点击回车键但是这个方法在游戏的过程中是非常不方便的所以在游戏的教程中就介绍了这种代码是在conio中的getch

以上是我在游戏编程中的体会

更多推荐

c语言学习进程及练习