文章目录 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例八 案例九
案例一
#include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h> #define FrameX 4 #define FrameY 4 #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 ] ; struct Snake { int x[ 100 ] ; int y[ 100 ] ; 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) ; } void Set_TextColor_Green ( void ) { HANDLE Handle = GetStdHandle ( STD_OUTPUT_HANDLE) ; SetConsoleTextAttribute ( Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN) ; } 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 ; snake- > length= 3 ; snake- > count= 0 ; for ( 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 ) ) ; while ( 1 ) { food- > x = rand ( ) % ( Frame_width- 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++ ; if ( snake- > count% 5 == 0 ) { snake- > speed- = 50 ; } } } int if_die ( struct Snake * snake) { 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) ) ; } }
} int judge ( ) { if ( strcmp ( reg_name, "" ) == 0 && strcmp ( reg_pwd, "" ) == 0 ) { 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= getch ( ) ; if ( kbhit ( ) ) { Sleep ( 20 ) ; j= 1 ; } } switch ( ch) { case 72 : { move_snake ( hOut, snake) ; snake- > y[ snake- > length- 1 ] - = 1 ; break ; } case 80 : { move_snake ( hOut, snake) ; snake- > y[ snake- > length- 1 ] + = 1 ; break ; } case 75 : { move_snake ( hOut, snake) ; snake- > x[ snake- > length- 1 ] - = 2 ; break ; } case 77 : { move_snake ( hOut, snake) ; snake- > x[ snake- > length- 1 ] + = 2 ; break ; } } 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 ) { 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 ( ) ; void Finish ( ) ; void creatgraph ( ) ; void gotoxy ( int x, int y) ; void gotoprint ( int x, int y) ; void gotodelete ( int x, int y) ; void creatfood ( ) ; int ClickControl ( ) ; int Judge ( ) ; void MovingBody ( ) ; void Eating ( ) ; void ChangeBody ( int a, int b) ; 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)
{ 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) { 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 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 ; 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; HANDLE 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) ) ; tail- > x = 24 ; tail- > y = 5 ; tail- > next = NULL ; for ( i = 1 ; i <= 3 ; i++ ) { 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 ) ) ; food_1 = ( snake* ) malloc ( sizeof ( snake) ) ; 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 ( ) { 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) { 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> #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] ; int y[ SNAKESIZE] ; } snake; void drawMap ( ) ; void createFood ( ) ; void keyDown ( ) ; bool snakeStatus ( ) ; void gotoxy ( int x, int y) ; int key = 72 ; int changeFlag = 0 ; int sorce = 0 ; 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 ) { gotoxy ( i, 0 ) ; printf ( "■" ) ; gotoxy ( i, MAPHEIGHT) ; printf ( "■" ) ; } for ( int i = 1 ; i < MAPHEIGHT; i++ ) { gotoxy ( 0 , i) ; printf ( "■" ) ; 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 ; snake. y[ 0 ] = MAPHEIGHT / 2 ; gotoxy ( snake. x[ 0 ] , snake. y[ 0 ] ) ; printf ( "■" ) ; for ( int i = 1 ; i < snake. len; i++ ) { snake. 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 ) ; 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 ; 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 ) ; changeFlag = 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++ ; sorce + = 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>
#include <time.h>
#include <conio.h>
#ifndef __cplusplus typedef char bool ;
#define false 0
#define true 1 #endif
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] ; int y[ SNAKESIZE] ; } snake;
void drawMap ( ) ;
void createFood ( ) ;
void keyDown ( ) ;
bool snakeStatus ( ) ;
void gotoxy ( int x, int y) ; int key = 72 ;
int changeFlag = 0 ; int sorce = 0 ; int i;
void drawMap ( )
{ for ( i = 0 ; i <= MAPWIDTH; i + = 2 ) { gotoxy ( i, 0 ) ; printf ( "■" ) ; gotoxy ( i, MAPHEIGHT) ; printf ( "■" ) ; } for ( i = 1 ; i < MAPHEIGHT; i++ ) { gotoxy ( 0 , i) ; printf ( "■" ) ; 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 ; snake. y[ 0 ] = MAPHEIGHT / 2 ; gotoxy ( snake. x[ 0 ] , snake. y[ 0 ] ) ; printf ( "■" ) ; for ( i = 1 ; i < snake. len; i++ ) { snake. 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 ) ; key = _getch ( ) ; key = _getch ( ) ; } 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 ; 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 ) ; changeFlag = 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++ ; sorce + = 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;
int Frames[ High] [ Width] = { 0 } ;
int MoveDirection;
int Food_x, Food_y;
int MaxGrade;
int Grade;
void gotoxy ( int x, int 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)
{ 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" ; } 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 ) ; for ( int i= 0 ; i< High; i++ ) { for ( int j= 0 ; j< Width; j++ ) { if ( Frames[ i] [ j] == - 1 ) { cout<< "#" ; } else if ( Frames[ i] [ j] == 0 ) { cout<< " " ; } else if ( Frames[ i] [ j] == 1 ) { cout<< "@" ; } else if ( Frames[ i] [ j] > 1 ) { cout<< "*" ; } else if ( Frames[ i] [ j] == - 2 ) { cout<< "&" ; } } 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 ) { 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 ; 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 ; } 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)
{ 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; } 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>
#include <time.h>
#include <conio.h> #ifndef __cplusplus typedef char bool ;
#define false 0
#define true 1 #endif
void gotoxy ( int x, int y)
{ COORD coord; coord. X = x; coord. Y = y; HANDLE hOut = GetStdHandle ( STD_OUTPUT_HANDLE) ; SetConsoleCursorPosition ( hOut, coord) ;
} #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] ; int y[ ss] ; } snake;
void drawMap ( ) ;
void createFood ( ) ;
void keyDown ( ) ;
bool snakeStatus ( ) ;
int bestsorce ( ) ;
void gotoxy ( int x, int y) ; int key = 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 ) { gotoxy ( i, 0 ) ; printf ( "■" ) ; gotoxy ( i, mh) ; printf ( "■" ) ; } for ( i = 1 ; i < mh; i++ ) { gotoxy ( 0 , i) ; printf ( "■" ) ; 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 ; snake. y[ 0 ] = mh / 2 ; gotoxy ( snake. x[ 0 ] , snake. y[ 0 ] ) ; printf ( "■" ) ; for ( i = 1 ; i < snake. len; i++ ) { snake. 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 ( ) ) { fflush ( stdin ) ; key = getch ( ) ; key = getch ( ) ; } 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 ; 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 ) ; changeFlag = 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++ ; sorce + = 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 ) ; }
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++ ; } } } else return dy; } } else return 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 ( ) ; }
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++ ; } } } else return 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 ) ; }
}
}