297 lines
6.4 KiB
Markdown
297 lines
6.4 KiB
Markdown
### 贪吃蛇
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <conio.h>
|
||
#include <windows.h>
|
||
#include <time.h>
|
||
#include <process.h>
|
||
|
||
#define WIDTH 50 //宽度
|
||
#define HEIGHT 30 //高度
|
||
#define SNAKE_LENGHT 100 //蛇的最大长度
|
||
|
||
#define UP 1
|
||
#define DOWN 2
|
||
#define LEFT 3
|
||
#define RGIHT 4
|
||
|
||
char map[HEIGHT][WIDTH];//地图字符数组
|
||
int sankeX[SNAKE_LENGHT], sankeY[SNAKE_LENGHT];//蛇的坐标
|
||
int foodX, foodY;//食物的坐标
|
||
int size = 1;//当前蛇的长度
|
||
int gameStatus = 1;
|
||
int direction = RGIHT;
|
||
|
||
/*
|
||
_kbhit()用来判断输入的是否是空格
|
||
_getch()用来判断键盘输入的内容
|
||
*/
|
||
|
||
void draw(void* param){
|
||
int i, j;
|
||
char buffer[(HEIGHT+1)*(WIDTH+1)];
|
||
int k;
|
||
while(gameStatus){
|
||
system("cls");
|
||
k=0;
|
||
for(i=0;i<HEIGHT;i++){
|
||
for(j=0;j<WIDTH;j++){
|
||
buffer[k++] = map[i][j];
|
||
}
|
||
buffer[k++] = '\n';
|
||
}
|
||
buffer[k] = '\0';
|
||
printf("%s\n", buffer);
|
||
Sleep(200);
|
||
}
|
||
}
|
||
//打印地图
|
||
void changeMap(void* param){
|
||
int i, j, k;
|
||
int isFill;
|
||
while(gameStatus){
|
||
for(i=0;i<HEIGHT;i++){
|
||
for(j=0;j<WIDTH;j++){
|
||
if(i==0 || i == HEIGHT-1 || j==0 || j == WIDTH - 1){
|
||
map[i][j] = '#';
|
||
}else if(i == foodY && j == foodX){
|
||
map[i][j] = '$';
|
||
}else if(i == sankeY[0] && j == sankeX[0]){
|
||
map[i][j] = '0';
|
||
}else{
|
||
isFill = 0;
|
||
for(k=1;k<size;k++){
|
||
if(i == sankeY[k] && j == sankeX[k]){
|
||
map[i][j] = 'o';
|
||
isFill = 1;
|
||
}
|
||
}
|
||
if(!isFill){
|
||
map[i][j] = ' ';
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void changeSnake(void* param){
|
||
//蛇的移动
|
||
while(gameStatus){
|
||
int sankeXpre = sankeX[0], sankeYpre=sankeY[0];
|
||
int sankeXpre2, sankeYpre2;
|
||
int i;
|
||
Sleep(400-size*2);
|
||
sankeX[0] += (direction == RGIHT)?1:(direction == LEFT)?-1:0;
|
||
sankeY[0] += (direction == DOWN)?1:(direction == UP)?-1:0;
|
||
|
||
for(i=1;i<size;i++){
|
||
sankeXpre2 = sankeX[i];
|
||
sankeYpre2 = sankeY[i];
|
||
sankeX[i] = sankeXpre;
|
||
sankeY[i] = sankeYpre;
|
||
sankeXpre = sankeXpre2;
|
||
sankeYpre = sankeYpre2;
|
||
}
|
||
//判断蛇是否吃到食物
|
||
if(sankeX[0] == foodX && sankeY[0] == foodY){
|
||
size++;
|
||
foodX = rand()%(WIDTH-5)+3;
|
||
foodY = rand()%(HEIGHT-5)+3;
|
||
}
|
||
//边界检测、以及是否撞到自己
|
||
for(i=1;i<size;i++){
|
||
if(sankeX[0] == sankeX[i] && sankeY[0] == sankeY[i]){
|
||
gameStatus = 0;
|
||
}
|
||
}
|
||
|
||
if(sankeX[0] == 0 || sankeX[0] == WIDTH || sankeY[0]==0 || sankeY[0] == HEIGHT){
|
||
gameStatus = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void input(void* param){
|
||
char key;
|
||
while(gameStatus){
|
||
if(_kbhit()){
|
||
key = _getch();
|
||
switch(key){
|
||
case 'w':direction=UP;break;
|
||
case 's':direction=DOWN;break;
|
||
case 'a':direction=LEFT;break;
|
||
case 'd':direction=RGIHT;break;
|
||
case 'q':gameStatus=0;break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int main() {
|
||
system("color 02");
|
||
srand((unsigned)time(NULL));
|
||
sankeX[0] = WIDTH/2;
|
||
sankeY[0] = HEIGHT/2;
|
||
foodX = rand()%(WIDTH-5)+3;
|
||
foodY = rand()%(HEIGHT-5)+3;
|
||
|
||
_beginthread(changeMap, 0, NULL);
|
||
_beginthread(draw, 0, NULL);
|
||
_beginthread(input, 0, NULL);
|
||
_beginthread(changeSnake, 0, NULL);
|
||
|
||
while(gameStatus){
|
||
|
||
}
|
||
printf("游戏结束您的得分是%d\n", size-1);
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
<img src="https://yp.smallkun.cn/markdown/image-20250104225941821.png!compress" alt="image-20250104225941821" style="zoom:50%;" />
|
||
|
||
<img src="https://yp.smallkun.cn/markdown/image-20250104225957306.png!compress" alt="image-20250104225957306" style="zoom:50%;" />
|
||
|
||
### 飞机大战
|
||
|
||
```c
|
||
#include <stdio.h>
|
||
#include <math.h>
|
||
#include <stdlib.h>
|
||
#include <conio.h>
|
||
#include <time.h>
|
||
#include <process.h>
|
||
#include <Windows.h>
|
||
|
||
#define HEIGHT 40
|
||
#define WIDTH 30
|
||
|
||
char map[HEIGHT][WIDTH];
|
||
int score = 0;
|
||
int gameStatus = 1;
|
||
|
||
int planeX = 12;
|
||
int planeY = 36;
|
||
|
||
#define bulletNum 1000
|
||
|
||
int bulletX[bulletNum];
|
||
int bulletY[bulletNum];
|
||
int bulletRear = 0;//最后的子弹
|
||
int bulletFront = 0;//最前面的子弹
|
||
|
||
char* plane[6] = {" * ", "*****", " * * "};
|
||
|
||
void changeMap(void* param){
|
||
int i, j;
|
||
while(gameStatus){
|
||
for(i=0;i<HEIGHT;i++){
|
||
for(j=0;j<WIDTH;j++){
|
||
if(i == HEIGHT-1){
|
||
map[i][j] = '~';
|
||
}else if(j == 0 || j == WIDTH-1){
|
||
map[i][j] = '|';
|
||
}else{
|
||
map[i][j] = ' ';
|
||
}
|
||
}
|
||
}
|
||
|
||
for(i = 0;i<3;i++){
|
||
for(j = 0;j<5;j++){
|
||
map[planeY+i][planeX+j] = plane[i][j];
|
||
}
|
||
}
|
||
i=bulletFront;
|
||
while(i!=bulletRear){
|
||
map[bulletY[i]][bulletX[i]] = '*';
|
||
i=(i+1)%bulletNum;
|
||
}
|
||
Sleep(100);
|
||
}
|
||
}
|
||
|
||
void darwMap(void* param){
|
||
int i, j, k;
|
||
char buffer[100000];
|
||
while(gameStatus){
|
||
k=0;
|
||
for(i=0;i<HEIGHT;i++){
|
||
for(j=0;j<WIDTH;j++){
|
||
buffer[k++] = map[i][j];
|
||
}
|
||
buffer[k++] = '\n';
|
||
}
|
||
buffer[k] = '\0';
|
||
system("cls");
|
||
printf(buffer);
|
||
printf("您的得分:%d\n", score);
|
||
printf("操作说明:WSAD分别对印前后左右移动\n**空格是发出子弹**\n");
|
||
}
|
||
}
|
||
|
||
void changeBullets(void* param){
|
||
int i;
|
||
while(gameStatus){
|
||
Sleep(500);
|
||
i=bulletFront;
|
||
while(i!=bulletRear){
|
||
bulletY[i]--;
|
||
if(bulletY[i] < 0){
|
||
bulletFront=(bulletFront+1)%bulletNum;
|
||
}
|
||
i=(i+1)%bulletNum;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
void shootBullets(){
|
||
// planeY+1
|
||
bulletX[bulletRear] = planeX+2;
|
||
bulletY[bulletRear++] = planeY-1;
|
||
}
|
||
|
||
void input(void* param){
|
||
char key;
|
||
while(gameStatus){
|
||
if(_kbhit()){
|
||
key = _getch();
|
||
switch(key){
|
||
case 'q':gameStatus = 0;break;
|
||
case 'w':planeY--;break;
|
||
case 's':planeY++;break;
|
||
case 'a':planeX--;break;
|
||
case 'd':planeX++;break;
|
||
case 32:shootBullets();break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
int main(void){
|
||
system("color 02");
|
||
_beginthread(changeMap, 0, NULL);
|
||
_beginthread(darwMap, 0, NULL);
|
||
_beginthread(input, 0, NULL);
|
||
_beginthread(changeBullets, 0, NULL);
|
||
|
||
while(gameStatus){
|
||
|
||
}
|
||
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
<img src="https://yp.smallkun.cn/markdown/image-20250105004011680.png!compress" alt="image-20250105004011680" style="zoom:50%;" /> |