c语言游戏基础姿势锦集 c语言游戏编程基础培训
一、c语言小游戏代码
最基础的贪吃蛇的代码
#include<stdio.h>
#include<windows.h>//基本型态定义。支援型态定义函数。运用者界面函数图形装置界面函数。
#include<conio.h>//用户通过按键盘产生的对应操作(控制台)
#include<stdlib.h>
#include<time.h>//日期和时刻头文件
#define LEN 30
#define WID 25
int Snake[LEN][WID]={0};//数组的元素代表蛇的各个部位
char Sna_Hea_Dir='a';//记录蛇头的移动路线
int Sna_Hea_X, Sna_Hea_Y;//记录蛇头的位置
int Snake_Len= 3;//记录蛇的长度
clock_t Now_Time;//记录当前时刻,以便自动移动
int Wait_Time;//记录自动移动的时刻间隔
int Eat_Apple= 1;//吃到苹果表示为1
int Level;
int All_Score=-1;
int Apple_Num=-1;
HANDLE hConsole= GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出的句柄<windows.h>
//句柄:标志应用程序中的不同对象和同类对象中的不同的实例方便操控,
void gotoxy(int x, int y)//配置光标位置
{
COORD pos={x,y};//定义壹个字符在控制台屏幕上的坐标POS
SetConsoleCursorPosition(hConsole, pos);//定位光标位置的函数<windows.h>
}
void Hide_Cursor()//隐藏光标固定函数
{
CONSOLE_CURSOR_INFO cursor_info={1, 0};
SetConsoleCursorInfo(hConsole,&cursor_info);
}
void SetColor(int color)//配置颜色
{
SetConsoleTextAttribute(hConsole, color);
//是API配置字体颜色和背景色的函数格式:SetConsoleTextAttribute(句柄,颜色);
}
void Print_Snake()//打印蛇头和蛇的脖子和蛇尾
{
int iy, ix, color;
for(iy= 0; iy< WID;++iy)
for(ix= 0; ix< LEN;++ix)
{
if(Snake[ix][iy]== 1)//蛇头
{
SetColor(0xf);//oxf代表分配的内存地址 setcolor:34行自定义配置颜色的函数
gotoxy(ix*2, iy);
printf("※");
}
if(Snake[ix][iy]== 2)//蛇的脖子
{
color= rand()%15+ 1;//rand()函数是产生随机数的壹个随机函数。C语言里还有 srand()函数等。
//头文件:stdlib.h
if(color== 14)
color-= rand()% 13+ 1;//变色
SetColor(color);
gotoxy(ix*2, iy);
printf("■");
}
if(Snake[ix][iy]== Snake_Len)
{
gotoxy(ix*2, iy);
SetColor(0xe);
printf("≈");
}
}
}
void Clear_Snake()//擦除贪吃蛇
{
int iy, ix;
for(iy= 0; iy< WID;++iy)
for(ix= 0; ix< LEN;++ix)
{
gotoxy(ix*2, iy);
if(Snake[ix][iy]== Snake_Len)
printf("");
}
}
void Rand_Apple()//随机产生苹果
{
int ix, iy;
do
{
ix= rand()% LEN;
iy= rand()% WID;
}while(Snake[ix][iy]);
Snake[ix][iy]=-1;
gotoxy(ix*2, iy);
printf("⊙");
Eat_Apple= 0;
}
void Game_Over()//蛇死掉了
{
gotoxy(30, 10);
printf("Game Over");
Sleep(3000);
system("pause> nul");
exit(0);
}
void Move_Snake()//让蛇动起来
{
int ix, iy;
for(ix= 0; ix< LEN;++ix)//先标记蛇头
for(iy= 0; iy< WID;++iy)
if(Snake[ix][iy]== 1)
{
switch(Sna_Hea_Dir)//根据新的蛇头路线标志蛇头
{
case'w':
if(iy== 0)
Game_Over();
else
Sna_Hea_Y= iy- 1;
Sna_Hea_X= ix;
break;
case's':
if(iy==(WID-1))
Game_Over();
else
Sna_Hea_Y= iy+ 1;
Sna_Hea_X= ix;
break;
case'a':
if(ix== 0)
Game_Over();
else
Sna_Hea_X= ix- 1;
Sna_Hea_Y= iy;
break;
case'd':
if(ix==(LEN- 1))
Game_Over();
else
Sna_Hea_X= ix+ 1;
Sna_Hea_Y= iy;
break;
default:
break;
}
}
if(Snake[Sna_Hea_X][Sna_Hea_Y]!=1&&Snake[Sna_Hea_X][Sna_Hea_Y]!=0&&Snake[Sna_Hea_X][Sna_Hea_Y]!=-1)
Game_Over();
if(Snake[Sna_Hea_X][Sna_Hea_Y]< 0)//吃到苹果
{
++Snake_Len;
Eat_Apple= 1;
}
for(ix= 0; ix< LEN;++ix)//处理蛇尾
for(iy= 0; iy< WID;++iy)
{
if(Snake[ix][iy]> 0)
{
if(Snake[ix][iy]!= Snake_Len)
Snake[ix][iy]+= 1;
else
Snake[ix][iy]= 0;
}
}
Snake[Sna_Hea_X][Sna_Hea_Y]= 1;//处理蛇头
}
void Get_Input()//控制蛇的移动路线
{
if(kbhit())
{
switch(getch())
{
case 87:
Sna_Hea_Dir='w';
break;
case 83:
Sna_Hea_Dir='s';
break;
case 65:
Sna_Hea_Dir='a';
break;
case 68:
Sna_Hea_Dir='d';
break;
default:
break;
}
}
if(clock()- Now_Time>= Wait_Time)//蛇到时刻自动行走
{
Clear_Snake();
Move_Snake();
Print_Snake();
Now_Time= clock();
}
}
void Init()//初始化
{
system("title贪吃毛毛蛇");
system("mode con: cols=80 lines=25");
Hide_Cursor();
gotoxy(61, 4);
printf("You Score:");
gotoxy(61, 6);
printf("You Level:");
gotoxy(61, 8);
printf("The Lenght:");
gotoxy(61, 10);
printf("The Speed:");
gotoxy(61, 12);
printf("Apple Num:");
int i;
for(i= 0; i< Snake_Len;++i)//生成蛇
Snake[10+i][15]= i+1;
int iy, ix;//打印蛇
for(iy= 0; iy< WID;++iy)
for(ix= 0; ix< LEN;++ix)
{
if(Snake[ix][iy])
{
SetColor(Snake[ix][iy]);
gotoxy(ix*2, iy);
printf("■");
}
}
}
void Pri_News()//打印信息
{
SetColor(0xe);
gotoxy(73,4);
All_Score+= Level;
printf("%3d", All_Score);
gotoxy(73, 6);
printf("%3d", Level);
gotoxy(73, 8);
printf("%3d",Snake_Len);
gotoxy(73, 10);
printf("0.%3ds", Wait_Time/10);
gotoxy(73, 12);
printf("%d", Apple_Num);
}
void Lev_Sys()//等级体系
{
if(((Apple_Num-1)/ 10)== Level)
{
++Level;
if(Wait_Time> 50)
Wait_Time-= 50;
else
if(Wait_Time> 10)
Wait_Time-= 10;
else
Wait_Time-= 1;
}
}
int main(void)
{
Init();
srand((unsigned)time(NULL));//配置随机数的种子
Now_Time= clock();
int speed1=1000,speed2,a;
printf("\n");
printf("请输入你想要的速度\n");
scanf("%d",&speed2);
Level=1;
Wait_Time=speed1-speed2;
printf("请输入你想要的苹果数\n");
scanf("%d",&a);
while(a--)
Rand_Apple();
while(1)
{
if(Eat_Apple)
{
++Apple_Num;
Rand_Apple();
Lev_Sys();
Pri_News();
}
Get_Input();
Sleep(10);
}
return 0;
}
二、C语言基础姿势拓展资料锦集
C语言基础姿势拓展资料锦集如下:
1、入门程序
2、数据类型
数据类型:
1.基本数据类型:
1.1.整型:int 4个字节
1.2.字符型:char 1个字节
1.3.实型(浮点型)
1.3.1.单精度型:float 4个字节
1.3.2.双精度型:double 8个字节
2.构造类型:
2.1.枚举类型
2.2.数组类型
2.3.结构体类型
2.4.共用体类型
3.指针类型:
4.空类型:
3.格式化输出语句
%d:十进制整数;
%c:单个字符;
%s:字符串;
%f:6位小数;
4.常量
值不发生改变的量成为常量;
定义字符常量(注意后面没有;)
5.运算符
5.1.算数运算符:+,-,*,/,%,++,--;前++/--,先运算,再取值.后++/--,先取值,再运算;
5.2.赋值运算符:
5.3.关系运算符;
5.4.逻辑运算符;
5.5.三目运算符:
表达式1?表达式2:表达式3;
6.水仙花数计算
输出全部三位数的水仙花数字
所谓“水仙花数”是指壹个三位数,其各位数字立方和等于该数,如:153就一个水仙花数,153=111+555+333。
7.打印正三角形的*
8.臭名远扬的goto语句
很少运用
9.形参和实参
形参:形参是在定义函数名和函数体的时候运用的参数,目的是用来接收调用该函数时传入的参数;
实参:实参是在调用时传递该函数的参数。
函数的形参和实参具有下面内容特征:
形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。形参只有在函数内部有效。函数调用结束返回主调函数后则不能再运用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值等办法使实参获取确定值。
在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
10.函数返回值注意
注意:void函数中可以有执行代码块,然而不能有返回值,另void函数中如果有return语句,该语句只能起到结束函数运行的功能。其格式为:return;
11.递归
12.变量存储类别!
12.1.生存周期划分存储方法
C语言根据变量的生存周期来划分,可以分为静态存储方法和动态存储方法。
静态存储方法:是指在程序运行期间分配固定的存储空间的方法。静态存储区中存放了在整个程序执行经过中都存在的变量,如全局变量。
动态存储方法:是指在程序运行期间根据需要进行动态的分配存储空间的方法。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。
12.2.存储类型划分
C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern);
用决定因素字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方法。
用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。
注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)
为了进步效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用决定因素字register作声明。
注意:只有局部自动变量和形式参数可以作为寄存器变量;壹个计算机体系中的寄存器数目有限,不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。
用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量。
13.内部函数外部函数!
在C语言中不能被其他源文件调用的函数称为内部函数,内部函数由static决定因素字来定义,因此又被称为静态函数,形式为:
static [数据类型]函数名([参数])
这里的static是对函数的影响范围的壹个限量,限量该函数只能在其所处的源文件中运用,因此在不同文件中出现相同的函数名称的内部函数是没有难题的。
在C语言中能被其他源文件调用的函数称为外部函数,外部函数由extern决定因素字来定义,形式为:
extern [数据类型]函数名([参数])
C语言规定,在没有指定函数的影响范围时,体系会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。 extern可以省略; 14.数组数组:一块连续的,大致固定而且里面的数据类型一致的内存空间,数组的声明:数据类型数组名称[长度n]
数据类型数组名称[长度n]={元素1,元素2,元素3,......};
数据类型数组名称[]={元素1,元素2,元素3,......};
数类类型数组名称[长度n];数组名称[0]=元素1;数组名称[1]=元素2;......注意: 1、数组的下标均以0开始;
2、数组在初始化的时候,数组内元素的个数不能大于声明的数组长度。
3、如果采用第一种初始化方法,元素个数小于数组的长度时,多余的数组元素初始化为0; 4、在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。
15.数组遍历
数组的冒泡排序
冒泡排序的想法:相邻元素两两相对,将较大的数字放在后面,直到将全部数字全部排序。
字符串和数组
在C语言中,是没有办法直接定义子字符串数据类型的,需运用数组来定义所要的字符串,形式如下:
char字符串名称[长度]="字符串内容";
char字符串名称[长度]={'字符串1','字符串2',....,'字符串n','\0'};
注:
[]中的长度可以省略不写;
采用第二种方法最后壹个元素必须是'\0',表示结束;
第二种方法不能写中文!;输出字符串时,要运用:printf("%s",字符数组名);或puts(字符数组名);
16.字符串函数
strlen(s):获取字符串s的长度;
strcmp(s1,s2):相对字符串;相对的时候会把字符串转换成ASCII码再进行相对,返回结局为0表示s1和s2的ASCII码值相等,返回结局为1表示s1比s2的ASCII码大,返回结局为-1表示s1比s2的A反恐精英II码小;
strcpy(s1,s2):字符串拷贝;s2会取代s1中的内容;
strcat(s1,s2)将s2拼接到s1后面;注意:s1的length要足够才可以!
atoi(s1)将字符串转为整数!
17.多维数组
数据类型数组名称[常量表达式1]...[常量表达式n];
多维数组的初始化和一维数组的初始化类似也是分两种:
数据类型数组名称[常量表达式1][常量表达式2]...[常量表达式n]={{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
数据类型数组名称[常量表达式1][常量表达式2]...[常量表达式n];数组名称[下标1][下标2]...[下标n]=值;
多维数组初始化要注意下面内容事项:
采用第一种始化时数组声明必须指定列的维数。由于体系会根据数组中元素的总个数来分配空间,当了解元素总个数以及列的维数后,会直接计算出行的维数;
采用第二种初始化时数组声明必须同时指定行和列的维数。
18.多维度数组的遍历
运用嵌套循环
注意:多维数组的每一维下标均不能越界!
19.结构体
C数组允许定义可存储相同类型数据项的变量,结构是 C编程中另一种用户自定义的可用的数据类型,它允许无论兄弟们存储不同类型的数据项。
结构用于表示一条记录,假设无论兄弟们想要跟踪图书馆中书本的动态,无论兄弟们也许需要跟踪每本书的下列属性:
Title
Author
Subject
Book ID
定义结构
为了定义结构,无论兄弟们必须运用 struct语句。struct语句定义了壹个包含多个成员的新的数据类型,struct语句的格式如下:
tag是结构体标签。
member-list是标准的变量定义,比如 int i;或者 float f,或者其他有效的变量定义。
variable-list结构变量,定义在结构的末尾,最后壹个分号之前,无论兄弟们可以指定壹个或多个结构变量。下面是声明 Book结构的方法:
在一般情况下,tag、member-list、variable-list这 3部分至少要出现 2个。下面内容为实例:
访问结构成员
为了访问结构的成员,大家运用成员访问运算符(.)。成员访问运算符是结构变量名称和大家要访问的结构成员之间的壹个句号。无论兄弟们可以运用 struct决定因素字来定义结构类型的变量。下面的实例示范了结构的用法:
20.共用体
共用体是一种独特的数据类型,允许无论兄弟们在相同的内存位置存储不同的数据类型。无论兄弟们可以定义壹个带有多成员的共用体,然而任什么时候候只能有壹个成员带有值。共用体提供了一种运用相同的内存位置的有效方法。
21.指针
22.文件读写
写入文件
读取文件
C语言和C++进修路线
23.排序算法
十大典范排序算法(动态示范+代码)
24.查找算法
九种查找算法
25.面试姿势
C语言和C++面试姿势拓展资料
26.字符串操作
字符串操作的综合拓展资料
27. C语言常用标准库解读
C语言常用标准库解读
28. C语言最常用的贪心算法
C语言最常用的贪心算法就这么被攻克了
29.常见的C语言内存错误及对策
常见的C语言内存错误及对策
30. C语言实现面给对象的原理
C语言实现面给对象的原理
31. C语言/C++内存管理
看完这篇你还能不懂C语言/C++内存管理?
32.再谈C语言指针
再谈指针:大佬给你拨开 C指针的云雾
C语言函数指针之回调函数
C语言指针详细解答(文末有福利)
33. C语言预处理命令
长文详细解答:C语言预处理命令
34. C语言高效编程和代码优化
C语言高效编程和代码优化
35. C语言结构体
C语言之结构体就这样被攻克了!值得收藏!
36.原码,反码,补码详细解答
原码,反码,补码详细解答
37. C语言宏定义
简述C语言宏定义的运用
38. c语言之共用体union、枚举、大致端玩法
c语言之共用体union、枚举、大致端玩法
C语言可以零基础入门,它的语法是很多顶级编程语言的基础,比如说 Java、C++;而且起到承上启下的影响,给上可以进修顶级编程语言,给下可以进修计算机组成原理、操作体系等等偏基础的计算机基础姿势。
书籍
第一本书《阿哈C语言》的写书风格个人认为相对风趣幽默,对于培养兴趣,基础进修还是很不错的
《C程序设计语言》,机械工业出版社,作者Brian W. Kernighan/(美)Dennis M. Ritchie。C语言之父写的,入门典范书籍。
《C Primer Plus》,人民邮电出版社,作者 Stephen Prata。可以作为 C语言工具书,也可以作为入门,内容循序渐进,能够锻炼编程想法。
《C和指针》深入了解指针,看完以后对指针不再害怕。
《C陷阱和缺陷》正如书上所说,“本书所揭示的姿势,至少能够帮助你减少 C代码和初级 C++代码中 90%的 Bug”,看完后可以避免 C语言开发的一些坑。
网课
1、《郝斌C语言自学教程》
2、《程序设计入门——C语言》(浙大翁恺)
小项目
包括C语言迷宫、24点游戏、奔跑的火柴人、超市管理体系、打字母、电子时钟、对对碰、俄罗斯方块、黑白棋、华容道、火车票订票管理源码、连连看、商品销售体系、象棋、超级玛丽、图书管理体系、学生成绩管理体系。
三、有C语言基础想开发游戏,还需要学哪些
C语言之因此命名为C,是由于 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。
1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。
20世纪60年代,美国AT&T企业贝尔实验室(AT&T Bell Laboratory)的研究员Ken Thompson闲来无事,手痒难耐,想玩壹个他自己编的,模拟在太阳系航行的电子游戏--Space Travel。他背着老板,找到了台空闲的机器--PDP-7。但这台机器没有操作体系,而游戏必须运用操作体系的一些功能,于是他着手为PDP-7开发操作体系。后来,这个操作体系被命名为--UNIX。
1970年,美国贝尔实验室的 Ken Thompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。而且他用B语言写了第壹个UNIX操作体系。
1971年,同样酷爱Space Travel的Dennis M.Ritchie为了能早些儿玩上游戏,加入了Thompson的开发项目,合作开发UNIX。他的主要职业是改造B语言,使其更成熟。
1972年,美国贝尔实验室的 D.M.Ritchie在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
1973年初,C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了UNIX。此时,编程的趣味使他们已经完全忘记了那个"Space Travel",一门心思地投入到了UNIX和C语言的开发中。随着UNIX的进步,C语言自身也在不断地完善。直到各种版本的UNIX内核和周边工具仍然运用C语言作为最主要的开发语言,其中还有不少继承Thompson和Ritchie之手的代码。
在开发中,他们还思考把UNIX移植到其他类型的计算机上运用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不也许在Alpha,SPARC和ARM等机器上运行。而C语言程序则可以运用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,接着将C源代码编译、连接成目标二进制文件之后即可运行。
1977年,Dennis M.Ritchie发表了不依赖于具体机器体系的C语言编译文本《可移植的C语言编译程序》。
C语言继续进步,在1982年,很多有识之士和美国民族标准协会为了使这个语言健壮地进步下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。1989年,ANSI公开了第壹个完整的C语言标准--ANSI X3.159-1989,简称"C89",不过大众也习性称其为"ANSI C"。C89在1990年被国际标准组织ISO(International Standard Organization)一字不改地采纳,ISO官方给予的名称为:ISO/IEC 9899,因此ISO/IEC9899: 1990也通常被简称为"C90"。1999年,在做了一些必要的修正和完善后,ISO公开了新的C语言标准,命名为ISO/IEC 9899:1999,简称"C99"。在2011年12月8日,ISO又正式公开了新的标准,称为ISO/IEC9899: 2011,简称为"C11"。