C/C++小游戲 ——貪吃蛇

文章目錄

    • 案例一
    • 案例二
    • 案例三
    • 案例四
    • 案例五
    • 案例六
    • 案例七
    • 案例八
    • 案例九

案例一

#include <stdio.h>#include <windows.h>#include <conio.h>#include <time.h>//游戲窗口#define FrameX 4//游戲窗口左上角的X軸坐標#define FrameY 4//游戲窗口左上角的Y軸坐標#define Frame_height 20//游戲窗口的高度#define Frame_width 20//游戲窗口的寬度//定義全局變量char reg_name[30]="",reg_pwd[10]="";char on_name[30],on_pwd[10];int i,j;int a[2];//用于記住蛇尾坐標,其中a[0]、a[1]分別表示橫、豎坐標//聲明蛇的結構體struct Snake {int x[100];//蛇的橫坐標,其中x[0]表示蛇尾的橫坐標,x[N-1]表示蛇頭的橫坐標int y[100];//蛇的豎坐標,其中y[0]表示蛇尾的豎坐標,y[N-1]表示蛇頭的豎坐標int count;//蛇吃食物的個數int length;//蛇的長度int speed;//蛇的速度};//聲明食物的結構體struct Food {int x;//食物的橫坐標int y;//食物的豎坐標};/******光標移到指定位置**************************************************************/void gotoxy(HANDLE hOut, int x, int y) {COORD pos;pos.X = x;//橫坐標pos.Y = y;//縱坐標SetConsoleCursorPosition(hOut, pos);//設置控制臺(cmd)光標位置 }/******設置文本為綠色*****************************************************************/void Set_TextColor_Green (void) {HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);//HANDLE:句柄,是Windows用來表示對象的(不是C++的對象),HWND是其中一種,HWND是HANDLE,但HANDLE不只是HWND,HANDLE是一個通用句柄表示,HWND是一個專用表示窗口的句柄。更具體的可查找MSDN。包含在winnt.h頭文件中。//GetStdHandle是一個Windows API函數。它用于從一個特定的標準設備(標準輸入、標準輸出或標準錯誤)中取得一個句柄(用來標識不同設備的數值)。SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);//SetConsoleTextAttribute是一個可以在API(應用程序編程接口)中設置控制臺窗口字體顏色和背景色的計算機函數,該函數被廣泛應用于電腦編程與軟件開發中。}/******制作游戲窗口******************************************************************/void make_frame() {HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定義顯示器句柄變量gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);//打印選擇菜單printf("Esc 退出游戲");gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);printf("長按方向鍵:加速");gotoxy(hOut,FrameX,FrameY);//打印框角printf("╔");gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);printf("╗");gotoxy(hOut,FrameX,FrameY+Frame_height);printf("╚");gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);printf("╝");for(i=2; i<2*Frame_width-2; i+=2) {gotoxy(hOut,FrameX+i,FrameY);printf("═");//打印上橫框}for(i=2; i<2*Frame_width-2; i+=2) {gotoxy(hOut,FrameX+i,FrameY+Frame_height);printf("═");//打印下橫框}for(i=1; i<Frame_height; i++) {gotoxy(hOut,FrameX,FrameY+i);printf("║");//打印左豎框}for(i=1; i<Frame_height; i++) {gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);printf("║");//打印右豎框}gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);//打印游戲名稱Set_TextColor_Green ();//設置蛇為綠色printf("貪吃蛇游戲");}/******結束菜單*******************************************************************/over_game() {system("cls");printf("\n\n\n\n\n\n\n\n\t\t\t\t游戲結束\n\n\n");Sleep(2000);return 0;}/******菜單信息***************************************************************/print_information(HANDLE hOut,struct Snake *snake,struct Food *food) {gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);printf("level : %d",snake->count/5+1);//打印游戲等級gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);printf("score : %d",10*snake->count);//打印游戲得分gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);printf("eat food : %d",snake->count);//打印產生食物個數?gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);printf("speed : %dms",snake->speed);//打印游戲速度gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9);printf("foodX : %d",food->x);//打印食物的橫坐標gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11);printf("foodY : %d",food->y);//打印食物的豎坐標}/******初始化蛇**********************************************************************/void init_snake(struct Snake *snake) {snake->x[0]=FrameX+2;//初始化蛇的橫坐標snake->y[0]=FrameY+Frame_height/2;//初始化蛇的豎坐標 snake->speed=300;//初始化蛇的速度為300mssnake->length=3;//初始化蛇的長度為3節snake->count=0;//初始化蛇吃的個數為0for(i=1; i<snake->length; i++){/* 依次得到蛇身、蛇頭的坐標 */snake->x[i]=snake->x[i-1]+2;snake->y[i]=snake->y[i-1];}}/******移動蛇*************************************************************************/void move_snake(HANDLE hOut,struct Snake *snake) {gotoxy(hOut,snake->x[0],snake->y[0]);printf("  ");/* 清除蛇尾*/for(i=1; i<snake->length; i++) {/* 后一節的坐標依次取代前一節的坐標 */snake->x[i-1]=snake->x[i];snake->y[i-1]=snake->y[i];}}/******打印蛇*************************************************************************/void print_snake(HANDLE hOut,struct Snake *snake){for(i=0; i<snake->length; i++){gotoxy(hOut,snake->x[i],snake->y[i]);if(i==0){printf("○");//打印蛇尾}else if(i==snake->length-1){printf("¤");//打印蛇頭}else{printf("⊙");//打印蛇身}}}/******隨機產生食物*******************************************************************/void get_food(HANDLE hOut,struct Snake *snake,struct Food *food) {srand((unsigned)time(NULL));//初始化隨機數,srand函數是隨機數發生器的初始化函數,防止每次產生的隨機數相同 while(1) {/* 產生食物的條件:1.在游戲窗口內 2.不在蛇的身上 */food->x = rand() % (Frame_width-1);  //rand()函數是Excel中產生隨機數的一個隨機函數。返回的隨機數是大于等于 0 及小于 1 的均勻分布隨機實數food->y = rand() % Frame_height;if( food->x==0 || food->y==0 ) {continue;}food->x = 2*food->x + FrameX;//得到食物的橫坐標food->y+=FrameY;//得到食物的豎坐標for(i=0; i<snake->length; i++){/* 判斷食物是否在蛇的身上,如果在蛇身上,則重新產生;否則,打印蛇身 */if( food->x==snake->x[i] && food->y==snake->y[i] ){break;}}if(i==snake->length){gotoxy(hOut,food->x,food->y);printf("⊙");break;}}}/******吃食物***************************************************************************/void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food){if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y ){/* 如果蛇頭位置與食物位置相同,吃食物 */snake->length++;//吃一個食物,蛇身增長一節for(i=snake->length-1; i>=1; i--){/* 蛇后節坐標依次賦值給蛇前一節的坐標,依次得到蛇身及蛇頭的坐標 */snake->x[i]=snake->x[i-1];snake->y[i]=snake->y[i-1];}snake->x[0]=a[0];//得到蛇尾移動前的橫坐標snake->y[0]=a[1];//得到蛇尾移動前的豎坐標get_food(hOut,snake,food);//重新產生食物snake->count++;//食物的個數增1if( snake->count%5==0 ){/* 當蛇吃Up_level個食物時,速度加快Up_speed毫秒并且升一級 */snake->speed-=50;}}}/******判斷蛇是否死**************************************************************************/int if_die(struct Snake *snake){/* 當蛇頭碰到自身時,蛇死 ,返回值為0 */for(i=0; i<snake->length-1; i++){if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] ){return 0;}}return 1;}/******登錄界面*******************************************************************************/
void regist() {system("pause");system("cls");printf("\n\n\t\t\t歡迎使用貪吃蛇注冊系統!\n\n");while(1){//輸入用戶名printf("\t\t請輸入用戶名[不能大于10個字符]:");scanf("%s",reg_name);//判斷用戶名if(strlen(reg_name)<=10){while(1){//輸入密碼printf("\n\t\t請輸入密碼[密碼長度為八位]:");scanf("%s",reg_pwd);//判斷密碼if(strlen(reg_pwd)==8){printf("\n\n\t\t注冊成功,您的用戶名是%s,密碼是%s\n\n",reg_name,reg_pwd);break;}else{printf("\n\t\t密碼的長度為%d,請重新輸入\n",strlen(reg_pwd));}}break;} else{printf("\n\t\t用戶名的長度為%d,請重新輸入\n\n",strlen(reg_name)); //strlen所作的是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符'\0'為止,然后返回計數器值(長度不包含'\0')。}}
}//判斷是否注冊int judge(){if(strcmp(reg_name,"")==0&&strcmp(reg_pwd,"")==0) //strcmp函數是string compare(字符串比較)的縮寫,用于比較兩個字符串并根據比較結果返回整數。基本形式為strcmp(str1,str2),若str1=str2,則返回零;若str1<str2,則返回負數;若str1>str2,則返回正數{printf("\n\n\t\t您尚未注冊,請先注冊!\n\n");return 0;}else{return 1;}
}/******開始游戲*******************************************************************************/start_game() {system("pause");system("cls");unsigned char ch=77;//定義用于接收鍵盤輸入的字符變量HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定義顯示器句柄變量struct Snake s,*snake=&s;//定義蛇的結構體指針并指向蛇的結構體struct Food f,*food=&f;//定義食物的結構體指針并指向食物的結構體make_frame();//制作游戲窗口init_snake(snake);//初始化蛇get_food(hOut,snake,food);//隨機產生食物while(1){print_information(hOut,snake,food);//打印菜單信息a[0]=snake->x[0];//記住蛇尾的橫坐標a[1]=snake->y[0];//記住蛇尾的豎坐標j=0;if(kbhit()){/* 判斷是否按下鍵盤,如果按下,ch接收鍵盤輸入 */ch=getch(); //getch是一個計算機函數,在windows平臺下從控制臺無回顯地取一個字符if(kbhit()) //用于非阻塞地響應鍵盤輸入事件。其中文可譯為“鍵盤敲擊”{/* 如果長按鍵盤,則加速 */Sleep(20);j=1;}}switch(ch){case 72:{/* 向上移動 */move_snake(hOut,snake);//移動蛇snake->y[snake->length-1]-=1;//蛇頭的豎坐標向上移,即減1break;}case 80:{/* 向下移動 */move_snake(hOut,snake);//移動蛇snake->y[snake->length-1]+=1;//蛇頭的豎坐標向下移,即加1break;}case 75:{/* 向左移動 */move_snake(hOut,snake);//移動蛇snake->x[snake->length-1]-=2;//蛇頭的橫坐標向左移,即減2break;}case 77:{/* 向右移動 */move_snake(hOut,snake);//移動蛇snake->x[snake->length-1]+=2;//蛇頭的橫坐標向右移,即加2break;}}if( ch==72 && snake->y[snake->length-1]==FrameY){return 0;	//如果蛇在上框且向上移動}if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height ){return 0;	//如果蛇在下框且向下移動}if( ch==75 && snake->x[snake->length-1]==FrameX ){return 0;	//如果蛇在左框且向左移動}if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 ){return 0;	//如果蛇在右框且向右移動}eat_food(hOut,snake,food);//吃食物print_snake(hOut,snake);//打印蛇if( if_die(snake)==0 || ch==27 || snake->speed==50 ){/* 游戲結束條件:1.蛇碰到自身 2.按Esc鍵 3.速度為50ms */gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1);printf("Game Over");Sleep(2000);break;;}if(j==0){Sleep(snake->speed);//延遲時間}else{Sleep(10);}}}
//用戶登錄void dl(){//定義變量system("color 0D");//設置文本為粉紅色int id;while(1){system("pause");system("cls");//輸出界面printf("                 **********************************                 \n");printf("                 **                              **                 \n");printf("                 **  歡迎使用貪吃蛇!            **                 \n");printf("                 **                              **                 \n");printf("                 **********************************                 \n");printf("                 -----------祝你使用愉快!----------                 \n");//輸入功能編號printf("                 **********************************                \n");printf("                 **                              **                 \n");printf("                 *****請選擇功能編號:*************                \n");printf("                 **                     ***      **                 \n");printf("                 **   1.注冊賬號。     *****     **                \n");printf("                 **                     ***      **                 \n");printf("                 **   2.登錄賬號。       *       **                \n");printf("                 **                      *       **                 \n");printf("                 **   0.退出系統。       *       **                \n");printf("                 **                      *       **                 \n");printf("                 **********************************                \n");printf("請輸入您的選擇:"); scanf("%d",&id);//判斷switch(id){case 1:regist();break;case 2:if(judge()==1){return;}break;case 0:exit(1);break;default:printf("\n\t\t您輸入的功能編號有誤,請重新輸入!\n");}}system("pause");system("cls");}int main() {int start_game();//開始游戲int over_game();//結束游戲dl();int d=3;int i;system("pause");system("cls");printf(		"	==============================================================================\n");printf(		"	==**************************************************************************==\n");printf(		"	==                      \\                   /                               ==\n");printf(		"	==                       \\                 /                 歡             ==\n");printf(		"	==                        \\               /                  迎             ==\n");printf(		"	==                 * * * * * * * * * * * * * * * *           來             ==\n");printf(		"	==                 * * * * * * * * * * * * * * * *           到             ==\n");printf(		"	==                 * *       /          \\      * *           貪             ==\n");printf( 	"	==                 * *      /            \\     * *           吃             ==\n");printf(     "	==                 * *                         * *           蛇             ==\n");printf( 	"	==                 * *         \\  /\\  /        * *                          ==\n");printf(		"	==                 * *          \\   \\/         * *                          ==\n");printf(		"	==                 * * * * * * * * * * * * * * * *                          ==\n");printf(		"	==                 * * * * * * * * * * * * * * * *                          ==\n");printf(		"	==                    *                       *                             ==\n");printf(		"	==                                                                          ==\n");printf(		"	==**************************************************************************==\n");printf(		"	******************************************************************************\n");printf("\n\n\t\t\t歡迎來到貪吃蛇登錄!嗶哩嗶哩-(゜-゜)つロ乾杯~\n\n");//三次登錄驗證for(i=1; i<=3; i++){printf("\t\t請輸入用戶名:");scanf("%s",on_name);printf("\n\t\t請輸入密  碼:");scanf("%s",on_pwd);if(strcmp(reg_name,on_name)==0&&strcmp(reg_pwd,on_pwd)==0){printf("\n\n\t\t登錄成功,歡迎使用貪吃蛇!\n\n");start_game();//開始游戲over_game();//結束游戲return 0;}else{printf("\n\n\t\t登錄失敗,請重新登錄,您還有%d次機會\n\n",3-i);d=d--;if(d=0){return 0;}}}}

案例二

#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include<string.h>
#define up 'w' 
#define down 's' 
#define left 'a' 
#define right 'd' 
#define stop 'p'
void welcome();               //55開始界面void Finish();                //291結束界面void creatgraph();            //69圍墻打印void gotoxy(int x, int y);    //111光標跳轉,橫為X 0,1,2..void gotoprint(int x, int y); //121跳轉打印void gotodelete(int x, int y);//127跳轉刪除void creatfood();             //133食物產生int ClickControl();           //157獲取鍵盤信號int Judge();                  //270游戲結束判斷void MovingBody();      //172蛇的移動 void Eating();                //223蛇吃到東西后的操作(伸長)void ChangeBody(int a,int b); //245蛇的坐標變換,后一個復制前一個STRUCT,a,b為head之前坐標 typedef struct snakes{int x;int y;struct snakes *Next;
}snake;
snake *Head;
snake *tail;
struct Food{int x;int y;
}food;
char name[20];
int score=0;
int speed;
char click=1;void welcome();               //開始界面
void Finish()                //結束界面
{system("cls");gotoxy(15, 10);printf("/**********************************************/");gotoxy(15, 20);printf("/**********************************************/");gotoxy(18, 14);printf("GAME   OVER      o(* ̄▽ ̄*)o");gotoxy(20, 16);printf("Your Score is %d    hiahiahia", score);gotoxy(18, 18);gotoxy(0, 27);system("pause");	}
void creatgraph()            //圍墻打印
{int i;for(i=0;i<58;i+=2){gotoprint(i, 0);gotoprint(i, 26);}for(i=1;i<26;i++){gotoprint(0, i);gotoprint(56, i);}gotoxy(63, 10);printf("歡迎來到游戲%s",name); gotoxy(63,15);printf("您的得分是:%s",score);gotoxy(104,29);printf("游戲制作者李德旭");Head = (snake*)malloc(sizeof(snake));Head->x = 16;Head->y = 15;tail=(snake*)malloc(sizeof(snake));snake *p=(snake*)malloc(sizeof(snake));snake *q=(snake*)malloc(sizeof(snake));p->x= 16;p->y= 16;q->x = 16;q->y = 17;Head->Next=p;p->Next=q;q->Next=tail;tail->Next=NULL;}
void gotoxy(int x, int y)    //光標跳轉,橫為X 0,1,2..
{COORD pos;HANDLE hOutput;pos.X=x;pos.Y=y; hOutput= GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput,pos);}
void gotoprint(int x, int y) //跳轉打印
{gotoxy(x,y);printf("■");}
void gotodelete(int x, int y)//跳轉刪除{gotoxy(x, y);printf("  ");}void creatfood()             //食物產生
{srand((int)time(NULL)); lable:food.y = rand() % (25 - 1 + 1) + 1;food.x = rand() % (54 - 2 + 1) + 2;if (food.x % 2 != 0){food.x = food.x+1;}snake *judge = Head;while (1)  //遍歷排除蛇身重復{if (judge->Next == NULL) break;if (food.x == judge->x&&food.y == judge->y){goto lable;}judge = judge->Next;}gotoxy(food.x, food.y);printf("⊙");}int ClickControl()           //獲取鍵盤信號
{char c;while (1){if (Judge()==0) return 0;if(_kbhit()){click=_getch();}MovingBody();Eating();}return 1;}int Judge()                  //游戲結束判斷
{if(Head->x==0||Head->y==0||Head->x==56||Head->y==26) {Finish();return 0;}snake *p=Head->Next;while(p->Next!=NULL){if(Head->x==p->x&&Head->y==p->y){Finish();return 0;}	p=p->Next;}return 1;
}
void MovingBody()      //蛇的移動 
{int count=0;int a=Head->x,b=Head->y;snake *p=Head;while(1){if(p->Next==NULL)break;gotodelete(p->x,p->y);count++;p=p->Next;} switch(click){case up:Head->y-=1;	ChangeBody(a,b);break;case down:Head->y+=1;ChangeBody(a,b);break;case left:Head->x-=2;ChangeBody(a,b);break;	case right:Head->x+=2;ChangeBody(a,b);break;	}		p=Head;while(p->Next!=NULL){gotoprint(p->x,p->y);p=p->Next;}p=Head;gotoxy(0,28);if (count<=10)speed=150;else if(count>10&& count<=20)speed=100;else if(count>20&& count<=40)speed=50;else speed=10;Sleep(speed);}
void Eating()                //蛇吃到東西后的操作(伸長)
{if (Head->x == food.x&&Head->y == food.y){creatfood();snake *_new = (snake*)malloc(sizeof(snake));snake *p;p = Head;while (1){if (p->Next->Next == NULL) break;p = p->Next;}p->Next = _new;_new->Next = tail;score += 10;gotoxy(77, 15);printf("%d", score);}}
void ChangeBody(int a,int b) //蛇的坐標變換,后一個復制前一個STRUCT,a,b為head之前坐標 {snake *p=Head->Next; int mid1,mid2,_mid1,_mid2;mid1=p->x;mid2=p->y; while(1){if(p->Next->Next==NULL)break;_mid1=p->Next->x;_mid2=p->Next->y;p->Next->x=mid1;p->Next->y=mid2;mid1 = _mid1;mid2 = _mid2; p = p->Next;	}p=Head->Next;p->x = a;p->y = b;}
int main(){creatgraph();creatfood();if (ClickControl() == 0) return 0;}

案例三

#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<stdlib.h> 
#define U 1
#define D 2
#define L 3 
#define R 4       //蛇的狀態,U:上 ;D:下;L:左 R:右typedef struct SNAKE //蛇的節點 {int x;int y;struct SNAKE *next;}snake;//全局變量//int score = 0, add = 10;//總得分與每次吃食物得分。int status, sleeptime = 200;//每次運行的時間間隔snake *head, *food;//蛇頭指針,食物指針snake *q;//遍歷蛇的時候用到的指針int endGamestatus = 0; //游戲結束的情況,1:撞到墻;2:咬到自己;3:主動退出游戲。//聲明全部函數//void Pos();//位置函數 void creatMap();//創造地圖 void initSnake();//蛇的初始化 void snakeMove();//蛇的移動 int biteSelf();//咬自己 void createFood();//創造食物 void cantCrossWall();//不能穿墻 void pause();//暫停 void runGame();//控制游戲 void initGame();//游戲初始化 void endGame();//游戲結束 void gameStart();//游戲開始 void speeddown();//減速 void speedup();//加速 void Pos(int x, int y)//設置光標位置{COORD pos;//定義結構體變量pos HANDLE hOutput;//新建句柄 hOutput pos.X = x;pos.Y = y;SetConsoleTextAttribute(hOutput,10|1);hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回標準的輸入、輸出或錯誤的設備的句柄,也就是獲得輸入、輸出/錯誤的屏幕緩沖區的句柄SetConsoleCursorPosition(hOutput, pos);}void creatMap()//創建地圖{int i;for (i = 0; i<58; i=i+2)//打印上下邊框{Pos(i, 0);printf("■");//一個方塊占兩個位置Pos(i, 25);printf("■");}for (i = 0; i<26; i++)//打印左右邊框{Pos(0, i);printf("■");Pos(56, i);printf("■");}}void initSnake()//初始化蛇身{snake *tail;int i;tail = (snake*)malloc(sizeof(snake));//從蛇尾開始,頭插法,以x,y設定開始的位置tail->x = 24;tail->y = 5;tail->next = NULL;for (i = 1; i <=3; i++)//初始長度為4{head = (snake*)malloc(sizeof(snake));head->next = tail;		  head->x = 24 +2*i;          head->y = 5;tail= head;}while (tail!= NULL)//從頭到尾,輸出蛇身 {Pos(tail->x, tail->y);printf("■");tail = tail->next;      }    }//int biteSelf()//判斷是否咬到了自己{snake *self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y){return 1;} self = self->next;}return 0;}void createFood()//隨機出現食物{snake *food_1;srand((unsigned)time(NULL));//為了防止每次產生的隨機數相同,種子設置為timefood_1 = (snake*)malloc(sizeof(snake));//初始化food_1 food_1->x=rand()%53+2;while ((food_1->x % 2)!= 0)    //保證其為偶數,使得食物能與蛇頭對齊 { food_1->x = food_1->x+1 ;//活動范圍 }food_1->y = rand()%23+1; q = head;while (q->next !=NULL){if (q->x == food_1->x && q->y == food_1->y) //判斷蛇身是否與食物重合{free(food_1);createFood();}q = q->next;}Pos(food_1->x, food_1->y);food = food_1;printf("$");}void cantCrossWall()//不能穿墻{if (head->x == 0 || head->x == 54 || head->y == 0 || head->y == 24){endGamestatus = 1;endGame();}}void snakeMove()//蛇前進,上U,下D,左L,右R{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 != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createFood();}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 == 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 != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createFood();}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 != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createFood();}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 != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createFood();}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)       //判斷是否會咬到自己{endGamestatus = 2;endGame();}}void pause()//暫停{while (1){Sleep(300);if (GetAsyncKeyState(VK_SPACE)){break;}}}void runGame()//控制游戲        {Pos(64, 15);printf("不能穿墻,不能咬到自己\n");Pos(64, 16);printf("用↑.↓.←.→分別控制蛇的移動.");Pos(64, 18);printf("ESC :退出游戲.space:暫停游戲.");status = R; while (1){Pos(64, 10);printf("得分:%d  ", score);Pos(64, 11);printf("每個食物得分:%d分", add);if (GetAsyncKeyState(VK_UP) && status != D)//GetAsyncKeyState函數用來判斷函數調用時指定虛擬鍵的狀態{status = U;//如果蛇不是向下前進的時候,按上鍵,執行向上前進操作}else if (GetAsyncKeyState(VK_DOWN) && status != U)//如果蛇不是向上前進的時候,按下鍵,執行向下前進操作{status = D;}else if (GetAsyncKeyState(VK_LEFT) && status != R)//如果蛇不是向右前進的時候,按左鍵,執行向左前進{status = L;}else if (GetAsyncKeyState(VK_RIGHT) && status != L)//如果蛇不是向左前進的時候,按右鍵,執行向右前進{status = R;}else if (GetAsyncKeyState(VK_SPACE)){pause();}else if (GetAsyncKeyState(VK_ESCAPE)){endGamestatus = 3;break;}Sleep(300);snakeMove();}}void initGame()//開始界面
{Pos(40, 12); printf("歡迎來到貪食蛇游戲!");system("pause");system("cls");Pos(25, 12);printf("用↑.↓.←.→分別控制蛇的移動,\n");system("pause");system("cls");}void endGame()//結束游戲{system("cls");Pos(24, 12);if (endGamestatus == 1){printf("對不起,您撞到墻了。游戲結束.");}else if (endGamestatus == 2){printf("對不起,您咬到自己了。游戲結束.");}else if (endGamestatus == 3){printf("您的已經結束了游戲。");}Pos(24, 13);printf("您的得分是%d\n", score);exit(0);}void gameStart()//游戲初始化{initGame();creatMap();initSnake();createFood();}int main(){  while(1){gameStart();runGame();}endGame();return 0;
}

案例四


#include <stdio.h>#include <stdlib.h>#include <Windows.h>//windows編程頭文件#include <time.h>#include <conio.h>//控制臺輸入輸出頭文件#define SNAKESIZE 100//蛇的身體最大節數#define MAPWIDTH 118 //寬度#define MAPHEIGHT 29//高度//食物的坐標struct food
{int x;int y;}food;//蛇的相關屬性struct snake{int speed;//蛇移動的速度int len;//蛇的長度int x[SNAKESIZE];//組成蛇身的每一個小方塊中x的坐標int y[SNAKESIZE];//組成蛇身的每一個小方塊中y的坐標}snake;//繪制游戲邊框void drawMap();//隨機生成食物void createFood();//按鍵操作void keyDown();//蛇的狀態bool snakeStatus();//從控制臺移動光標void gotoxy(int x, int y);int key = 72;//表示蛇移動的方向,72為按下“↑”所代表的數字//用來判斷蛇是否吃掉了食物,這一步很重要,涉及到是否會有蛇身移動的效果以及蛇身增長的效果int changeFlag = 0;int sorce = 0;//記錄玩家的得分//將控制臺光標移到(x,y)處void gotoxy(int x, int y){COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}void drawMap(){//打印上下邊框for (int i = 0; i <= MAPWIDTH; i += 2)//i+=2是因為橫向占用的是兩個位置{//將光標移動依次到(i,0)處打印上邊框gotoxy(i, 0);printf("■");//將光標移動依次到(i,MAPHEIGHT)處打印下邊框gotoxy(i, MAPHEIGHT);printf("■");}//打印左右邊框for (int i = 1; i < MAPHEIGHT; i++){//將光標移動依次到(0,i)處打印左邊框gotoxy(0, i);printf("■");//將光標移動依次到(MAPWIDTH, i)處打印左邊框gotoxy(MAPWIDTH, i);printf("■");}//隨機生成初試食物while (1){srand((unsigned int)time(NULL));food.x = rand() % (MAPWIDTH - 4) + 2;food.y = rand() % (MAPHEIGHT - 2) + 1;//生成的食物橫坐標的奇偶必須和初試時蛇頭所在坐標的奇偶一致,因為一個字符占兩個字節位置,若不一致//會導致吃食物的時候只吃到一半if (food.x % 2 == 0)break;}//將光標移到食物的坐標處打印食物gotoxy(food.x, food.y);printf("★");//初始化蛇的屬性snake.len = 3;snake.speed = 200;//在屏幕中間生成蛇頭snake.x[0] = MAPWIDTH / 2 + 1;//x坐標為偶數snake.y[0] = MAPHEIGHT / 2;//打印蛇頭gotoxy(snake.x[0], snake.y[0]);printf("■");//生成初試的蛇身for (int i = 1; i < snake.len; i++){//蛇身的打印,縱坐標不變,橫坐標為上一節蛇身的坐標值+2snake.x[i] = snake.x[i - 1] + 2;snake.y[i] = snake.y[i - 1];gotoxy(snake.x[i], snake.y[i]);printf("■");}//打印完蛇身后將光標移到屏幕最上方,避免光標在蛇身處一直閃爍gotoxy(MAPWIDTH - 2, 0);return;}void keyDown(){int pre_key = key;//記錄前一個按鍵的方向if (_kbhit())//如果用戶按下了鍵盤中的某個鍵{fflush(stdin);//清空緩沖區的字符//getch()讀取方向鍵的時候,會返回兩次,第一次調用返回0或者224,第二次調用返回的才是實際值key = _getch();//第一次調用返回的不是實際值key = _getch();//第二次調用返回實際值}if (changeFlag == 0){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];}//蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走//如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向if (pre_key == 72 && key == 80)key = 72;if (pre_key == 80 && key == 72)key = 80;if (pre_key == 75 && key == 77)key = 75;if (pre_key == 77 && key == 75)key = 77;/***控制臺按鍵所代表的數字*“↑”:72*“↓”:80*“←”:75*“→”:77*///判斷蛇頭應該往哪個方向移動switch (key){case 75:snake.x[0] -= 2;//往左break;case 77:snake.x[0] += 2;//往右break;case 72:snake.y[0]--;//往上break;case 80:snake.y[0]++;//往下break;}//打印出蛇頭gotoxy(snake.x[0], snake.y[0]);printf("■");gotoxy(MAPWIDTH - 2, 0);//由于目前沒有吃到食物,changFlag值為0changeFlag = 0;return;}void createFood(){if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇頭碰到食物{//蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物while (1){int flag = 1;srand((unsigned int)time(NULL));food.x = rand() % (MAPWIDTH - 4) + 2;food.y = rand() % (MAPHEIGHT - 2) + 1;//隨機生成的食物不能在蛇的身體上for (int i = 0; i < snake.len; i++){if (snake.x[i] == food.x && snake.y[i] == food.y){flag = 0;break;}}//隨機生成的食物不能橫坐標為奇數,也不能在蛇身,否則重新生成if (flag && food.x % 2 == 0)break;}//繪制食物gotoxy(food.x, food.y);printf("★");snake.len++;//吃到食物,蛇身長度加1sorce += 10;//每個食物得10分snake.speed -= 5;//隨著吃的食物越來越多,速度會越來越快changeFlag = 1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果}return;}bool snakeStatus(){//蛇頭碰到上下邊界,游戲結束if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)return false;//蛇頭碰到左右邊界,游戲結束if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)return false;//蛇頭碰到蛇身,游戲結束for (int i = 1; i < snake.len; i++){if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])return false;}return true;}int main(){drawMap();while (1){keyDown();if (!snakeStatus())break;createFood();Sleep(snake.speed);}gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);printf("Game Over!\n");gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);printf("本次游戲得分為:%d\n", sorce);Sleep(5000);return 0;}

案例五

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>//windows編程頭文件
#include <time.h>
#include <conio.h>//控制臺輸入輸出頭文件//在一個大的軟件工程里面,可能會有多個文件同時包含一個頭文件
//當這些文件編譯鏈接成一個可執行文件時,就會出現大量“重定義”的錯誤
//在頭文件中使用#ifndef #define #endif能避免頭文件的重定義#ifndef __cplusplus//用于將c++的代碼以標準c的形式輸出 typedef char bool;
#define false 0
#define true  1#endif//將光標移動到控制臺的(x,y)坐標點處
void gotoxy(int x, int y)
{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);//設置控制臺光標的位置 
}#define SNAKESIZE 100//蛇的身體最大節數
#define MAPWIDTH 78//寬度
#define MAPHEIGHT 24//高度//食物的坐標
struct food{int x;int y;
}food;//蛇的相關屬性
struct snake{int speed;//蛇移動的速度int len;//蛇的長度int x[SNAKESIZE];//組成蛇身的每一個小方塊中x的坐標int y[SNAKESIZE];//組成蛇身的每一個小方塊中y的坐標}snake;//繪制游戲邊框
void drawMap();
//隨機生成食物
void createFood();
//按鍵操作
void keyDown();
//蛇的狀態
bool snakeStatus();
//從控制臺移動光標
void gotoxy(int x, int y);int key = 72;//表示蛇移動的方向,72為按下“↑”所代表的數字//用來判斷蛇是否吃掉了食物,這一步很重要,涉及到是否會有蛇身移動的效果以及蛇身增長的效果
int changeFlag = 0;int sorce = 0;//記錄玩家的得分int i;
void drawMap()
{//打印上下邊框for (i = 0; i <= MAPWIDTH; i += 2)//i+=2是因為橫向占用的是兩個位置{//將光標移動依次到(i,0)處打印上邊框gotoxy(i, 0);printf("■");//將光標移動依次到(i,MAPHEIGHT)處打印下邊框gotoxy(i, MAPHEIGHT);printf("■");}//打印左右邊框for (i = 1; i < MAPHEIGHT; i++){//將光標移動依次到(0,i)處打印左邊框gotoxy(0, i);printf("■");//將光標移動依次到(MAPWIDTH, i)處打印左邊框gotoxy(MAPWIDTH, i);printf("■");}//隨機生成初試食物while (1){srand((unsigned int)time(NULL));food.x = rand() % (MAPWIDTH - 4) + 2;food.y = rand() % (MAPHEIGHT - 2) + 1;//生成的食物橫坐標的奇偶必須和初試時蛇頭所在坐標的奇偶一致,因為一個字符占兩個字節位置,若不一致//會導致吃食物的時候只吃到一半if (food.x % 2 == 0)break;}//將光標移到食物的坐標處打印食物gotoxy(food.x, food.y);printf("*");//初始化蛇的屬性snake.len = 3;snake.speed = 400;//在屏幕中間生成蛇頭snake.x[0] = MAPWIDTH / 2 + 1;//x坐標為偶數snake.y[0] = MAPHEIGHT / 2;//打印蛇頭gotoxy(snake.x[0], snake.y[0]);printf("■");//生成初試的蛇身for (i = 1; i < snake.len; i++){//蛇身的打印,縱坐標不變,橫坐標為上一節蛇身的坐標值+2snake.x[i] = snake.x[i - 1] + 2;snake.y[i] = snake.y[i - 1];gotoxy(snake.x[i], snake.y[i]);printf("■");}//打印完蛇身后將光標移到屏幕最上方,避免光標在蛇身處一直閃爍gotoxy(MAPWIDTH - 2, 0);return;
}void keyDown()
{int pre_key = key;//記錄前一個按鍵的方向if (_kbhit())//如果用戶按下了鍵盤中的某個鍵{fflush(stdin);//清空緩沖區的字符//getch()讀取方向鍵的時候,會返回兩次,第一次調用返回0或者224,第二次調用返回的才是實際值key = _getch();//第一次調用返回的不是實際值key = _getch();//第二次調用返回實際值}/**蛇移動時候先擦去蛇尾的一節*changeFlag為0表明此時沒有吃到食物,因此每走一步就要擦除掉蛇尾,以此營造一個移動的效果*為1表明吃到了食物,就不需要擦除蛇尾,以此營造一個蛇身增長的效果*/if (changeFlag == 0){gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);printf("  ");//在蛇尾處輸出空格即擦去蛇尾}//將蛇的每一節依次向前移動一節(蛇頭除外)for (i = snake.len - 1; i > 0; i--){snake.x[i] = snake.x[i - 1];snake.y[i] = snake.y[i - 1];}//蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走//如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向if (pre_key == 72 && key == 80)key = 72;if (pre_key == 80 && key == 72)key = 80;if (pre_key == 75 && key == 77)key = 75;if (pre_key == 77 && key == 75)key = 77;/***控制臺按鍵所代表的數字*“↑”:72*“↓”:80*“←”:75*“→”:77*///判斷蛇頭應該往哪個方向移動switch (key){case 75:snake.x[0] -= 2;//往左break;case 77:snake.x[0] += 2;//往右break;case 72:snake.y[0]--;//往上break;case 80:snake.y[0]++;//往下break;}//打印出蛇頭gotoxy(snake.x[0], snake.y[0]);printf("■");gotoxy(MAPWIDTH - 2, 0);//由于目前沒有吃到食物,changFlag值為0changeFlag = 0;return;
}void createFood()
{ if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇頭碰到食物{//蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物while (1){int flag = 1;srand((unsigned int)time(NULL));food.x = rand() % (MAPWIDTH - 4) + 2;food.y = rand() % (MAPHEIGHT - 2) + 1;//隨機生成的食物不能在蛇的身體上for (i = 0; i < snake.len; i++){if (snake.x[i] == food.x && snake.y[i] == food.y){flag = 0;break;}}//隨機生成的食物不能橫坐標為奇數,也不能在蛇身,否則重新生成if (flag && food.x % 2 == 0)break;}//繪制食物gotoxy(food.x, food.y);printf("*");snake.len++;//吃到食物,蛇身長度加1sorce += 10;//每個食物得10分snake.speed -= 5;//隨著吃的食物越來越多,速度會越來越快changeFlag = 1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果}return;
}bool snakeStatus()
{//蛇頭碰到上下邊界,游戲結束if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)return false;//蛇頭碰到左右邊界,游戲結束if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)return false;//蛇頭碰到蛇身,游戲結束for (i = 1; i < snake.len; i++){if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])return false;}return true;
}int main()
{drawMap();while (1){keyDown();if (!snakeStatus())break;createFood();Sleep(snake.speed);}gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);printf("Game Over!\n");gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);printf("本次游戲得分為:%d\n", sorce);Sleep(5000);return 0;
}

案例六

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<cstdlib>
#include<ctime>
#include<fstream>
#include<cstring> 
#define High 20
#define Width 50 
using namespace std; 
/* -2為食物 & ; -1為邊框 # ; 0為 空格 ; 1為蛇頭 @; >1為蛇身 * ; */ /*全局聲明變量*/ 
int Frames[High][Width]={0}; //界面大小
int MoveDirection;//移動方向 1,2,3,4  上下左右 
int Food_x,Food_y;//食物位置 
int MaxGrade;//最高分 
int Grade;//當前分數 /*改善畫面函數*/ 
void gotoxy(int x,int y);//光標移動到(x,y)位置 
void HideCursor();	//隱藏光標 /*功能函數*/ 
void Are_you_ready();//準備界面 
void Initialize();//數據初始化 
void Show(); //顯示畫面  
void Move();//移動方向 
void KeyPlay();//鍵盤操作
void SaveMaxGrade();//保存最高分 /*******主函數*******/
int main()
{HideCursor();//隱藏光標Initialize();//數據初始化 Are_you_ready();//準備界面 while(1){Show();KeyPlay();//鍵盤操作Move();//移動操作} SaveMaxGrade();//保存最高分return 0;
}
/*******************/ /*移動光標*///光標定位 
void gotoxy(int x,int y)//光標移動到(x,y)位置  取代清屏 
{HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;//該結構體用來記錄光標 SetConsoleCursorPosition(handle,pos);
}
/*隱藏光標*/
void HideCursor()	 
{CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
/*準備界面*/
void Are_you_ready()
{for(int i=4;i>=1;i--){system("cls"); cout<<"\n\n\n\t\t請使用方向鍵玩蛇!"; if(i==1){cout<<"\n\n\n\t\t\tGo!";Sleep(200);	return ;}cout<<"\n\n\n\t\t\t"<<i-1;Sleep(1000);}
} 
/*數據初始化*/
void Initialize()
{ //分數初始化ifstream fin("MaxGrade.txt");if(!fin){cout<<"MaxGrade.txt 文件打開失敗!\n";//exit(2);} fin>>MaxGrade;fin.close();Grade=0; //邊框初始化 # int i,j;for(i=0;i<High;i++){Frames[i][0]=-1;Frames[i][Width-1]=-1;}for(j=0;j<Width;j++){Frames[0][j]=-1;Frames[High-1][j]=-1;} //蛇初始化 for(i=1;i<=5;i++){Frames[High/2][Width/2-i]=i; } //移動方向初始化向右 MoveDirection = 4;//食物位置初始化 srand((int)time(NULL));do{Food_x=rand()%(High-5)+4;Food_y=rand()%(Width-5)+3;//判斷食物與蛇是否重合 if(Frames[Food_x][Food_y]==0){Frames[Food_x][Food_y]=-2;break;}}while(1);
}
/*顯示畫面*/
void Show() 
{ gotoxy(0,0);//移動光標至初始0,0位置 for(int i=0;i<High;i++){for(int j=0;j<Width;j++){if(Frames[i][j]==-1){cout<<"#";//-1為邊框 # //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);}else if(Frames[i][j]==0){cout<<" ";//0為 空格 }else if(Frames[i][j]==1){cout<<"@";//1為蛇頭 @ }else if(Frames[i][j]>1){cout<<"*";//大于1的正整數為蛇身 * // SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);//紅色 }else if(Frames[i][j]==-2){cout<<"&";//-2為食物 &  } }cout<<endl;}if(Grade>MaxGrade){cout<<"\n\n\n★當前得分: "<<Grade<<"\t★最高分:"<<Grade<<endl;}else{cout<<"\n\n\n★當前得分: "<<Grade<<"\t★最高分:"<<MaxGrade<<endl;}cout<<"\n\n\n★按空格暫停\t★按Esc鍵退出游戲\n";if(Grade >= 100&&Grade < 200){Sleep(90);} else if(Grade >=200 && Grade <300){Sleep(50);}else if(Grade >=300){Sleep(10);}else{Sleep(200);//刷新速度 }} 
/*移動*/
void Move() 
{int i,j,max=0;int OldTail_i,OldTail_j;//記錄舊蛇尾 int OldHead_i,OldHead_j;//記錄舊蛇頭 for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(Frames[i][j]>0){//對所有大于0的元素+1 Frames[i][j]++;//記錄舊蛇尾位置 if(Frames[i][j]>max){max=Frames[i][j];OldTail_i=i;OldTail_j=j;} //記錄舊蛇頭位置 if(Frames[i][j]==2){OldHead_i=i;OldHead_j=j;	} }}} int NewHead_i,NewHead_j; //新蛇頭 if(MoveDirection==1)//向上 {NewHead_i=OldHead_i-1;NewHead_j=OldHead_j; } if(MoveDirection==2)//向下 {NewHead_i=OldHead_i+1;NewHead_j=OldHead_j;} if(MoveDirection==3)//向左 {NewHead_i=OldHead_i;NewHead_j=OldHead_j-1; } if(MoveDirection==4)//向右 {NewHead_i=OldHead_i;NewHead_j=OldHead_j+1;} //判斷蛇頭是否吃到食物if(Frames[NewHead_i][NewHead_j]==-2){Frames[Food_x][Food_y]=0;//食物變為空格 Grade+=10; //分數加10 do{Food_x = rand()%(High-5)+4;Food_y = rand()%(Width-5)+3;//判斷食物與蛇是否重合 if(Frames[Food_x][Food_y]==0){Frames[Food_x][Food_y] = -2;//產生食物break;}}while(1); }else//未吃到長度不變 {Frames[OldTail_i][OldTail_j] = 0;//最大元素變為0==空格}//判斷蛇頭撞到自身或墻壁,游戲失敗if(Frames[NewHead_i][NewHead_j]>0||Frames[NewHead_i][NewHead_j]==-1){system("cls"); cout<<"\n\n\n\t\t\tGame Over!\n\n\n\n\n\n\n";Sleep(2000);system("cls");cout<<"\n\n\n\t\t\t您的分數:"<<Grade<<endl;if(Grade>MaxGrade) {cout<<"\t\t\t!新紀錄!\n";SaveMaxGrade();//保存最高分}Sleep(500);system("pause");exit(0);} else//正常操作 {Frames[NewHead_i][NewHead_j]=1;}} 
/*鍵盤操作*/
void KeyPlay()
{if(kbhit())//判斷是否有輸入{switch(getch()){case 224:switch(getch()){case 72:if(MoveDirection==1||MoveDirection==2)//下同,判斷方向,是否為正在行進方向 break;MoveDirection = 1;break;//上 case 80:if(MoveDirection==1||MoveDirection==2)break;MoveDirection = 2;break;//下 case 75:if(MoveDirection==3||MoveDirection==4)break;MoveDirection = 3;break;//左 case 77:if(MoveDirection==3||MoveDirection==4)break;MoveDirection = 4;break;//右 }break;case 27://退出(Esc) system("cls");//清屏cout<<"\n\n\n\n\t\t\t☆★退出游戲★☆\n\n\n\n";exit(0);case 32://空格(Space)system("cls");//清屏cout<<"\n\n\n\n\t\t\t☆★暫停★☆\n\n\n\n";cout<<"\n\n\t\t\t";system("pause"); system("cls");break; }	}  
}
/*保存最高分*/
void SaveMaxGrade()
{ofstream fout("MaxGrade.txt");if(!fout){cout<<"MaxGrade.txt 文件打開失敗\n";exit(2);}if(Grade>MaxGrade){MaxGrade=Grade;}fout<<MaxGrade;fout.close();
}

案例七

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <conio.h>//預處理命令
#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
#define stop 'p'typedef struct Snakes
{int x;int y;struct Snakes *next;
}snake;
snake *head,*tail;
struct Food
{int x;int y;
}food;void welcome();//主頁面 
void creatgraph();//創建圖表
void gotoxy(int x,int y);
void gotoprint(int x,int y);
void creatfood();
int ClickControl();
void Finish();
int Judge();
void MovingBody();
void Eating();
void ChangeBody(int a,int b);
char name[20];
int score=0;
char click=1;
int speed;
int main()
{system("color 0B");welcome();creatgraph();creatfood();if(ClickControl()==0)return 0;return 0;
}
void welcome()
{gotoxy(35,10);printf("/********************************************/");gotoxy(35,22);printf("/********************************************/");gotoxy(40,13);printf("\t歡迎來到貪吃蛇游戲");gotoxy(35,16);printf("\t請在英文輸入法中操作,w a s d控制,p暫停");gotoxy(40,19);printf("\t請輸入你的姓名:");scanf("%s",name);system("cls"); 
}
void creatgraph()//創建圖表 
{int i;for(i=0;i<58;i+=2){gotoprint(i,0);gotoprint(i,26);}for(i=1;i<26;i++){gotoprint(0,i);gotoprint(56,i);}gotoxy(75,10);printf("你好 %s,歡迎你來玩貪吃蛇!",name);gotoxy(75,15);printf("你的分數是:%d    = ̄ ω ̄= ",score);head = (snake*)malloc(sizeof(snake));head->x=16;head->y=15;//蛇頭坐標 tail=(snake*)malloc(sizeof(snake));snake *p=(snake*)malloc(sizeof(snake));snake *q=(snake*)malloc(sizeof(snake));p->x=16;p->y=16;//第二個節點 q->x=16;q->y=17;//第三個節點 head->next=p;p->next=q;q->next=tail;tail->next=NULL;//將節點連接起來組成蛇 
}
void gotoprint(int x,int y)//打印 
{gotoxy(x,y);printf("■");
}
void gotodelete(int x,int y)//刪除食物并輸入空格 
{gotoxy(x,y);printf("  ");
}
void gotoxy(int x,int y)//食物出現坐標函數,X表示橫坐標,Y表示縱坐標。
{COORD pos;//表示一個字符在控制臺屏幕上的坐標HANDLE hOutput;pos.X=x;pos.Y=y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//獲得標準輸出句柄SetConsoleCursorPosition(hOutput, pos);
}
void creatfood()
{srand((int)time(NULL));//表示設置一個隨機種子,每次運行都能保證隨機種子不同 lable:food.y=rand()%(25-1+1)+1;food.x=rand()%(54-2+1)+2;if(food.x%2!=0)//保證食物出現位置不出界 {food.x=food.x+1;}snake *judge=head;while(1){if(judge->next==NULL)break;if(food.x==judge->x&&food.y==judge->y){goto lable;//goto label的label(標簽)既可以定義在for循環前面,//也可以定義在for循環后面,當跳轉到標簽地方時,繼續執行標簽下面的代碼}judge=judge->next;}gotoxy(food.x,food.y);printf("⊙");
}
int ClickControl()
{char c;while(1){if(Judge()==0)return 0;if(_kbhit()){click=_getch();}MovingBody();Eating();} return 1;
}
void MovingBody()
{int count=0;int a=head->x,b=head->y;snake *p=head;while(1){if(p->next==NULL)break;gotodelete(p->x,p->y);count++;p=p->next;}switch(click){case up:head->y-=1;ChangeBody(a,b);break;case down:head->y+=1;ChangeBody(a,b);break;case left:head->x-=2;ChangeBody(a,b);break;case right:head->x+=2;ChangeBody(a,b);break;case stop:break;}p=head;while(1){if(p->next==NULL)break;gotoprint(p->x,p->y);p=p->next;}p=head;gotoxy(0,28);if(count<=10)speed=150;else if(count>10&&count<=20)speed=120;//速度調節 else if(count>20&&count<=40)speed=80;else speed =60;Sleep(speed);
}
void Eating()
{if(head->x==food.x&&head->y==food.y){creatfood();snake *_new=(snake*)malloc(sizeof(snake));snake *p;p=head;while(1){if(p->next->next==NULL)break;p=p->next;}p->next=_new;_new->next=tail;score+=10;gotoxy(77,15);printf("%d",score);}
}
void ChangeBody(int a,int b)
{snake *p=head->next;int mid1,mid2,_mid1,_mid2;mid1=p->x;mid2=p->y;while(1){if(p->next->next==NULL)break;_mid1=p->next->x;_mid2=p->next->y;p->next->x=mid1;p->next->y=mid2;mid1=_mid1;mid2=_mid2;p=p->next;}p=head->next;{p->x=a;p->y=b;} 
}
void Finish()
{system("cls");gotoxy(15,10);printf("/*******************************************/");gotoxy(15,20);printf("/*******************************************/");gotoxy(18,14);printf("\t\t游戲結束!");gotoxy(20,16);printf("\t你的分數是 %d     繼續努力吧!",score);gotoxy(0,27);system("pause");
}
int Judge()
{if(head->x==0||head->x==56||head->y==0||head->y==26){Finish();return 0;}snake *p=head->next;while(1){if(p->next==NULL)break;if(head->x==p->x&&head->y==p->y){Finish();return 0;}p=p->next;}return 1;
}

案例八

#include <stdio.h>
#include <Windows.h>//windows編程頭文件
#include <time.h>
#include <conio.h>#ifndef __cplusplus//一般用于將C++代碼以標準C形式輸出(即以C的形式被調用) typedef char bool;
#define false 0
#define true  1#endif//將光標移動到控制臺的(x,y)坐標點處
void gotoxy(int x, int y)
{COORD coord;//結構體變量 coord.X = x;coord.Y = y;HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //獲得輸出設備的句柄SetConsoleCursorPosition(hOut, coord);//這是使光標 到(x,y)這個位置的函數.
}#define ss 100//蛇的身體最大節數
#define mw 78//寬度
#define mh 24//高度//食物的坐標
struct food{int x;int y;
}food;//蛇的相關屬性
struct snake{int speed;//蛇移動的速度int len;//蛇的長度int x[ss];//組成蛇身的每一個小方塊中x的坐標int y[ss];//組成蛇身的每一個小方塊中y的坐標}snake;//繪制游戲邊框
void drawMap();
//隨機生成食物
void createFood();
//按鍵操作
void keyDown();
//蛇的狀態
bool snakeStatus();
//從控制臺移動光標
int bestsorce();
void gotoxy(int x, int y);int key = 72;//表示蛇移動的方向,72為按下“↑”所代表的數字//用來判斷蛇是否吃掉了食物,這一步很重要,涉及到是否會有蛇身移動的效果以及蛇身增長的效果
int changeFlag = 0;int sorce = 0;//記錄玩家的得分int i;void zhushi()//打印游戲說明{ gotoxy(mw + 8, mh / 2 - 4);printf("游戲說明\n");gotoxy(mw + 8, mh / 2 -3);printf("1.吃東西蛇速度在加快,\n"); gotoxy(mw + 8, mh / 2 - 2);printf("2.該游戲通過控制蛇頭方向吃東西\n"); gotoxy(mw + 8, mh / 2 -1);printf("從而使得蛇變得越來越長。\n");gotoxy(mw + 8, mh / 2);printf("歷史最高分%lld",bestsorce());} 
void drawMap()
{//打印上下邊框for (i = 0; i <= mw; i += 2)//i+=2是因為橫向占用的是兩個位置{//將光標移動依次到(i,0)處打印上邊框gotoxy(i, 0);printf("■");//將光標移動依次到(i,MAPHEIGHT)處打印下邊框gotoxy(i, mh);printf("■");}//打印左右邊框for (i = 1; i < mh; i++){//將光標移動依次到(0,i)處打印左邊框gotoxy(0, i);printf("■");//將光標移動依次到(MAPWIDTH, i)處打印左邊框gotoxy(mw, i);printf("■");}//隨機生成初試食物while (1){srand((unsigned int)time(NULL));//隨機一個數 food.x = rand() % (mw - 4) + 2;food.y = rand() % (mh - 2) + 1;if (food.x % 2 == 0)break;}//將光標移到食物的坐標處打印食物gotoxy(food.x, food.y);printf("*");//初始化蛇的屬性snake.len = 3;snake.speed = 300;//在屏幕中間生成蛇頭snake.x[0] = mw / 2 + 1;//x坐標為偶數snake.y[0] = mh / 2;//打印蛇頭gotoxy(snake.x[0], snake.y[0]);printf("■");//生成初試的蛇身for (i = 1; i < snake.len; i++){//蛇身的打印,縱坐標不變,橫坐標為上一節蛇身的坐標值+2snake.x[i] = snake.x[i - 1] + 2;snake.y[i] = snake.y[i - 1];gotoxy(snake.x[i], snake.y[i]);printf("■");}gotoxy(mw - 2, 0);	//打印完蛇身后將光標移到屏幕最上方,避免光標在蛇身處一直閃爍return;
}void keyDown()
{int w_key = key;//記錄前一個按鍵的方向if (kbhit())//如果用戶按下了鍵盤中的某個鍵,kbhit()只是檢測,返回0或1,也就是true或false。{fflush(stdin);//清空緩沖區的字符//getch()讀取方向鍵的時候,會返回兩次,第一次調用返回0或者224,第二次調用返回的才是實際值key = getch();//第一次調用返回的不是實際值key = getch();//第二次調用返回實際值}/**蛇移動時候先擦去蛇尾的一節*changeFlag為0表明此時沒有吃到食物,因此每走一步就要擦除掉蛇尾,以此營造一個移動的效果*為1表明吃到了食物,就不需要擦除蛇尾,以此營造一個蛇身增長的效果*/if (changeFlag == 0){gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);printf("  ");//在蛇尾處輸出空格即擦去蛇尾}//將蛇的每一節依次向前移動一節(蛇頭除外)for (i = snake.len - 1; i > 0; i--){snake.x[i] = snake.x[i - 1];snake.y[i] = snake.y[i - 1];}//蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走//如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向if (w_key == 72 && key == 80)key = 72;if (w_key == 80 && key == 72)key = 80;if (w_key == 75 && key == 77)key = 75;if (w_key == 77 && key == 75)key = 77;/***控制臺按鍵所代表的數字*“↑”:72*“↓”:80*“←”:75*“→”:77*///判斷蛇頭應該往哪個方向移動switch (key){case 75:snake.x[0] -= 2;//往左break;case 77:snake.x[0] += 2;//往右break;case 72:snake.y[0]--;//往上break;case 80:snake.y[0]++;//往下break;}//打印出蛇頭gotoxy(snake.x[0], snake.y[0]);printf("■");gotoxy(mw - 2, 0);//由于目前沒有吃到食物,changFlag值為0changeFlag = 0;return;
}void createFood()
{ if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇頭碰到食物{//蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物while (1){int flag = 1;srand((unsigned int)time(NULL));food.x = rand() % (mw - 4) + 2;food.y = rand() % (mh - 2) + 1;//隨機生成的食物不能在蛇的身體上for (i = 0; i < snake.len; i++){if (snake.x[i] == food.x && snake.y[i] == food.y){flag = 0;break;}}//隨機生成的食物不能橫坐標為奇數,否則重新生成if (flag && food.x % 2 == 0)break;}//繪制食物gotoxy(food.x, food.y);printf("*");snake.len++;//吃到食物,蛇身長度加1sorce += 10;//每個食物得10分snake.speed -= 5;//隨著吃的食物越來越多,速度會越來越快changeFlag = 1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果}return;
}
int bestsorce()
{static long long int w=0;long long int max = 0;if(sorce > w) max = sorce;else(max = w);w = max;sorce = 0;return max;
}bool snakeStatus()
{//蛇頭碰到上下邊界,游戲結束if (snake.y[0] == 0 || snake.y[0] == mh)return false;//蛇頭碰到左右邊界,游戲結束if (snake.x[0] == 0 || snake.x[0] == mw)return false;//蛇頭碰到蛇身,游戲結束for (i = 1; i < snake.len; i++){if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])return false;}return true;
}void youxi()
{system("cls");drawMap();zhushi();while (1){keyDown();if (!snakeStatus())break;createFood();Sleep(snake.speed);}gotoxy(mw / 2, mh / 2);printf("游戲結束!!!!\n");gotoxy(mw / 2, mh / 2 + 1);printf("本次游戲得分為:%d\n", sorce);Sleep(3000);//Sleep()沒有返回值,作用是暫停程序,單位是毫秒'}
int main()
{ youxi();do{char i;gotoxy(mw + 8, mh / 2 + 1);printf("1.按 1 鍵繼續 2.按 0 退出 ");gotoxy(mw + 8, mh / 2 + 2);printf("請輸入:"); scanf("%d",&i);if(i==0)exit(0);else(youxi());}while(1); return 0;  
}

案例九

#include<stdio.h>
#include<string.h>//√×
#include<stdlib.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
#include<conio.h> 
#define h 30
#define k 30
#include<pthread.h>
int num1=0,num2=0;
void gotoxy(int x,int y)
{HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);COORD coord;coord.X=x;coord.Y=y;SetConsoleCursorPosition(handle,coord);
}
void map()//圈上一片地 
{for(int i=1;i<h;i++){gotoxy(0,i);printf("■");gotoxy(60,i);printf("■");} for(int i=0;i<k+1;i++){gotoxy(i,0);puts("■");gotoxy(i,30);printf("■");}
}
struct snake{int sx[50];int sy[50];int speed;int length;
}snake1,snake2;
void firstonesnake()
{snake1.speed=1000;snake1.length=3;snake1.sx[0]=30;snake1.sy[0]=15;gotoxy(snake1.sx[0],snake1.sy[0]);printf("◆");for(int i=0;i<snake1.length-1;i++){snake1.sy[i+1]=snake1.sy[i]+1;snake1.sx[i+1]=snake1.sx[i];gotoxy(snake1.sx[i+1],snake1.sy[i+1]);printf("■");}
}
void firsttwosnake()
{snake1.speed=1000;snake2.speed=1000;snake1.length=3;snake2.length=3;snake1.sx[0]=14;snake1.sy[0]=15;snake2.sx[0]=46;snake2.sy[0]=15;gotoxy(snake1.sx[0],snake1.sy[0]);printf("◆");gotoxy(snake2.sx[0],snake2.sy[0]);printf("◆");for(int i=0;i<snake1.length-1;i++){snake1.sy[i+1]=snake1.sy[i]+1;snake1.sx[i+1]=snake1.sx[i];gotoxy(snake1.sx[i+1],snake1.sy[i+1]);printf("■");}for(int i=0;i<snake2.length-1;i++){snake2.sy[i+1]=snake2.sy[i]+1;snake2.sx[i+1]=snake2.sx[i];gotoxy(snake2.sx[i+1],snake2.sy[i+1]);printf("■");}
}
struct food{int x;int y;
}food1,food2;
void creat_foodup()//出食物.增加 
{srand(time(NULL));
loop:{int s1=0,s2=0;food1.x=rand()%(k-4)+2;food1.y=rand()%(h-2)+1;for(int i=0;i<snake1.length;i++){if(snake1.sx[i]==food1.x&&snake1.sy[i]==food1.y){s1=1;}}for(int i=0;i<snake2.length;i++){if(snake2.sx[i]==food1.x&&snake2.sy[i]==food1.y){s2=1;}}if(food1.x%2!=0){s1=1;}if(s1==1||s2==1)goto loop;gotoxy(food1.x,food1.y);printf("★");}
}
void creat_foodre()//出食物.減少 
{srand(time(NULL));
toop:{int s1=0,s2=0;food2.x=rand()%(k-4)+2;food2.y=rand()%(h-2)+1;for(int i=0;i<snake1.length;i++){if(snake1.sx[i]==food2.x&&snake1.sy[i]==food2.y){s1=1;}}for(int i=0;i<snake2.length;i++){if(snake2.sx[i]==food2.x&&snake2.sy[i]==food2.y){s2=1;}}if(food1.x==food2.x&&food1.y==food2.y)s1=1;if(food2.x%2!=0){s1=1;}if(s1==1||s2==1)goto toop;gotoxy(food2.x,food2.y);printf("☆");}
}
void eat_foodone()
{if(snake1.sx[0]==food1.x&&snake1.sy[0]==food1.y){snake1.length++;num1++;creat_foodup();}if(snake1.sx[0]==food2.x&&snake1.sy[0]==food2.y){gotoxy(snake1.sx[snake1.length-1],snake1.sy[snake1.length-1]);printf("  ");snake1.length--;num1--;creat_foodre();}
}
int onesnakedead()//蛇死的條件
{int jkl=0;for(int i=1;i<snake1.length;i++){if(snake1.sx[0]==snake1.sx[i]&&snake1.sy[0]==snake1.sy[i])jkl=1;}if(snake1.sx[0]==60||snake1.sx[0]==0||snake1.sy[0]==0||snake1.sy[0]==30||snake1.length==1||jkl==1){gotoxy(29,14);printf("你沒了");gotoxy(27,15);printf("再來一局");gotoxy(27,16);printf("回到菜單"); char aa,bb;int dx=36,dy=15;while(1){gotoxy(dx,dy);printf("←");bb=getch();if(bb!='\r'){aa=getch();gotoxy(dx,dy);printf("  ");if(aa==72||aa==80){switch(aa){case 72:dy--;break;case 80:dy++;break;}if(dy>16){dy--;}else if(dy<15){dy++;}}}elsereturn dy;}}elsereturn 1;
}
void eat_foodtwo()
{if(snake1.sx[0]==food1.x&&snake1.sy[0]==food1.y){snake1.length++;num1++;creat_foodup();}if(snake1.sx[0]==food2.x&&snake1.sy[0]==food2.y){gotoxy(snake1.sx[snake1.length-1],snake1.sy[snake1.length-1]);printf("  ");snake1.length--;num1--;creat_foodre();}if(snake2.sx[0]==food1.x&&snake2.sy[0]==food1.y){snake2.length++;num2++;creat_foodup();}if(snake2.sx[0]==food2.x&&snake2.sy[0]==food2.y){gotoxy(snake2.sx[snake2.length-1],snake2.sy[snake2.length-1]);printf("  ");snake2.length--;num2--;creat_foodre();}
}char key2='5';
void keydown2()//處理按鍵問題
{int check2;int i='5',j='1',o='2',l='3';if (kbhit()){check2 = getch();if(check2==i||check2==j||check2==o||check2==l){key2=(char)check2;}}gotoxy(snake2.sx[snake2.length-1],snake2.sy[snake2.length-1]);printf("  ");for(int i=snake2.length-1;i>0;i--){snake2.sx[i]=snake2.sx[i-1];snake2.sy[i]=snake2.sy[i-1];}switch(key2){case '5':snake2.sy[0]--;break;case '1':snake2.sx[0]--;snake2.sx[0]--;break;case '2':snake2.sy[0]++;break;case '3':snake2.sx[0]++;snake2.sx[0]++;break;default:break;}	
}
void gosnake2()//遍歷蛇
{gotoxy(snake2.sx[0],snake2.sy[0]);printf("◆");for(int i=1;i<snake2.length;i++){gotoxy(snake2.sx[i],snake2.sy[i]);printf("■");}
}
void *snake222(void *arg)
{keydown2();gosnake2();}//蛇2 
///
//蛇1 
char key1={'w'};
void keydown1()//處理按鍵問題
{int check1;int z='w',x='W',c='a',v='A',b='s',n='S',m='d',u='D';if (kbhit()){check1 = getch();if(check1==z||check1==x||check1==c||check1==v||check1==b||check1==n||check1==m||check1==u) {key1=(char)check1;}}gotoxy(snake1.sx[snake1.length-1],snake1.sy[snake1.length-1]);printf("  ");for(int i=snake1.length-1;i>0;i--){snake1.sx[i]=snake1.sx[i-1];snake1.sy[i]=snake1.sy[i-1];}switch(key1){case 'w':case 'W':snake1.sy[0]--;break;case 'a':case 'A':snake1.sx[0]--;snake1.sx[0]--;break;case 's':case 'S':snake1.sy[0]++;break;case 'd':case 'D':snake1.sx[0]++;snake1.sx[0]++;break;default:break;}
}
void gosnake1()//遍歷蛇
{gotoxy(snake1.sx[0],snake1.sy[0]);printf("◆");for(int i=1;i<snake1.length;i++){gotoxy(snake1.sx[i],snake1.sy[i]);printf("■");}
}
void snake1_speed()//速度變換 
{if(snake1.length>4&&snake1.length<8)snake1.speed=750;if(snake1.length>7&&snake1.length<10)snake1.speed=500;
}
void *snake111(void *arg)
{keydown1();onesnakedead();gosnake1();
}
int welcome()
{gotoxy(50,10);printf("貪吃蛇小游戲");gotoxy(52,11);printf("單人模式");gotoxy(52,12);printf("雙人模式");gotoxy(52,13);printf("退出游戲");int wx=60,wy=11;char aa,bb;while(1){gotoxy(wx,wy);printf("←");bb=getch();if(bb!='\r'){aa=getch();gotoxy(wx,wy);printf("  ");if(aa==72||aa==80){switch(aa){case 72:wy--;break;case 80:wy++;break;}if(wy>13){wy--;}else if(wy<11){wy++;}}}elsereturn wy;}
}
int main()
{system("color 0b");pthread_t th1,th2;
qqq:{int choose;system("cls");choose=welcome();if(choose==11){ttt:{num1=0;key1='w';system("cls");int zzz;map();firstonesnake();creat_foodup();creat_foodre();while(1){gotoxy(0,0);printf("■");gotoxy(32,0);printf("■");snake1_speed();Sleep(snake1.speed);keydown1();zzz=onesnakedead();gotoxy(70,14);printf("得分:%d",num1);if(zzz==15){goto ttt;}else if(zzz==16){goto qqq;}gosnake1();eat_foodone();}}}if(choose==12){www:{system("cls");map();firsttwosnake();creat_foodup();creat_foodre();while(1){Sleep(snake1.speed);pthread_create(&th1,NULL,snake111,NULL);Sleep(100);Sleep(snake2.speed);pthread_create(&th2,NULL,snake222,NULL);eat_foodtwo();}}}if(choose==13){system("cls");gotoxy(52,12);printf("bye");gotoxy(0,28); }
}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531012.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531012.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531012.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++課程設計 新生入學管理系統(二)

文章目錄 案例十六案例十七案例十八案例十九案例二十案例二十一案例二十二案例二十三案例二十四案例二十五案例二十六案例二十七案例二十八案例十六 #include<iostream> #include<cstring> //strcpy,strcmp #

Java類名.方法和變量

文章目錄(1) 類名.方法(2) 變量(1) 類名.方法 要是類名直接調用的方法&#xff0c;那這個方法就是靜態的(static)方法&#xff0c;是不用new出新對象實例就可以直接調用的方法。看下面例子&#xff1a; class A {public static void Method1(int a, int b) {//方法體}public …

Java小案例(二) 用數組實現增刪查改排序

文章目錄案例一案例二案例三案例四案例五案例一 Student.Java package curd;public class Student {private String stuid;private String name;private int chinese;private int math;private int english;private int avg;private int sum;public int getAvg() {return avg;…

有趣的一行代碼

文章目錄愛心曼德勃羅集合打印99乘法表實現快速排序禪語漫畫迷宮愛心 print(\n.join([.join([(????????????[(x-y)%12]if((x*0.05)**2(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<0 else )for x in range(-30,30)])for y in range(15,-15,-1)]))效果圖&#xff1…

Python練習之 對文件進行創建,然后重命名文件最近進行文件刪除

import os os.mkdir("D:\\1815925603") context ("序號&#xff1a;1815925603\n""姓名&#xff1a;阿信\n""班級&#xff1a;18云計算2班\n") with open (D:\\1815925603\\file1.txt,a) as fp:fp.write(context)fp.seek(0, 0) with …

Java接口中的成員變量為什么必須是static ?

接口的含義 接口就是提供一種統一的協議, 而接口中的屬性也屬于協議中的成員。它們是公共的,靜態的,最終的常量。相當于全局常量。 在interface里面的變量都是public static final 的。 public static final int i10;等價于int i10;(可以省略掉一部分) //注意在聲明的時候要…

Java函數式編程和面向對象編程

文章目錄什么是函數式編程&#xff1f;什么是面向對象編程&#xff1f;函數式編程和面向對象編程的優缺點什么是函數式編程&#xff1f; 函數式編程的核心&#xff1a;在思考問題時&#xff0c;使用不可變對象和函數&#xff0c;函數將一個值經過處理&#xff0c;映射成另一個…

JDBC實現圖書管理小案例

文章目錄項目文件結構項目運行效果項目詳細代碼項目文件下載相關案例案例一案例二案例三案例四案例五案例六案例七案例八項目文件結構 項目運行效果 項目詳細代碼 JDBCUtils.java package jdbc;import java.sql.*; import com.mysql.jdbc.Driver;public class JDBCUtils {pri…

Java實現多線程售票

文章目錄Synchronized和Lock的區別是什么&#xff1f;案例一方法一 繼承Thread類方法二 實現Runnable接口案例二方法一 繼承Thread類方法二 實現Runnable接口案例三方法一 繼承Thread類方法二 實現Runnable接口案例四方法一 繼承Thread類方法二 實現Runnable接口案例五方法一 繼…

基于TCP原理,采用Socket通信技術,實現聊天室

文章目錄案例一案例二案例三案例四案例五相關案例案例一 Client.java package SocketCode;import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import java.io.*; import …

HTML+CSS+JS 實現登錄注冊界面

文章目錄案例一 滑動樣式案例二 滑動樣式案例三 動態樣式案例四 普通樣式案例五 滑動樣式案例六 普通樣式具體怎么獲取呢&#xff1f;案例一 滑動樣式 login.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

數據結構課程設計 迷宮問題

文章目錄一、 目的與要求二、 問題描述和求解方法三、 解題過程四、 實現源碼五、 相關案例案例一案例二一、 目的與要求 1、目的&#xff1a; 通過布置具有一定難度的實際程序設計項目&#xff0c;使學生進一步理解和掌握課堂上所學各種基本抽象數據類型的邏輯結構、存儲結構和…

html+css 小案例(一)

文章目錄點擊下載index.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><title>Demo_Test</title><link rel"stylesheet" href"css/Dec.css"> </head> <body…

HTML+CSS+JS 表白代碼

文章目錄案例一 愛你到天昏地暗案例二 帶有音樂的表白代碼案例三 帶有圖片旋轉的表白案例源碼案例一 愛你到天昏地暗 <html> <style type"text/css"> <!-- .STYLE1 {font-size: medium} --> </style> <center><br><br>…

Linux常用命令與基本操作、填空題、簡答題

文章目錄基本知識點基本操作敘述什么是shell?重啟虛擬機網絡分區查看當前進程查看主機名重啟關機查看IP地址文件搜索掛載查看網絡配置linux系統中Vi的三種模式磁盤分區查看硬盤信息df&#xff0c;fdisk&#xff0c;lsblk區別進程用戶用戶信息查看用戶密碼信息修改密碼添加用戶…

Java中List、Map、Set三個接口,存取元素時,各有什么特點?

特點 List與Set都是單列元素的集合&#xff0c;它們有一個功共同的父接口Collection。 1.Set里面不允許有重復的元素&#xff0c; 存元素&#xff1a;add方法有一個boolean的返回值&#xff0c;當集合中沒有某個元素&#xff0c;此時add方法可成功加入該元素時&#xff0c;則…

客戶端與服務器(C/S架構與B/S架構)、AJax學習

文章目錄HTTP請求與服務器客戶端與服務器1.C/S架構與B/S架構2.web資源介紹3.資源訪問流程HTTP協議1.什么是協議&#xff1f;2.什么是HTTP協議3.HTTP組成部分4.請求的發送方式什么是Ajax技術Ajax可以做什么&#xff1f;偽造AjaxHTTP請求與服務器 客戶端與服務器 1.C/S架構與B/…

Mysql常用命令匯總

文章目錄基本命令連接數據庫查看數據庫使用數據庫查看表查看表結構顯示表的細節修改用戶密碼解決MySQL 5.5,出現亂碼問題聲明字符集DDL創建表查看表中的結構修改表添加表中的列刪除表中的列修改表中的列中屬性的數據類型修改表名修改表的字符集為gbk修改表中的列名刪除表&#…

SSH框架是什么?

文章目錄SSH框架StrutsSpringHibernateSSH框架 瀏覽器-Struts&#xff08;表示層&#xff09;-Spring&#xff08;業務層&#xff09;-Hibernate-數據庫 Struts Struts稱流行服務器&#xff0c;以前的流行服務器&#xff0c;通俗的來講就是完成mvc模型中“C”功能&#xff0c…

前端必會技巧

文章目錄點擊輸入框提示信息防止別人盜取視頻設置輸入邊框透明按鈕跳轉a標簽如何具有bootstra按鈕樣式formData的使用boostrap上傳樣式jq獲取input標簽的值jq獲取最近一個td標簽的值css設置幾個div中的圖片保持在一條水平線使div居中canvas 網頁背景 粒子鼠標跟隨磁力登錄界面添…