精华内容
参与话题
问答
  • C语言小游戏之五子棋

    千次阅读 多人点赞 2018-12-12 20:32:18
    //五子棋游戏思路 //1、首先、打印游戏界面菜单(开始游戏、退出游戏) //2、然后玩家选择开始游戏,打印棋盘。(棋盘用二维数组表示,初始化为空格) //3、进行游戏,提示玩家输入棋盘坐标,玩家落子。玩家落子后,...

    //五子棋游戏思路
    //1、首先、打印游戏界面菜单(开始游戏、退出游戏)
    //2、然后玩家选择开始游戏,打印棋盘。(棋盘用二维数组表示,初始化为空格)
    //3、进行游戏,提示玩家输入棋盘坐标,玩家落子。玩家落子后,电脑随机落子
    //4、最后进行游戏判断,玩家胜还是电脑胜。
    //5、 字符’x’代表玩家棋子,字符’o’代表电脑棋子

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define ROW 5
    #define COL 5
    
    char qi[ROW][COL];
    //打印菜单
    void print(char qi[ROW][COL])
    {
    	for (int row=0;row<ROW;row++) 
    	{
    		printf("************************************\n");
    		printf("|      |      |      |      |      |\n");
    		printf("|   %c  |   %c  |   %c  |   %c  |   %c  |\n", qi[row][0], qi[row][1], qi[row][2], qi[row][3], qi[row][4]);
    		printf("|      |      |      |      |      |\n");
    	}
    	printf("************************************\n");
    }
    //检查是否下满
    int is_full(char qi[ROW][COL])
    {
    	for (int row = 0; row < ROW; row++)
    	{
    		for (int col = 0; col < COL; col++)
    		{
    			if (qi[row][col] == ' ')
    			{
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    
    //检查输赢
    char winner(char qi[ROW][COL])
    {
    	int row;
    	int col;
    	//遍历每一行,检查是否有相同棋子
    	for ( row = 0; row < ROW; row++)
    	{
    		if (qi[row][0] == qi[row][1] && qi[row][0] == qi[row][2] && qi[row][0] == qi[row][3] && qi[row][0] == qi[row][4] && qi[row][0]!=' ')
    		{
    			return qi[row][0];
    		}
    	}
    	//遍历每一列,检查是否有相同棋子
    	for ( col = 0; col < COL; col++)
    	{
    		if (qi[0][col] == qi[1][col] && qi[0][col] == qi[2][col] && qi[0][col] == qi[3][col] && qi[0][col] == qi[4][col] && qi[0][col]!=' ')
    		{
    			return qi[0][col];
    		}
    	}
    	//检查对角线是否有相同棋子
    	if (qi[0][0] == qi[1][1] && qi[0][0]== qi[2][2] && qi[0][0] == qi[3][3] && qi[0][0] == qi[4][4] && qi[0][0]!=' ')
    	{
    		return qi[0][0];
    	}
    	else if (qi[0][4] == qi[1][3] &&qi[0][4] == qi[2][2] && qi[0][4] == qi[3][1] && qi[0][4] == qi[4][0] && qi[0][4]!=' ')
    	{
    		return qi[0][4];
    	}
    	//平局
    	else if (is_full(qi) == 1)
    	{
    		return ' ';
    	}
    	else
    	{
    		return 'p';
    	}
    }
    //检查该位置是否有子
    int is_exist(char qi[ROW][COL], int row, int col)
    {
    	if (qi[row][col] == ' ')
    	{
    		return 1;
    	}
    	return 0;
    }
    
    //玩家落子
    void player_move(char qi[ROW][COL])
    {
    	int row = 0;
    	int col = 0;
    	while (1)
    	{
    		printf("请输入您想要落子的下标(x y):");
    		scanf("%d %d", &row, &col);
    		if (row < 0 || row >= ROW || col < 0 || col >= COL)
    		{
    			printf("输入不合法,请重新输入:");
    			continue;
    		}
    		if (is_exist(qi,row,col) == 1)
    		{
    			qi[row][col] = 'x';
    			print(qi);
    			break;
    		}
    		else 
    		{
    			printf("该位置已经有子,请重新输入:");
    			continue;
    		}
    	}
    }
    
    
    //电脑落子
    void computer_move(char qi[ROW][COL])
    {
    	printf("电脑落子\n");
    	while (1)  
    	{
    		int row = rand() % ROW;
    		int col = rand() % COL;
    		if (is_exist(qi, row, col) == 1)
    		{
    			qi[row][col] = 'o';
    			print(qi);
    			break;
    		}
    	}
    }
    
    //打印菜单
    void  menu()
    {
    	printf("*********************\n");
    	printf("1、开始游戏\n");
    	printf("2、退出游戏\n");
    	printf("*********************\n");
    }
    //初始化
    int Init(char qi[ROW][COL])
    {
    	int choice=0;
    	menu();//打印菜单
    	for (int row = 0; row < ROW; row++)//初始化棋盘为空字符
    	{
    		for (int col = 0; col < COL; col++)
    		{
    			qi[row][col] = ' ';
    		}
    	}
    	scanf("%d", &choice);
    	if (choice == 1)
    	{
    		print(qi);//如果选择开始游戏,打印棋盘
    	}
    	else if (choice == 2)
    	{
    		printf("Game Over!\n");
    	}
    	return choice;
    }
    
    int main()
    {
    		//产生随机种子
    	    srand((unsigned)time(0));
    		while (1)
    		{	
    			if (Init(qi) == 2 )
    			{
    				break;
    			}
    			while (1)
    			{	
    				//玩家落子
    				player_move(qi);
    				//检查是否平局
    				if (winner(qi) == 'p')
    				{
    					printf("平局\n");
    					break;
    				}
    				//检查输赢
    				if (winner(qi) == 'x')
    				{
    					printf("游戏结束、玩家胜利!\n");
    					break;
    				}
    				//电脑落子
    				computer_move(qi);
    				//检查输赢
    				if (winner(qi) == 'o')
    				{
    					printf("游戏结束、电脑胜利!\n");
    					break;
    				}
    			}
    		}
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述
    在这里插入图片描述
    //由于本游戏中电脑落子是随机产生的,故此,游戏比较简单也比较容易理解,希望可以对大家有所帮助

    展开全文
  • C语言实现推箱子游戏

    万次阅读 多人点赞 2019-09-28 22:57:23
    很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~ 一、介绍 开发语言:C语言 开发工具:Dev-C++ 5.11 日期:2019年9月28日 作者:...

    很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~

    一、介绍

    开发语言:C语言
    开发工具:Dev-C++ 5.11
    日期:2019年9月28日
    作者:ZackSock
    

    也不说太多多余的话了,先看一下效果图:
    在这里插入图片描述
    游戏中的人物、箱子、墙壁、球都是字符构成的。通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。

    二、代码实现

    关于代码方面,我尽可能讲的细致。希望大家可以理解~

    (1)方法列表

    //主函数
    void main();
    
    //初始化一些数据
    initData();
    
    //在控制台上打印地图
    drawMap();
    
    //向上移动
    moveUp();
    
    //向左移动
    moveLeft()
    
    //向下移动
    moveDown()
    
    //向右移动
    moveRight();
    

    这几个方法都顾名思义,而且用意也非常明确,就initData可能不知道具体用处,但是没有什么大问题。唯一的问题就是,上左下右的顺序可能会逼死几个强迫症患者,哈哈。

    (2)参数列表

    为了方便,我把include和宏定义也放到参数列表当中

    //导入函数库
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    //宏定义
    #define WIDTH 8
    #define HEIGHT 8
    
    //定义地图数组,二维数组有两个维度,而地图也是二维的矩形
    int map[HEIGHT][WIDTH] = {
    	{0, 0, 1, 1, 1, 0, 0, 0},
    	{0, 0, 1, 4, 1, 0, 0, 0},
    	{0, 0, 1, 0, 1, 1, 1, 1},
    	{1, 1, 1, 3, 0, 3, 4, 1},
    	{1, 4, 0, 3, 2, 1, 1, 1},
    	{1, 1, 1, 1, 3, 1, 0, 0},
    	{0, 0, 0, 1, 4, 1, 0, 0},
    	{0, 0, 0, 1, 1, 1, 0, 0} 
    };
    
    //人的位置,在二维地图中,我们可以用坐标表示一个人的位置,就好比经纬度
    int x, y;
    
    //箱子的个数,推箱子肯定要有箱子嘛。
    int boxs;
    

    这里参数不多,其中横为x,纵为y,另外这里再规定一下map的一些东西:

    /**
    *	0	表示空
    *	1	表示墙
    *	2	表示人
    *	3	表示箱子
    *	4	表示目的地(球)
    *	5	表示已完成的箱子
    */
    

    (3)函数具体分析

    接下来我们一个一个函数来分析。

    1、main函数
    int main(int argc, char *argv[]) {
    	char direction;		//存储键盘按的方向 
    	initData();			//初始化一些数据
    	
    	//开始游戏的循环,这里是个死循环,每按一次按钮循环一次
    	while(1){
    		//每次循环的开始清除屏幕
    		system("cls");
    		//绘画地图
    		drawMap();
    
    		//判断,当boxs的数量0时,!0为真,然后走break跳出循环(结束游戏) 
    		if(!boxs){
    			break;
    		}
    		
    		//键盘输入方向,这里使用getch,因为getch读取字符不会显示在屏幕上
    		direction = getch();
    		
    		//用switch判断用户输入的方向
    		switch(direction){
    			case 'w':
    				//按w时,调用向上移动函数
    				moveUp();
    				break;
    			case 'a':
    				//按a时,调用向左移动函数
    				moveLeft(); 
    				break;
    			case 's':
    				moveDown();
    				break;
    			case 'd':
    				moveRight();
    				break; 
    		}
    	}  
    	//当跳出循环时,运行该语句,游戏结束
    	printf("恭喜你完成游戏!※");
    	return 0;
    }
    

    我大概说一下流程,循环外面没有什么特别的。initData()只是一些简单数据的初始化,不需要太在意。循环中大致流程如下:

    • 清除屏幕
    • 绘制地图
    • 判断游戏是否结束
    • 对用户按下的按钮进行反馈

    进入循环体,先清除屏幕,再绘制地图,然后再判断游戏是否结束。可能大家对这个顺序不是很理解,这里我们先不考虑判断游戏结束的问题。我们把清屏和绘制地图合在一起,简称“重绘地图”,而游戏结束的判断先不考虑,那么流程就简化为“重绘地图 + 响应用户的操作”。简单来说就是,用户按一下按钮,我改变一下地图。

    2、initData()

    void initData(){
    	int i, j;
    	
    	//加载数据时让用户等待,一般情况加载数据比较快
    	printf("游戏加载中,请稍后........."); 
    	
    	//遍历地图中的数据
    	for(i = 0; i < HEIGHT; i++){
    		for(j = 0; j < WIDTH; j++){
    			//遍历到2(人)时,记录人的坐标。x, y是前面定义的全局变量
    			if(map[i][j] == 2){
    				x = j;
    				y = i;
    			} 
    			//遍历到3时,箱子的数目增加。boxs是前面定义的全局变量 
    			if(map[i][j] == 3){
    				boxs++;
    			}
    		}
    	} 
    }
    

    这个方法很简单,就是遍历地图,然后初始化人的位置和箱子的个数。这里有一点要注意一下,就是到底内层循环是WIDTH还是外层循环是WIDTH。在这里插入图片描述
    如图,在遍历过程中。外层循环控制行数,即HEIGHT。那么内层循环应该是WIDTH。

    3、drawMap()

    void drawMap(){
    	int i, j;
    	for(i = 0; i < WIDTH; i++){
    		for(j = 0; j < HEIGHT; j++){
    			switch(map[i][j]){
    				case 0:
    					printf("  ");
    					break;
    				case 1:
    					printf("■");
    					break;
    				case 2:
    					printf("♀");
    					break;
    				case 3:
    					printf("◆");
    					break;
    				case 4:
    					printf("●");
    					break;
    				case 5:
    					printf("★");
    					break; 
    			}
    		}
    		printf("\n");
    	}
    }
    

    这里也非常简单,变量map中的元素,然后通过switch判断应该输出的内容。然后内层循环每走完一次就换行。

    4、moveUp()

    这个函数内容有点多,想讲一下大概思路:

    向上移有两种情况
    1、前面为空白
    	这种情况有两个步骤
    	(1)将人当前的位置设置为空白(0),
    	(2)再讲人前面的位置设置为人(22、前面为箱子
    	当前面为箱子时有三种情况
    	1、箱子前面为空白
    		移动人和箱子,这个操作有三个步骤
    		(1)将人当前位置设置为空(0)
    		(2)将箱子位置设置为人(2)
    		(3)将箱子前面设置为箱子(32、箱子前面为墙
    		这种情况不需要做任何操作
    	3、箱子前面为终点
    		这种情况有四个个步骤
    		(1)将人的位置设置为空(0)
    		(2)将箱子的位置设置为人(2)
    		(3)将终点位置设置为★(5)
    		(4)箱子boxs的数量减一
    3、前面为墙
    	这种情况最简单,不需要做任何操作
    4、前面为终点
    	我这里没有考虑太多,这种情况不做操作。(如果更换地图的话可能需要修改代码)
    

    具体代码如下,解析我全写在注释里面:

    void moveUp(){
    	//定义变量存放人物上方的坐标
    	int ux, uy; 
    	
    	//当上方没有元素时,直接return	(其实人不可能在边缘)
    	if(y == 0){
    		return;
    	}
    	
    	//记录上方坐标,x为横,y为纵,所有ux = x, uy = y - 1;
    	ux = x;
    	uy = y - 1; 
    	
    	//上方为已完成的箱子
    	if(map[uy][ux] == 5){
    		return;
    	} 
    	//假设上方为墙,直接return,这个和上面的判断可以合在一起,这里为了看清楚分开写 
    	if(map[uy][ux] == 1){
    		return;
    	}
    	
    	//假设上方为箱子
    	if(map[uy][ux] == 3){
    		//判断箱子上方是否为墙 
    		if(map[uy - 1][ux] == 1){
    			return;
    		}
    		
    		//判断箱子上方是否为终点
    		if(map[uy - 1][ux] == 4){
    			//将箱子上面内容赋值为5★ 
    			map[uy - 1][ux] = 5;
    			map[uy][ux] = 0;
    					
    			//箱子的数目减1	
    			boxs--; 
    		}else{
    			//移动箱子
    			map[uy - 1][ux] = 3;
    		}
    	}
    	//当上面几种return的情况都没遇到,人肯定会移动,移动操作如下
    	map[y][x] = 0;
    	map[uy][ux] = 2;
    	//更新人的坐标
    	y = uy; 
    } 
    

    这是一个方向的,其它方向要考虑的问题也和前面一样,我也就不赘述了。

    6、moveLeft()

    这里大致都和上面一样,就是在记录左边坐标时,应该应该是lx = x - 1。

    void moveLeft(){
    	//定义变量存放人物左边的坐标
    	int lx, ly; 
    	
    	//当左边没有元素时,直接return	
    	if(x == 0){
    		return;
    	}
    	
    	//记录左边坐标
    	lx = x - 1;
    	ly = y; 
    	
    	//左边为已完成方块
    	if(map[ly][lx] == 5){
    		return;
    	} 
    	
    	//假设左边为墙,直接return 
    	if(map[ly][lx] == 1){
    		return;
    	}
    	
    	//假设左边为箱子
    	if(map[ly][lx] == 3){
    		//判断箱子左边是否为墙 
    		if(map[ly][lx - 1] == 1){
    			return;
    		}
    		
    		//判断箱子左边是否为球
    		if(map[ly][lx - 1] == 4){
    			//将箱子左边内容赋值为5★ 
    			map[ly][lx - 1] = 5;
    			map[ly][lx] = 0;
    		
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ly][lx - 1] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[ly][lx] = 2;
    	x = lx; 
    }
    

    7、moveDown()

    这里在判断边界时,判断的是 y == HEIGHT - 1。

    void moveDown(){
    	//定义变量存放人物下方的坐标
    	int dx, dy; 
    	
    	//当下方没有元素时,直接return	
    	if(y == HEIGHT - 1){
    		return;
    	}
    	
    	//记录下方坐标
    	dx = x;
    	dy = y + 1; 
    	
    	//下方为已完成方块
    	if(map[dy][dx] == 5){
    		return;
    	} 
    	
    	//假设下方为墙,直接return 
    	if(map[dy][dx] == 1){
    		return;
    	}
    	
    	//假设下方为箱子
    	if(map[dy][dx] == 3){
    		//判断箱子下方是否为墙 
    		if(map[dy + 1][dx] == 1){
    			return;
    		}
    		
    		//判断箱子下方是否为球
    		if(map[dy + 1][dx] == 4){
    			//将箱子下面内容赋值为5★ 
    			map[dy + 1][dx] = 5;
    			map[dy][dx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子
    			map[dy + 1][dx] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[dy][dx] = 2;
    	y = dy; 
    }
    

    8、moveRight()

    这里也没什么特别说的:

    void moveRight(){
    	//定义变量存放人物右边的坐标
    	int rx, ry; 
    	
    	//当右边没有元素时,直接return	
    	if(x == WIDTH - 1){
    		return;
    	}
    	
    	//记录右边坐标
    	rx = x + 1;
    	ry = y; 
    	
    	//右边为已完成方块
    	if(map[ry][rx] == 5){
    		return;
    	} 
    	
    	//假设右边为墙,直接return 
    	if(map[ry][rx] == 1){
    		return;
    	}
    	
    	//假设右边为箱子
    	if(map[ry][rx] == 3){
    		//判断箱子右边是否为墙 
    		if(map[ry][rx + 1] == 1){
    			return;
    		}
    		
    		//判断箱子左边是否为球
    		if(map[ry][rx + 1] == 4){
    			//将箱子右边内容赋值为5★ 
    			map[ry][rx + 1] = 5;
    			map[ry][rx] = 0;
    			
    			//箱子的数目减1 
    			boxs--; 
    		}else{
    			//移动箱子 
    			map[ry][rx + 1] = 3; 
    		}
    	}
    	map[y][x] = 0;
    	map[ry][rx] = 2;
    	x = rx; 
    }
    

    三、总结

    现在再回顾开始的运行步骤

    • 清除屏幕
    • 绘制地图
    • 判断游戏是否结束
    • 对用户按下的按钮进行反馈

    这里把判断游戏是否结束放到了重绘图像后面,因为在对用户进行反馈的时候只是改变了map中的数据,实际上最后一个箱子推到终点的图像还没有显示出来,所以要在重绘之后再判断是否结束游戏。

    代码有很多冗余的地方,一方面是想大家更好的理解,还有一方面出于懒。哈哈,代码运行起来没有问题,源码和源程序我会上传,有兴趣的可以下下来,或者直接复制代码运行也是没问题的。
    百度云连接如下:
    链接:https://pan.baidu.com/s/1pwEKt3VTKmssDgU6dLx0pg 提取码:4o9v

    展开全文
  • C语言小游戏

    多人点赞 2019-07-27 17:39:52
    C语言实现贪食蛇(循链表) 头文件 #include <stdio.h> #include <windows.h> #include <time.h> #include <stdlib.h> 宏定义 #define U 1 #define D 2 #define L 3 #define R...

    C语言实现贪吃蛇(循环链表)

    游戏欢迎界面

    游戏欢迎界面

    游戏运行界面

    游戏运行界面

    头文件

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

    宏定义

    #define U 1
    #define D 2
    #define L 3
    #define R 4
    #define GKS GetAsyncKeyState
    #define uint unsigned int 
    

    结构体

    typedef struct SNAKE
    {
    	int x;
    	int y;
    	struct SNAKE *next;	
    }snake;
    

    子函数声明

    void Pos();
    void creatMap();
    void gamecircle();
    void endgame();
    void welcometogame();
    void gamestart ();
    void pase();
    void initsnake();
    void cantcrosswall();
    void creatfood();
    int biteself();
    void pause();
    void snakemove();
    void gamestart_1(); 
    
    

    全局变量

    uint ends,status,sleeptime=0,a,b;
    int score=0,add=10;
    ///score:总得分 add:每次吃食物得分 ends:游戏结束原因
    snake *p,*head,*food,*q,*food_1;
    

    主函数

    int main()
    {
      	gamestart();
      	gamecircle(); 
    	endgame();
    	return 0;
    	 	
    }
    

    游戏欢迎函数

    void welcometogame() //游戏欢迎界面/// 
    {  
        system("title 贪吃蛇大战1.0 ");
        system("color 20"); 
    	Pos(40,12);
    	printf("欢迎来到贪吃蛇");
    	Pos(40,25);
    	printf("马上就进入游戏");
    	system("pause"); //暂停运行程序/// 
    	system("cls");一级欢迎页面(清除当前屏幕内容)/// 
    	Pos(40,10);
    	printf("游戏说明");
    	Pos(40,14);
    	printf("用↑ ↓ ← →控制蛇的身体");
    	Pos(40,15);
    	printf("高难度将能得到更高的分数");
    	Pos(40,16);
    	printf("1.普通模式2.中等模式3.难度模式"); 
    	Pos(40,18);
        printf("请选择游戏模式:");
        scanf("%d",&b);
        while(1)
    	{
             if(b==1){sleeptime=300;add=10;break;}
             else if (b==2){sleeptime=250;add=12;break;}
             else if(b==3){sleeptime=150;add=15;break;}
             else {printf("请重新输入:");scanf("%d",&b);}
        }  
    	system("pause");
    	system("cls"); ///二级欢迎界面/// 	
    }
    

    光标函数(win32 api 函数)

    void Pos(int x,int y) ///设置光标位置/ 
    {
       	COORD pos;
       	HANDLE hOutput;
    	pos.X=x;
    	pos.Y=y;
    	hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleCursorPosition(hOutput,pos);	
    }
    

    地图函数

    void creatMap() //创建地图//
    {
       int i;
       for(i=0;i<58;i+=2) //打印上下边框//
       {
          Pos(i,0);
          printf("■");
    	  Pos(i,26);
    	  printf("■");	
       }
       for(i=1;i<26;i++) //打印左右边框//
       {
       	  Pos(0,i);
       	  printf("■");
       	  Pos(56,i);
       	  printf("■");  
       }	
    		
    }
    

    游戏说明函数

    void gamecircle() //游戏说明//
    {
    	Pos(65,17);
    	printf("1.蛇的身体不能穿墙,也不能咬自己");
    	Pos(65,19);
    	printf("2.用↑↓←→控制蛇的身体");
    	Pos(65,21);
    	printf("4.ESC:退出游戏 Tab:暂停游戏");
    	Pos(65,25);
    	printf("每个食物得分:%d",add);
    	status=R;
    	while(1)
    	{	
    	  Pos(65,27);
    	  printf("目前得分为:%d",score);
    	  if(GKS(VK_UP)&&status!=D)status=U;
    	  else if(GKS(VK_DOWN)&&status!=U)status=D;
    	  else if(GKS(VK_LEFT)&&status!=R)status=L;
    	  else if(GKS(VK_RIGHT)&&status!=L)status=R;
    	  else if(GKS(VK_TAB))pause();
    	  else if(GKS(VK_ESCAPE)){ends=3;break;}
    	  Sleep(sleeptime);
    	  snakemove();
    	}
    	
    }
    

    游戏结束函数

    void endgame() //游戏结束界面//
    {
    	system("cls");
    	Pos(28,12);
    	if(ends==1)
    	printf("对不起,您撞墙了,游戏结束");
    	else if(ends==2)
    	printf("对不起,您自己咬自己了");
    	else if(ends==3)
    	printf("您自己结束游戏了");
    	Pos(28,13);
    	printf("您最后的得分是:%d\n",score);
    	Pos(28,17);
    	printf("1:是继续游戏,2:是直接退出"); 
    	Pos(28,19);
    	printf("请输入:");
    	scanf("%d",&a); 
    	while(1)
    	{
    	      if(a==1)
    		  {
    		    system("cls");
    		    gamestart_1();
    		    break;
    		  }
    	      else if(a==2)
    	      {
    	       system("cls");
    	       Pos(40,12);
    	       printf("欢迎下次再玩\n");
    	       system("pause");
    	       exit(0);
    	      }
    	      else
    		  {
    		    printf("请重新输入:");
    			scanf("%d",&a);
    		  }
        }
    }
    

    游戏界面初始化函数

    void gamestart() //游戏界面初始化//
    {
        system("mode con cols=100 lines=30");设置DOS界面的长宽 
    	welcometogame();
    	creatMap();
    	initsnake();
    	creatfood();
    		
    }
    

    蛇身初始化函数

    void initsnake() //初始化蛇身//
    {
        int i=1;
        p=(snake*)malloc(sizeof(snake)); //malloc函数返回是一个通用类型指针→ 
        p->x=24;                        //所以要强制类型转化成snake*(堆内存) 
        p->y=5;
        p->next=NULL;
        for(;i<=3;i++)
        {
          head=(snake*)malloc(sizeof(snake));
    	  head->next=p;
    	  head->x=24+i*2;
    	  head->y=5;
    	  p=head;
    	}
    	while(p->next!=NULL)
    	{
    		Pos(p->x,p->y);
    		printf("■");
    		p=p->next;	
    	}
     	
    }
    
    

    判断穿墙函数

    void cantcrosswall() //蛇不能穿墙//
    {
    	if(head->x==0||head->x==56||head->y==0||head->y==26)
    	{
    		ends=1;
    		endgame();
    	}	
    }
    

    食物生成函数

    void creatfood()///生成食物/// 
    { 
    	srand((unsigned)time(0));//生成种子// 
    	food_1=(snake*)malloc(sizeof(snake));
    	while(1)//判断是否一个食物节点成功 
    	{
    		if(food_1==NULL)
    		{
    		  while(food_1==NULL)
    		  {
    		   free(food_1);
    		   food_1=(snake*)malloc(sizeof(snake));
    	      }
    	    }
    	    else
    		{
    			food_1->x=rand()%52+2; //根据不同的种子产生不同的随机数//
    			if((food_1->x%2)==0)break;
    			else{
    				  free(food_1); 
    			      food_1=(snake*)malloc(sizeof(snake));
    			    } 	
    		}
    		
    	}
    	food_1->y=rand()%24+1;
    	q=head;
    	while(q->next!=NULL)
    	{
    		if(food_1->x==q->x&&food_1->y==q->y)
    		{
    			free(food_1);
    			creatfood();	
    		}
    	    q=q->next;
    	}
    	Pos(food_1->x,food_1->y);
        printf("■");
    	food=food_1;			
    }
    

    判断咬自己函数

    int biteself() //判断自己是否咬自己//
    {
    	snake*self;
    	self=head->next;
    	while(self->next!=NULL)
    	{
    		if(self->x==head->x&&self->y==head->y)return 1;
    		self=self->next;
        }
        return 0;
    }
    

    游戏暂停函数

    void pause() //暂停游戏///
    {
    	while(1)
    	{
    		Sleep(300);
    		if(GKS(VK_TAB))break;	
    	}	
    }
    

    蛇移动函数

    void snakemove() //控制蛇的移动//
    {
        snake*nexthead;
        cantcrosswall();
    	nexthead=(snake*)malloc(sizeof(snake));
    	if(status==U)//上// 
    	{
    	   nexthead->x=head->x;
    	   nexthead->y=head->y-1;
    	   if(nexthead->x==food->x&&nexthead->y==food->y) //有食物// 
    	   {
    	   	 nexthead->next=head;
    	   	 head=nexthead;
    	   	 q=head;
    	   	 while(q->next!=NULL)
    	   	 {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    		 }
    		 score+=add;
    		 creatfood();
    	   }
    		
    	   else //没食物// 
    	   {
    	   	   nexthead->next=head;
    	   	   head=nexthead;
    	   	   q=head;
    	   	  while(q->next->next!=NULL)
    	   	  {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    	   	   	
    		  }
    		  Pos(q->next->x,q->next->y);
    		  printf(" ");
    		  free(q->next);
    		  q->next=NULL;//避免出现野指针(如果不赋值NULL,那q->next访问的是一个垃圾内存)// 
    	   	
    	   }	
    	}
        
        if(status==D) //下// 
    	{
    	   nexthead->x=head->x;
    	   nexthead->y=head->y+1;
    	   if(nexthead->x==food->x&&nexthead->y==food->y)
    	   {
    	   	 nexthead->next=head;
    	   	 head=nexthead;
    	   	 q=head;
    	   	 while(q->next!=NULL)
    	   	 {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    		 }
    		 score+=add;
    		 creatfood();
    	   }
    		
    	   else
    	   {
    	   	   nexthead->next=head;
    	   	   head=nexthead;
    	   	   q=head;
    	   	  while(q->next->next!=NULL)
    	   	  {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    	   	   	
    		  }
    		  Pos(q->next->x,q->next->y);
    		  printf(" ");
    		  free(q->next);
    		  q->next=NULL;
    	   	
    	   }	
    	}
    	if(status==R) //右// 
    	{
    	   nexthead->x=head->x+2;
    	   nexthead->y=head->y;
    	   if(nexthead->x==food->x&&nexthead->y==food->y)
    	   {
    	   	 nexthead->next=head;
    	   	 head=nexthead;
    	   	 q=head;
    	   	 while(q->next!=NULL)
    	   	 {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    		 }
    		 score+=add;
    		 creatfood();
    	   }
    		
    	   else
    	   {
    	   	   nexthead->next=head;
    	   	   head=nexthead;
    	   	   q=head;
    	   	  while(q->next->next!=NULL)
    	   	  {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    	   	   	
    		  }
    		  Pos(q->next->x,q->next->y);
    		  printf(" ");
    		  free(q->next);
    		  q->next=NULL;
    	   	
    	   }	
    	}
    	
    	if(status==L) //左// 
    	{
    	   nexthead->x=head->x-2;
    	   nexthead->y=head->y;
    	   if(nexthead->x==food->x&&nexthead->y==food->y)
    	   {
    	   	 nexthead->next=head;
    	   	 head=nexthead;
    	   	 q=head;
    	   	 while(q->next!=NULL)
    	   	 {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    		 }
    		 score+=add;
    		 creatfood();
    	   }
    		
    	   else
    	   {
    	   	   nexthead->next=head;
    	   	   head=nexthead;
    	   	   q=head;
    	   	  while(q->next->next!=NULL)
    	   	  {
    	   	 	Pos(q->x,q->y);
    	   	 	printf("■");
    	   	 	q=q->next;		
    	   	   	
    		  }
    		  Pos(q->next->x,q->next->y);
    		  printf(" ");
    		  free(q->next);
    		  q->next=NULL;
    	   	
    	   }	
    	}
    
    	if(biteself()==1)
    	{
    		ends=2;
    		endgame();
    		
    	}
    			
    }
    

    游戏继续或退出函数

    void gamestart_1() //继续游戏或退出游戏//
    {   score=0;
    	creatMap();
    	initsnake();
    	creatfood();
    	gamecircle();
    }
    
    

    代码:https://download.csdn.net/download/qq_37451250/11438746

    展开全文
  • C语言基础

    千人学习 2020-01-08 14:13:00
    6、很多编译器,几乎所有操作系统Windows,Linux,Unix的大部分代码都是C,C在背后做了很多东西的,也许开发游戏用C++,安卓用XX更为合适,图形界面的用其他语言开发效率更高一些(因为他们封装了很多东西),但同样...
  • c语言贪吃蛇小游戏

    千次阅读 2019-03-10 22:13:23
    First 1 c语言贪吃蛇小游戏 欢迎交流 如有侵权还请联系 大家好! 每个人都想第一次尝试做出一个自己的程序。我想做这个贪吃蛇想了很久,但拖拉了不少时间才做出来,教训就是想到就要去做,拖延是可耻的。借鉴了很多...

    First 1 c语言贪吃蛇小游戏

    欢迎交流 如有侵权还请联系

    大家好! 每个人都想第一次尝试做出一个自己的程序。我想做这个贪吃蛇想了很久,但拖拉了不少时间才做出来,教训就是想到就要去做,拖延是可耻的。借鉴了很多人的代码,如果有侵权还请联系我会删除。

    程序开发步骤

    1.加载头文件
    2.写出宏定义
    3.系统结构
    4.功能模块
    5.代码运行调试
    6.总结

    1.加载头文件

    #include<stdio.h> 标准输入输出
    #include<string.h> 使用字符数组 strlen strcmp strcpy
    #include<windows.h>
    包含 WINDEF.H基础数据类型定义,WINNTH.H支持Umicode类型定义,WINBASE.H内核函数,WINUSER.H用户界面函数,WINGDI.H 图形设备接口函数
    #include<time.h> 日期和时间头文件
    #include<conio.h> 控制台输入输出,UNIX和Linux平台不包含此文件

    2.宏定义

    #define MAOWIDTH 60
    #define MAPHEIGHT 30
    #define SNAKESIZE 40

    3.系统结构

    typedef struct Food
    {
    int x;
    int y;
    };
    Food food;
    typedef struct Snake
    {
    int x[SNAKESIZE];
    int y[SNAKESIZE];

    int len;
    int speed;
    

    };
    Snake snake;

    4.功能模块

    void Furish(); //游戏结束后
    void creatMap(); //画出地图
    void creatFood(); //食物更替
    void keydown(); //按键处理
    int statuesnake(); //判断结束
    void gotoxy(int x,int y); //光标移动

    5.代码运行调试

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

    //辅助宏定义
    #define MAPHEIGHT 30
    #define MAPWIDTH 60
    #define SNAKESIZE 100

    //数据设计
    typedef struct Food
    {
    int x;
    int y;
    };
    Food food;
    typedef struct Snake
    {
    int x[SNAKESIZE];
    int y[SNAKESIZE];

    int len;
    int speed;
    

    };
    Snake snake;

    int changeflag=0; //蛇有没有吃食物
    int click=‘w’;

    void Furish();
    void creatMap();
    void creatFood();
    void keydown();
    int statuesnake();
    void gotoxy(int x,int y);

    int main()
    {
    creatMap();
    while(1)
    {
    creatFood();
    Sleep(snake.speed);
    keydown();
    if(!statuesnake())
    {
    Furish();
    break;
    }
    }
    return 0;
    }
    /
    void gotoxy(int x,int y)
    {
    HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord;
    coord.X=x;
    coord.Y=y;
    //同步控制台
    SetConsoleCursorPosition(handle,coord);
    }

    int statuesnake()
    {
    if(snake.x[0]==0||snake.x[0]==MAPWIDTH||snake.y[0]==0||snake.y[0]==MAPHEIGHT)
    return 0;
    for(int k=1;k<snake.len;k++)
    {
    if(snake.x[k]==snake.x[0]&&snake.y[k]==snake.y[0])
    return 0;
    }

    return 1;
    

    }
    ///
    void creatMap()
    {
    srand((unsigned int)time(NULL));

    for(int i=0; i<=MAPHEIGHT;i++)
    {
    gotoxy(0,i);
    printf("█");
    gotoxy(MAPWIDTH,i);
    printf("█");
    }
    
    for(int i=0;i<=MAPWIDTH;i+=2)
    {gotoxy(i,0);
    printf("█");
    gotoxy(i,MAPHEIGHT);
     printf("█");
     }
    
    ///
    
      
      	//蛇头 
    snake.x[0]=MAPWIDTH /2;
    snake.y[0]=MAPHEIGHT /2;
    gotoxy(snake.x[0],snake.y[0]);
      printf("█");
     snake.len=3;
     snake.speed=300;
     
    for(int k=1;k<snake.len;k++)
    {  
       snake.x[k]=snake.x[k-1]+2;
       snake.y[k]=snake.y[k-1];
       gotoxy(snake.x[k],snake.y[k]);
       printf("█");
    }  
    /
    	 //画食物 
      food.x=rand() % (MAPWIDTH-4)+2; 
     food.y=rand() % (MAPHEIGHT-2)+1;
      gotoxy(food.x,food.y);
      printf("⊙");
    

    }

    void creatFood()
    {
    if(snake.x[0]==food.x&&snake.y[0]food.y)
    {
    srand((int)time(NULL));//随机函数种子,食物出现位置
    int flag =1;
    while(flag
    1)
    {

    		food.x=rand()%(MAPWIDTH-4)+2;
    		food.y=rand()%(MAPHEIGHT-2)+1;//边框内
    		
    		for(int k=0;k<snake.len;k++)
    		{
    		    if(snake.x[k]==food.x&&snake.y[k]==food.y) 
                {
    			  flag=0;
    			  break;
    			}
            } 
    		  if(flag!=0&&food.x%2==0)
    		  {
    			break;
    		  }
    		  
    		
    	}
    	gotoxy(food.x,food.y);
    	printf("⊙");
    	snake.len++;
    	changeflag=1;       //食物被吃了
    	gotoxy(MAPWIDTH+2,MAPHEIGHT+2);	
    	printf("%d",snake.len);
    }
    

    }
    /

    void keydown()
    {
    if(_kbhit()) //有无接收到按键
    {
    fflush(stdin);
    click=_getch();
    }

    	//擦除最后一个的轨迹
       if(!changeflag)
      {
    	 gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
         printf("  ");	    
        }   
    /后面的蛇身 
      for(int i=snake.len-1;i>0;i--)
       {
    	   snake.x[i]=snake.x[i-1];
        	snake.y[i]=snake.y[i-1];
       }
     	
        switch(click)
      {
         	case 'w':
    		snake.y[0]--;
    		break;
         	case 's':
    		snake.y[0]++;		
    		break;
        	case 'a':
    		snake.x[0] -= 2; 
    	break;
        	case 'd':
    		snake.x[0] += 2;
    		break;
    	   
         }       
          gotoxy(snake.x[0],snake.y[0]);
           printf("█");
           changeflag=0;
           gotoxy(MAPHEIGHT+2,0);//移动不能一直看着光标 
    

    }

    void Furish()
    {
    system(“cls”);
    gotoxy(MAPWIDTH/2,MAPHEIGHT/2);
    printf("/");
    gotoxy(MAPWIDTH/2,MAPHEIGHT/2+4);
    printf(“come over”);
    gotoxy(MAPWIDTH/2,MAPHEIGHT/2+8);
    printf("/");
    system(“pause”);
    }

    6.总结

    kbhit()检查键盘中是否有输入;
    ffiush(stdin)清空缓冲区;
    system(""cls)清屏函数;
    while(1)死循环,除非为假一直执行;
    注意标点符号,格式内容是否正确,函数调用是否合理,条件位置是否正确;
    还有许多不足,欢迎大家指正。

    展开全文
  • C语言 贪吃蛇

    千次阅读 多人点赞 2018-09-16 14:55:01
    记--用C语言简单实现贪吃蛇小游戏。 二、效果 使用上下左右方向键控制方向,按ESC退出游戏。 三、代码结构 四、源代码 #include <stdio.h> //标准输入输出函数库 #include <stdlib.h>...
  • 一个C语言写的小游戏(flappy bird)

    千次阅读 2017-03-14 17:34:40
    这是类似于手机上曾经热门的一个手机游戏,本人能力有限这两天还没搞出图像库的文件,下次争取做一个图形交互的小游戏。 这个游戏主要运用了一些简单的C语言不过有一个清屏函数和一个去除光标的函数(看不懂没关系...
  • c语言编写小游戏:贪吃蛇

    千次阅读 多人点赞 2017-04-28 23:10:34
    c语言编写小游戏:贪吃蛇
  • C语言贪吃蛇小游戏

    千次阅读 2018-08-27 21:54:48
    整个代码都是C语言,其中调用少部分库函数,不如实现屏幕坐标打印的函数,贪吃蛇游戏代码的核心在于蛇身体坐标的更新,实现细节请看代码注释, 代码 //#include "stdafx.h" 如果是vc环境的话加上该...
  • 用TC开发的小游戏,全部资源上传。本人设计,原版!
  • c语言小游戏合集

    热门讨论 2013-03-04 22:45:47
    这是我用c语言写的程序,我在大三上学期的劳动成果展示。我的其他资源都是免费的,是对于c语言初学者的帮助比较大的,其中有数据结构,window编程。我也在学c语言,每当我写完一个程序,我都会免费发上来。
  • C语言魔塔游戏

    万次阅读 多人点赞 2019-11-19 11:14:09
    游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,...
  • 100个C语言经典小程序和C语言编写的小游戏

    万次阅读 多人点赞 2019-01-29 22:17:17
    100个C语言经典小程序和C语言编写的小游戏
  • C语言编程小游戏集锦

    热门讨论 2010-05-14 20:59:19
    1.1.3 C语言编程游戏的发展前景 5 1.2 研究意义和重要性 5 2.方案论证或可行性 6 2.1 方案论证 6 2.2 系统工具WIN-TC 7 2.3 可行性 11 3.贪吃蛇游戏设计 12 3.1 程序功能 12 3.2程序设计 12 3.2.1游戏界面 12 3.2.2...
  • c语言小游戏代码

    2012-01-03 01:08:29
    c语言小游戏代码,好几个
  • C语言游戏

    2006-02-23 09:05:59
    C语言小游戏精彩!不要错过!
  • C语言小游戏源代码

    2014-11-13 16:53:59
    C语言小游戏:C游戏编程从入门到精通;C语言~~自制-拼图游戏;C语言扫雷游戏源代码;C语言图形五子棋课程设计报告;俄罗斯方块游戏(C语言);贪吃蛇C语言
  • C语言小游戏源程序,C语言小游戏源程序,游戏代码,c语言代码
  • C语言写个贪吃蛇游戏

    万次阅读 多人点赞 2020-02-19 08:24:09
    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情。这个游戏我写完后放在知乎,竟然点赞的人数超级多。我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强...
  • 几个C语言小游戏源码

    2010-02-24 17:44:11
    几个C语言小游戏源码,很好用的,是学习c语言的好范例。喜欢能斑竹到大家。 第一:录制脚本 第二:脚本回放 第三:脚本优化 插入事物 插入集合点 设置参数 检查点 在事物之后添加一个log 日志输出函数 lr_log_...
  • 简易C语言2048游戏小游戏
  • C语言小游戏开发实例

    2011-05-06 13:35:16
    适合学了一定基础,想是编游戏的朋友!C语言开发实例小游戏教程。CHM格式。
  • 源代码 c语言 雷霆战机 vc及codeblocks均成功运行,有ege图形库实现的版本,请去我的其他资源寻找。
  • C语言小游戏开发

    万次阅读 多人点赞 2016-06-08 13:20:59
    这个C游戏是我的一个同学让我帮他朋友写的,因为一直催我,昨天下午叫我帮的忙,让我赶紧帮他朋友写完。所以昨晚花了几个小时帮他写的。大晚上的

空空如也

1 2 3 4 5 ... 20
收藏数 9,061
精华内容 3,624
关键字:

c语言游戏

c语言 订阅