class-notes/2207/C语言/小游戏.md
2025-02-20 22:02:41 +08:00

297 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### 贪吃蛇
```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%;" />