C语言经典游戏代码大全(珍藏版)

admin 8781 2025-06-09 07:44:33

前言

发现很多朋友都想要一些小项目来练手,却找不到从哪里寻找,给大家整理了游戏项目开发源代码汇总。

一、最经典游戏之俄罗斯方块

#include

#include

#include

#include

#include

using namespace std;

enum DIR

{

UP,

RIGHT,

DOWN,

LEFT

};

time_t start = 0, finish = 0;

int _x = 6, _y = 1;//图形生成位置

int map[30][16] = { 0 };

int sharp[20][8] = {

{0,0,0,0,0,0,0,0},

//I形

{0,0,0,1,0,2,0,3},

{0,0,1,0,2,0,3,0},

//■形

{0,0,1,0,0,1,1,1},

//L形

{0,0,0,1,0,2,1,2},

{0,0,0,1,1,0,2,0},

{0,0,1,0,1,1,1,2},

{0,1,1,1,2,0,2,1},

//J形

{0,2,1,0,1,1,1,2},

{0,0,0,1,1,1,2,1},

{0,0,0,1,0,2,1,0},

{0,0,1,0,2,0,2,1},

//Z形

{0,0,1,0,1,1,2,1},

{0,1,0,2,1,0,1,1},

//S形

{0,1,1,0,1,1,2,0},

{0,0,0,1,1,1,1,2},

//T形

{0,1,1,0,1,1,2,1},

{0,0,0,1,0,2,1,1},

{0,0,1,0,1,1,2,0},

{0,1,1,0,1,1,1,2}

};

class Game

{

public:

int score;//游戏分数

int _id;//图形编号

int top;//最高点高度

int speed;//下落速度

Game();

void showMenu();//显示菜单

void showGround();//显示游戏界面

void gameOver();//游戏结束界面

void Run();//运行游戏

void sharpDraw(int id, bool show = false);//绘制图形

void keyControl();//键盘控制

bool move(int dir, int id);//移动判断

bool downSet(int id);//下落

void Turn(int id);//旋转

void clean();//消行

};

void SetPos(int i, int j)//控制光标位置, 列, 行

{

COORD pos = { i,j };

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}

int main()

{

CONSOLE_CURSOR_INFO cursor;

GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);

cursor.bVisible = 0; //这四行用来设置光标不显示

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);

srand((unsigned)time(NULL));

Game game;

game.showMenu();

return 0;

}

Game::Game()

{

score = 0;

_id = 0;

top = 58;

speed = 1000;

}

void Game::showMenu()

{

for (int i = 0; i < 30; i++)

{

for (int j = 0; j < 26; j++)

{

if ((i == 0 || i == 29) || (j == 0 || j == 25))

{

cout << "■";

}

else

{

cout << " ";

}

}

cout << endl;

}

SetPos(17, 8);

cout << "俄 罗 斯 方 块" << endl;

SetPos(13, 12);

cout << "↑旋转方块 ↓加速下滑" << endl;

SetPos(12, 14);

cout << "← →左右移动 空格 暂停" << endl;

SetPos(15, 20);

cout << "0 退出 Enter 开始" << endl;

while (1)

{

int select = _getch();

if (select == 13)

{

system("cls");

this->Run();

}

else if (select = 48)

{

system("cls");

exit(0);

}

}

}

void Game::showGround()

{

for (int i = 0; i < 30; i++)

{

for (int j = 0; j < 26; j++)

{

if ((i == 0 || i == 29) || (j == 0 || j == 25 || j == 15))

{

cout << "■";

}

else if (i == 15 && j > 15)

{

cout << "■";

}

else

{

cout << " ";

}

}

cout << endl;

}

SetPos(31, 2);

cout << "下 个图形" << endl;

SetPos(31, 17);

cout << "当 前得分" << endl;

for (int i = 0; i < 30; i++)

{

for (int j = 0; j < 16; j++)

{

if ((i == 0 || i == 29) || (j == 0 || j == 15))

{

map[i][j] = 1;

}

else

{

map[i][j] = 0;

}

}

}

}

void Game::gameOver()

{

for (int i = 5; i < 15; i++)

{

SetPos(1, i);

cout << " " << endl;

}

SetPos(8, 7);

cout << "G a m e O v e r" << endl;

SetPos(3, 10);

cout << "0 退出 Enter 重新开始" << endl;

while (1)

{

int select = _getch();

if (select == 13)

{

system("cls");

this->Run();

}

else if (select == 48)

{

system("cls");

exit(0);

}

}

}

void Game::Run()

{

score = 0;

_id = 0;

top = 58;

_x = 6;

_y = 1;

showGround();

start = clock();

int new_id = rand() % 19 + 1;

while (1)

{

sharpDraw(_id);

keyControl();

if (downSet(_id))

{

sharpDraw(-new_id, 1);

_id = new_id;

new_id = rand() % 19 + 1;

sharpDraw(new_id, 1);

clean();

}

SetPos(34, 20);

cout << score << endl;

}

}

void Game::sharpDraw(int id, bool show)

{

int x, y;

if (show == true)

{

if (id > 0)

{

for (int i = 0; i < 4; i++)

{

x = 19 + sharp[id][2 * i];

y = 6 + sharp[id][2 * i + 1];

SetPos(2 * x, y);

cout << "■";

}

}

else

{

for (int i = 0; i < 4; i++)

{

x = 19 + sharp[-id][2 * i];

y = 6 + sharp[-id][2 * i + 1];

SetPos(2 * x, y);

cout << " ";

}

}

return;

}

if (id > 0)

{

for (int i = 0; i < 4; i++)

{

x = _x + sharp[id][2 * i];

y = _y + sharp[id][2 * i + 1];

SetPos(2 * x, y);

cout << "■";

}

}

else

{

for (int i = 0; i < 4; i++)

{

x = _x + sharp[-id][2 * i];

y = _y + sharp[-id][2 * i + 1];

SetPos(2 * x, y);

cout << " ";

}

}

return;

}

bool Game::downSet(int id)

{

if (id == 0)

return true;

finish = clock();

if (finish - start < speed)

{

return false;

}

start = clock();

if (!move(DOWN, _id))

{

int x, y;

for (int i = 0; i < 4; i++)

{

x = _x + sharp[id][2 * i];

y = _y + sharp[id][2 * i + 1];

map[y][x] = 1;

if (y < top)

{

top = y;

}

if (top <= 1)

{

gameOver();

}

}

_x = 6;

_y = 1;

return true;

}

sharpDraw(-id);

_y++;

sharpDraw(id);

return false;

}

bool Game::move(int dir, int id)

{

int x, y;

switch (dir)

{

case UP:

for (int i = 0; i < 4; i++)

{

x = _x + sharp[id][2 * i];

y = _y + sharp[id][2 * i + 1];

if (map[y][x] == 1)

{

return false;

}

}

break;

case DOWN:

{

for (int i = 0; i < 4; i++)

{

x = _x + sharp[id][2 * i];

y = _y + sharp[id][2 * i + 1];

if (map[y + 1][x] == 1)

{

return false;

}

}

}

break;

case RIGHT:

{

for (int i = 0; i < 4; i++)

{

x = _x + sharp[id][2 * i];

y = _y + sharp[id][2 * i + 1];

if (map[y][x + 1] == 1)

{

return false;

}

}

}

break;

case LEFT:

{

for (int i = 0; i < 4; i++)

{

x = _x + sharp[id][2 * i];

y = _y + sharp[id][2 * i + 1];

if (map[y][x - 1] == 1)

{

return false;

}

}

}

break;

default:

break;

}

return true;

}

void Game::Turn(int id)

{

switch (id)

{

case 1:id++; break;

case 2:id--; break;

case 3: break;

case 4:id++; break;

case 5:id++; break;

case 6:id++; break;

case 7:id -= 3; break;

case 8:id++; break;

case 9:id++; break;

case 10:id++; break;

case 11:id -= 3; break;

case 12:id++; break;

case 13:id--; break;

case 14:id++; break;

case 15:id--; break;

case 16:id++; break;

case 17:id++; break;

case 18:id++; break;

case 19:id -= 3; break;

default:

break;

}

if (!move(UP, id))

{

return;

}

sharpDraw(-_id);

_id = id;

}

void Game::keyControl()

{

if (!_kbhit())

return;

int key = _getch();

switch (key)

{

case 72:

Turn(_id);

break;

case 80:

if (move(DOWN, _id))

{

sharpDraw(-_id);

_y++;

}

break;

case 75:

if (move(LEFT, _id))

{

sharpDraw(-_id);

_x--;

}

break;

case 77:

if (move(RIGHT, _id))

{

sharpDraw(-_id);

_x++;

}

break;

case 32:

{

for (int i = 5; i < 15; i++)

{

SetPos(1, i);

cout << " " << endl;

}

SetPos(10, 7);

cout << "游 戏 暂 停" << endl;

SetPos(3, 10);

cout << "0 返回菜单 回车 继续游戏" << endl;

while (1)

{

int select = _getch();

if (select == 13)

{

for (int i = 5; i < 15; i++)

{

SetPos(1, i);

cout << " " << endl;

}

break;

}

else if (select == 48)

{

system("cls");

showMenu();

}

}

}

default:

break;

}

}

void Game::clean()

{

int n = -1;

int line = -1;

while (1)

{

for (int i = 28; i > 0; i--)

{

for (int j = 1; j < 15; j++)

{

line = i;

if (map[i][j] == 0)

{

line = -1;

break;

}

}

if (line != -1)

break;

}

if (line == -1)

break;

for (int i = line; i > 0; i--)

{

for (int j = 1; j < 15; j++)

{

if (i == 1)

map[i][j] = 0;

else

{

map[i][j] = map[i - 1][j];

SetPos(2 * j, i);

if (map[i][j] == 1)

cout << "■";

else

cout << " ";

}

}

}

top++;

n++;

}

if (n >= 0)

{

score += n * n * 100 + 100;

if (speed > 100)

speed = 1000 - score / 10;

}

}

二、雷霆战机游戏源代码

#include

#include

#include

#include

#include

#include

#include

#pragma comment(lib,"winmm.lib")

typedef struct Node

{

int x;

int y;

struct Node *pnext;

}NODE;

#define WINDOW_WIDTH 1024

#define WINDOW_HEIGHT 680

#define WIDTH 480

//我机图片尺寸

#define pw 86

#define ph 82

//敌机图片尺寸

#define aw 70

#define ah 70

#define boss1w 192

#define boss1h 290

//敌机重出现的y坐标

#define APStart -ah-20

NODE *p_bullet = NULL;

//MyPlane

NODE *p_MP = NULL;

//AttackPlane

NODE* p_AP = NULL;

//子弹时间差

NODE* p_AP2 = NULL;

DWORD b1, b2, b3, b4, b5, b6;

IMAGE i_MP,i_MPS,i_AP,i_APS;

IMAGE i_backeve, i_backxing, i_backduicheng, i_backguan,i_backcontrol,i_backgo;

IMAGE i_boss1_1, i_boss1_1S, i_boss1_2, i_boss1_2S;

//backxing的左右移动

int left = (WINDOW_WIDTH / 2 - WIDTH / 2);

//分数

int score = 0;

//击毁敌机的数量

int kill = 0;

//boss是否出现

int boss1show = 0;

//boss1贴图开关

int boss1image = 0;

int boss1hp = 20;

int line1_x = WINDOW_WIDTH / 2 - 20;

int line1_y = boss1h;

int line2_x = WINDOW_WIDTH / 2 + 20;

int line2_y = boss1h;

//Beam只播放一次

int test = 1;

int MP_HP = 1;

void CreateList()

{

p_MP = (NODE*)malloc(sizeof(NODE));

p_MP->x = WINDOW_WIDTH / 2 - pw / 2;

p_MP->y = WINDOW_HEIGHT-100;

p_MP->pnext = NULL;

p_bullet = (NODE*)malloc(sizeof(NODE));

p_bullet->pnext = NULL;

b1 = GetTickCount();

p_AP = (NODE*)malloc(sizeof(NODE));

srand((unsigned)time(NULL));

p_AP->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);

p_AP->y = APStart;

p_AP->pnext = NULL;

b3 = GetTickCount();

p_AP2 = (NODE*)malloc(sizeof(NODE));

p_AP2->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);

p_AP2->y = -350;

p_AP2->pnext = NULL;

b5 = GetTickCount();

}

void GameBackInit()

{

loadimage(&i_MP, L"mp.jpg");

loadimage(&i_MPS, L"mpbit.jpg");

loadimage(&i_backeve, L"backeve.jpg");

loadimage(&i_backxing, L"backtaikong.jpg");

loadimage(&i_AP, L"AP.jpg", aw, ah);

loadimage(&i_APS, L"APS.jpg", aw, ah);

loadimage(&i_backduicheng, L"backduicheng.jpg");

loadimage(&i_backguan, L"backguan.jpg", WIDTH, WINDOW_HEIGHT);

loadimage(&i_backcontrol, L"backcontrol.jpg",WINDOW_WIDTH,WINDOW_HEIGHT);

loadimage(&i_boss1_1, L"boss1_1.jpg");

loadimage(&i_boss1_1S, L"boss1_1S.jpg");

loadimage(&i_boss1_2, L"boss1_2.jpg");

loadimage(&i_boss1_2S, L"boss1_1S.jpg");

loadimage(&i_backgo, L"Gameover.jpg", WINDOW_WIDTH, WINDOW_HEIGHT);

putimage(0, 30, &i_backeve);

Sleep(1000);

PlaySound(L"baozou.wav", NULL, SND_FILENAME | SND_ASYNC);

putimage(0, 0, &i_backcontrol);

outtextxy(600, 540, L"【PRESS】 按任意键进入游戏");

system("pause");

mciSendString(L"open bgmusic.mp3 alias bg", NULL, 0, NULL);

mciSendString(L"play bg repeat", NULL, 0, NULL);

putimage((WINDOW_WIDTH / 2 - WIDTH / 2), 0, WIDTH, WINDOW_HEIGHT, &i_backguan, 0, 0, SRCCOPY);

putimage(0, 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 0, 100, SRCCOPY);

putimage((WINDOW_WIDTH / 2 + WIDTH / 2), 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 1200 - (WINDOW_WIDTH / 2 - WIDTH / 2), 100, SRCCOPY);

//字体出现的高度

int text_h = WINDOW_HEIGHT/2;

Sleep(300);

BeginBatchDraw();

for (int i = 0; i < text_h; i++)

{

clearrectangle((WINDOW_WIDTH / 2 - WIDTH / 2), 0, (WINDOW_WIDTH / 2 + WIDTH / 2), WINDOW_HEIGHT);

putimage((WINDOW_WIDTH / 2 - WIDTH / 2), 0-i, WIDTH, text_h , &i_backguan, 0, 0, SRCCOPY);

putimage((WINDOW_WIDTH / 2 - WIDTH / 2), text_h + i, WIDTH, WINDOW_HEIGHT - (text_h + i), &i_backguan, 0, text_h, SRCCOPY);

putimage((WINDOW_WIDTH / 2 - WIDTH / 2), text_h - i, WIDTH, 2*i, &i_backxing, left, text_h-i, SRCCOPY);

FlushBatchDraw();

Sleep(5);

}

EndBatchDraw();

Sleep(100);

}

void Boss1show()

{

p_AP->y = WINDOW_HEIGHT + 100;

p_AP2->y = WINDOW_HEIGHT + 100;

if (boss1hp >14)

{

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1S, NOTSRCERASE);

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1, SRCINVERT);

}

else if(boss1hp >= 9 && boss1hp <=14)

{

if (boss1hp % 2 == 0)

{

setlinecolor(0x996666);

setlinestyle(PS_DOT, 3);

line(line1_x, line1_y, line1_x, WINDOW_HEIGHT);

line(line2_x, line2_y, line2_x, WINDOW_HEIGHT);

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2S, NOTSRCERASE);

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2, SRCINVERT);

}

else

{

setlinecolor(0xCC6666);

setlinestyle(PS_DOT, 3);

line(line1_x, line1_y, line1_x, WINDOW_HEIGHT);

line(line2_x, line2_y, line2_x, WINDOW_HEIGHT);

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1S, NOTSRCERASE);

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1, SRCINVERT);

}

}

else

{

if (test == 1)

{

PlaySound(L"Beam.wav", NULL, SND_FILENAME | SND_ASYNC);

test++;

}

setlinecolor(0xFF6666);

setlinestyle(PS_DASH, 5);

line(line1_x, line1_y, line1_x, WINDOW_HEIGHT);

line(line2_x, line2_y, line2_x, WINDOW_HEIGHT);

line(WINDOW_WIDTH / 2 - boss1w / 2, boss1h -90, 482, boss1h + 50);

line(WINDOW_WIDTH / 2 + boss1w / 2, boss1h - 90, 542, boss1h + 50);

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2S, NOTSRCERASE);

putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2, SRCINVERT);

if ((boss1hp!=8)&&(p_MP->x - line1_x) > -pw && (p_MP->x - line2_x)<0&& (p_MP->y - line1_y)>-ph) MP_HP = 0;

}

if(boss1image<=boss1h ) boss1image+=2;

}

void AddNode(int flag)

{

//后插法,更新第二个位置

if (flag == 0)

{

NODE* p_new = (NODE*)malloc(sizeof(NODE));

p_new->x = p_MP->x + 35;

p_new->y = p_MP->y - 45;

p_new->pnext = p_bullet->pnext;

p_bullet->pnext = p_new;

}

}

int main()

{

//create a window

initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);

setfillcolor(0xFF9999);

GameBackInit();

char key;

CreateList();

//批量绘图

BeginBatchDraw();

while (1)

{

//清画板,要不然就成重叠的残影了

cleardevice();

putimage((WINDOW_WIDTH / 2 - WIDTH / 2), 0, WIDTH, WINDOW_HEIGHT, &i_backxing, left, 0, SRCCOPY);

putimage(0, 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 0, 100, SRCCOPY);

putimage((WINDOW_WIDTH / 2 + WIDTH / 2), 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 1200 - (WINDOW_WIDTH / 2 - WIDTH / 2), 100, SRCCOPY);

putimage(p_MP->x, p_MP->y, &i_MPS, NOTSRCERASE);

putimage(p_MP->x, p_MP->y, &i_MP, SRCINVERT);

putimage(p_AP->x, p_AP->y, &i_APS, NOTSRCERASE);

putimage(p_AP->x, p_AP->y, &i_AP, SRCINVERT);

putimage(p_AP2->x, p_AP2->y, &i_APS, NOTSRCERASE);

putimage(p_AP2->x, p_AP2->y, &i_AP, SRCINVERT);

//MP单位时间发射子弹的数量

b2 = GetTickCount();

//不能等于,有偏差

if (b2 - b1 >= 600)

{

AddNode(0);

b1 = b2;

}

//我方战机子弹递增

NODE* P = p_bullet->pnext;

while (P != NULL)

{

if (boss1show == 0)

{

//确定敌机重生位置不是在原位置

int mid;

//10是子弹宽度,但半个子弹打中也算,要不然太难了,就右边是-3,左边是-7

if ((P->y - p_AP->y) < ah && (P->y - p_AP->y) >= 0 && (P->x - p_AP->x) < aw -3 && (P->x - p_AP->x) >= -7)

{

P->y = APStart -100;

P = P->pnext;

p_AP->y = APStart;

kill++;

PlaySound(L"Bomb.wav", NULL, SND_FILENAME | SND_ASYNC);

while (1)

{

mid = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);

if (abs(mid - p_AP->x) > aw)

{

p_AP->x = mid;

break;

}

}

}

else if((P->y - p_AP2->y) < ah && (P->y - p_AP2->y) >= 0 && (P->x - p_AP2->x) < aw - 3 && (P->x - p_AP2->x) >= -7)

{

P->y = APStart -100;

P = P->pnext;

p_AP2->y = APStart;

kill++;

while (1)

{

mid = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);

if (abs(mid - p_AP2->x) > aw)

{

p_AP2->x = mid;

break;

}

}

PlaySound(L"Bomb.wav", NULL, SND_FILENAME | SND_ASYNC);

}

else

{

fillroundrect(P->x, P->y, P->x + 10, P->y + 35, 10, 30);

P->y -= 5;

P = P->pnext;

}

}

else if (boss1show == 1)

{

if (boss1image > boss1h)

{

if ((P->y) < boss1h && (P->y) >= 0 && (P->x - (WINDOW_WIDTH / 2 - boss1w / 2)) < boss1w - 3 && (P->x - (WINDOW_WIDTH / 2 - boss1w / 2)) >= -7)

{

P->y = APStart -100;

P = P->pnext;

boss1hp--;

if (boss1hp>9||boss1hp<7) PlaySound(L"Bomb.wav", NULL, SND_FILENAME | SND_ASYNC);

}

else

{

fillroundrect(P->x, P->y, P->x + 10, P->y - 35, 10, 30);

P->y -= 10;

P = P->pnext;

}

TCHAR s_boss1hp[100];

_stprintf(s_boss1hp, _T("【Boss】HP:%d"), boss1hp);

outtextxy((WINDOW_WIDTH / 2 + WIDTH / 2) + 45, 200, s_boss1hp);

if (boss1hp <= 0)

{

boss1show = 0;

kill += 50;

}

}

else

{

fillroundrect(P->x, P->y, P->x + 10, P->y + 35, 10, 30);

P->y -= 5;

P = P->pnext;

}

}

}

//AP飞行的速度

b4 = GetTickCount();

//不能等于,有偏差

if (b4- b3 >= 50)

{

if (p_AP->y < WINDOW_HEIGHT)

{

p_AP->y += 3;

}

else

{

p_AP->y = 0;

p_AP->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);

}

b3 = b4;

}

//AP2飞行的速度

b6 = GetTickCount();

//不能等于,有偏差

if (b6 - b5 >= 50)

{

if (p_AP2->y < WINDOW_HEIGHT)

{

p_AP2->y += 3;

}

else

{

p_AP2->y = 0;

p_AP2->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);

}

b5 = b6;

}

if (kill==10&& boss1hp > 0) boss1show = 1;

if (boss1show==1)

{

Boss1show();

}

if ((p_MP->x - p_AP->x) > -pw && (p_MP->x - p_AP->x)y - p_AP->y)>-ph && (p_MP->y - p_AP->y)

else if ((p_MP->x - p_AP2->x) > -pw && (p_MP->x - p_AP2->x)y - p_AP2->y)>-ph && (p_MP->y - p_AP2->y)

else if (boss1show==1&&boss1image>boss1h&&(p_MP->x-(WINDOW_WIDTH / 2 - boss1w / 2)) >-pw && (p_MP->x-(WINDOW_WIDTH / 2 + boss1w / 2))y

if (MP_HP == 0)

{

mciSendString(L"close bg", NULL, 0, NULL);

mciSendString(L"open bggo.mp3 alias bg", NULL, 0, NULL);

mciSendString(L"play bg repeat", NULL, 0, NULL);

putimage(0, 0, &i_backgo, SRCCOPY);

outtextxy(430, 540, L"3秒后自动退出");

EndBatchDraw();

Sleep(3000);

closegraph();

return 0;

}

TCHAR s_score[100];

_stprintf(s_score, _T("你的分数:%d"), kill);

outtextxy((WINDOW_WIDTH / 2 + WIDTH / 2) + 50, WINDOW_HEIGHT/2, s_score);

FlushBatchDraw();

//子弹飞行速度以及按键延迟等

Sleep(15);

if (kbhit())

{

key = getch();

switch (key)

{

case 72://上

p_MP->y -= 5;

break;

case 80://下

p_MP->y += 5;

break;

case 75://左

p_MP->x -= 5;

left -= 5;

break;

case 77://右

p_MP->x += 5;

left += 5;

break;

}

}

if (p_MP->x<(WINDOW_WIDTH / 2 - WIDTH / 2))

p_MP->x = (WINDOW_WIDTH / 2 - WIDTH / 2);

if (p_MP->x>(WINDOW_WIDTH / 2 + WIDTH / 2 - pw))

p_MP->x = (WINDOW_WIDTH / 2 + WIDTH / 2 - pw);

if (p_MP->y<0 )

p_MP->y = 0;

if (p_MP->y>WINDOW_HEIGHT - ph)

p_MP->y = WINDOW_HEIGHT - ph;

if (left < 0)

left = 0;

if (left>1280 - WIDTH)

left = 1280 - WIDTH;

}

EndBatchDraw();

closegraph();

return 0;

}

三、五子棋经典游戏源代码

#define _CRT_SECURE_NO_WARNINGS

#define MAX_ROW 3

#define MAX_COL 3

#include

#include

#include

void init(char chessBoard[MAX_ROW][MAX_COL]) {

for (int row = 0; row < MAX_ROW; row++) {

for (int col = 0; col < MAX_COL; col++) {

chessBoard[row][col] = ' ';

}

}

}

void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL]) {

printf("+---+---+---+\n");

for (int row = 0; row < MAX_ROW; row++) {

printf("| %c | %c | %c |\n", chessBoard[row][0],

chessBoard[row][1], chessBoard[row][2]);

printf("+---+---+---+\n");

}

}

void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {

while (1) {

int row = 0;

int col = 0;

printf("请输入坐标(row col):");

scanf("%d %d", &row, &col);

if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {

printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");

continue;

}

if (chessBoard[row][col] != ' ') {

printf("您的坐标位置已经有子了!\n");

continue;

}

chessBoard[row][col] = 'x';

break;

}

}

void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {

while (1) {

int row = rand() % MAX_ROW;

int col = rand() % MAX_COL;

if (chessBoard[row][col] != ' ') {

continue;

}

chessBoard[row][col] = 'o';

break;

}

}

int isFull(char chessBoard[MAX_ROW][MAX_COL]) {

for (int row = 0; row < MAX_ROW; row++) {

for (int col = 0; col < MAX_COL; col++) {

if (chessBoard[row][col] == ' ') {

return 0;

}

}

}

return 1;

}

char isWin(char chessBoard[MAX_ROW][MAX_COL]) {

for (int row = 0; row < MAX_ROW; row++) {

if (chessBoard[row][0] != ' '

&& chessBoard[row][0] == chessBoard[row][1]

&& chessBoard[row][0] == chessBoard[row][2]) {

return chessBoard[row][0];

}

}

for (int col = 0; col < MAX_COL; col++) {

if (chessBoard[0][col] != ' '

&& chessBoard[0][col] == chessBoard[1][col]

&& chessBoard[0][col] == chessBoard[2][col]) {

return chessBoard[0][col];

}

}

if (chessBoard[0][0] != ' '

&& chessBoard[0][0] == chessBoard[1][1]

&& chessBoard[0][0] == chessBoard[2][2]) {

return chessBoard[0][0];

}

if (chessBoard[2][0] != ' '

&& chessBoard[2][0] == chessBoard[1][1]

&& chessBoard[2][0] == chessBoard[0][2]) {

return chessBoard[2][0];

}

if (isFull(chessBoard)) {

return 'q';

}

return ' ';

}

void game() {

char chessBoard[MAX_ROW][MAX_COL] = { 0 };

init(chessBoard);

char winner = ' ';

while (1) {

system("cls");

print_chessBoard(chessBoard);

playerMove(chessBoard);

winner = isWin(chessBoard);

if (winner != ' ') {

break;

}

computerMove(chessBoard);

winner = isWin(chessBoard);

if (winner != ' ') {

break;

}

}

print_chessBoard(chessBoard);

if (winner == 'x') {

printf("恭喜您, 您赢了!\n");

}

else if (winner == 'o') {

printf("哈哈,您连人工智障都下不过!\n");

}

else {

printf("您只能和人工智障打平手!!\n");

}

}

int menu() {

printf("--------------------------\n");

printf("--------1.开始游戏--------\n");

printf("--------0.退出游戏--------\n");

printf("--------------------------\n");

int choice = 0;

printf("请输入你的选择:");

scanf("%d", &choice);

return choice;

}

int main()

{

srand((unsigned int)time(0));

while (1) {

int choice = menu();

if (choice == 1) {

game();

}

else if (choice == 0) {

printf("退出游戏,GOODBYE!!!!!\n");

break;

}

else {

printf("输入错误!请重新输入!\n");

continue;

}

}

system("pause");

return 0;

}

四、贪吃蛇完整版EN

// 必要的头文件

#include

#include

#include

#include

#include

#include

// 定义标记上下左右的明示常量

#define UP 1

#define DOWN 2

#define LEFT 3

#define RIGHT 4

#define ESC 5

#define FOOD 10

// 定义表示位置的结构体类型

typedef struct snake{

int x;

int y;

struct snake *next;

}snake;

// 定义全局变量

int score = 0; // 当前得分

int speed = 200; // 存储当前速度

int status;

snake *tail, *head; // 存储蛇头蛇尾

snake *food, *q;// q用于遍历链表

HANDLE hOUT;

void gotoxy(int x, int y); // 设置光标位置

int choice(void); // 载入游戏界面

int color(int c); // 设置字体颜色

void printGame(void); // 打印游戏界面

void printSnake(void); // 打印蛇身

void printFood(void); // 打印食物

void printTips(void); // 打印提示

void snakeMove(void); // 主操作函数

int biteSelf(void); // 判断是否咬到了自己

int encounterWall(void); // 判断是否撞墙

void keyboardControl(void); // 获取击键

void speedUp(void); // 加速

void speedDown(void); // 减速

int endGame(void); // 结束函数;

char *s_gets(char *st, int n); // 读取字符

void frees(snake *); // 释放内存

int main(int argc, char *argv[]){

while (1)

{

if (choice() == 1)

keyboardControl();

else

{

gotoxy(5, 15);

printf("按任意键返回");

getchar(); // 去除前一个前导换行

while (1)

{

if (getchar())

{

system("cls");

break;

}

}

}

}

frees(head);

return 0;

}

void gotoxy(int x, int y)

{

COORD c;

c.X = x;

c.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);

}

int choice(void)

{

int yourchoice;

// 画出界面

gotoxy(35, 5);

color(11);

printf("\t贪吃蛇大作战\n");

printf("\n\n");

color(13);

printf("\t\t★★★★★★★★ Snake!");

printf("\t\t★★★★★★★★ Snake!");

gotoxy(25, 15);

color(12);

printf("1.进入游戏\t2.查看说明\t3.退出游戏\n");

color(11);

printf("请选择:");

scanf("%d", &yourchoice);

switch (yourchoice)

{

case 1:

system("cls");

// 初始化

printGame();

printSnake();

printFood();

break;

case 2:

system("cls");

printTips();

break;

case 3:

system("cls");

gotoxy(30, 10);

color(11);

printf("Bye!");

exit(0);

default:

system("cls");

printf("没有此序号,请输入1,2或3\n");

Sleep(2000);

system("cls");

}

return yourchoice;

}

int color(int c)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字颜色

return 0;

}

void printGame()

{

int i, j;

gotoxy(5, 5);

printf("游戏载入中...请稍后");

Sleep(2000);

system("cls");

// 打印上下界面

for (i = 0; i <= 50; i += 2)

{

gotoxy(i, 0);

printf("□");

gotoxy(i, 25);

printf("□");

}

// 打印左右界面

for (i = 0; i <= 25; i += 1)

{

gotoxy(0, i);

printf("□");

gotoxy(50, i);

printf("□");

}

// 打印中间网格

for (i = 1; i <= 24; i += 1)

{

for (j = 2; j <= 48; j += 2)

{

gotoxy(j, i);

color(11);

printf("■");

}

}

// 打印右侧的规则和计分栏

gotoxy(60, 13);

printf("当前分数:%d分,当前速度%d", score, speed);

gotoxy(60, 15);

printf("用↑ ↓ ← →分别控制蛇的移动\n");

gotoxy(60, 18);

printf("每次获取食物加10分 按下F1加速,F2减速,空格暂停\n");

gotoxy(60, 20);

printf("不能撞墙和咬到自己!");

gotoxy(60, 22);

printf("速度不低于100,不高于300");

}

void printSnake(void)

{

int i;

// 设定蛇尾(16,13),头插入,初始向右

tail = (snake*)malloc(sizeof(snake));

tail->x = 16;

tail->y = 13;

tail->next = NULL;

// 设定初始蛇长是4

for (i = 1; i <= 4; i++)

{

head = (snake*)malloc(sizeof(snake));

head->next = tail;

head->x = 16 + 2 * i;

head->y = 13;

tail = head; // 头成为尾

}

// 输出蛇身

while (tail->next)

{

gotoxy(tail->x, tail->y);

color(14);

printf("★");

tail = tail->next;

}

}

void printFood(void)

{

srand((unsigned)time(NULL)); // 利用时钟修改种子

food = (snake*)malloc(sizeof(snake));

food->x = 1; // 初始化x坐标

while (food->x % 2 && food->x)

{

food->x = rand() % 46 + 2;// 2-48

}

food->y = rand() % 23 + 1; // 1-24

q = head; // 不改变头遍历链表

while (q->next)

{

if (q->x == food->x && q->y == food->y)

{

free(food);

printFood();

}

else

{

gotoxy(food->x, food->y);

color(12);

printf("●");

break;

}

}

}

void printTips(void)

{

color(11);

printf("***********Tips************\n");

printf("1.采用合理的速度可以获得更高的分数哦!\n");

printf("2.一定不要撞到自己或者两边的墙!\n");

printf("3.游戏过程中按ESC退出游戏!\n");

}

void snakeMove(void)

{

snake *snakenext;

snakenext = (snake*)malloc(sizeof(snake));

if (biteSelf())

{

gotoxy(60, 11);

printf("咬到自己啦!");

free(snakenext);

Sleep(1500);

system("cls");

exit(0);

}

else if (encounterWall())

{

gotoxy(60, 11);

printf("撞到墙啦!");

free(snakenext);

Sleep(1500);

system("cls");

exit(0);

}

else

{

// 前两个条件判断完成才开始移动

Sleep(350 - speed);

if (status == UP)

{

snakenext->x = head->x;

snakenext->y = head->y - 1;

snakenext->next = head;

head = snakenext;

q = head;

if (snakenext->x == food->x && snakenext->y == food->y)

{

while (q)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

score += FOOD;

gotoxy(60, 13);

printf("当前分数:%d分,当前速度%d", score, speed);

printFood();

}

else

{

while (q->next->next)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

gotoxy(q->next->x, q->next->y);

color(11);

printf("■");

free(q->next);

q->next = NULL;

}

}

else if (status == DOWN)

{

snakenext->x = head->x;

snakenext->y = head->y + 1;

snakenext->next = head;

head = snakenext;

q = head;

if (snakenext->x == food->x && snakenext->y == food->y)

{

while (q)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

score += FOOD;

gotoxy(60, 13);

printf("当前分数:%d分,当前速度%d", score, speed);

printFood();

}

else

{

while (q->next->next)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

gotoxy(q->next->x, q->next->y);

color(11);

printf("■");

free(q->next);

q->next = NULL;

}

}

else if (status == LEFT)

{

snakenext->x = head->x - 2;

snakenext->y = head->y;

snakenext->next = head;

head = snakenext;

q = head;

if (snakenext->x == food->x && snakenext->y == food->y)

{

while (q)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

score += FOOD;

gotoxy(60, 13);

printf("当前分数:%d分,当前速度%d", score, speed);

printFood();

}

else

{

while (q->next->next)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

gotoxy(q->next->x, q->next->y);

color(11);

printf("■");

free(q->next);

q->next = NULL;

}

}

else if (status == RIGHT)

{

snakenext->x = head->x + 2;

snakenext->y = head->y;

snakenext->next = head;

head = snakenext;

q = head;

if (snakenext->x == food->x && snakenext->y == food->y)

{

while (q)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

score += FOOD;

gotoxy(60, 13);

printf("当前分数:%d分,当前速度%d", score, speed);

printFood();

}

else

{

while (q->next->next)

{

gotoxy(q->x, q->y);

color(14);

printf("★");

q = q->next;

}

gotoxy(q->next->x, q->next->y);

color(11);

printf("■");

free(q->next);

q->next = NULL;

}

}

}

}

int biteSelf(void)

{

int x = 0; // 默认未咬到自己

q = head->next;

// 遍历蛇身

while (q->next)

{

if (q->x == head->x && q->y == head->y)

{

x = 1;

}

q = q->next;

}

return x;

}

int encounterWall(void)

{

int x = 0; // 默认未撞到墙

if (head->x == 0 || head->x == 50 || head->y == 0 || head->y == 25)

x = 1;

return x;

}

void keyboardControl(void)

{

status = RIGHT; // 初始蛇向右移动

while (1)

{

if (GetAsyncKeyState(VK_UP) && status != DOWN) // GetAsyncKeyState函数用来判断函数调用时指定虚拟键的状态

{

status = UP; //如果蛇不是向下前进的时候,按上键,执行向上前进操作

}

else if (GetAsyncKeyState(VK_DOWN) && status != UP) // 如果蛇不是向上前进的时候,按下键,执行向下前进操作

{

status = DOWN;

}

else if (GetAsyncKeyState(VK_LEFT) && status != RIGHT) // 如果蛇不是向右前进的时候,按左键,执行向左前进

{

status = LEFT;

}

else if (GetAsyncKeyState(VK_RIGHT) && status != LEFT) // 如果蛇不是向左前进的时候,按右键,执行向右前进

{

status = RIGHT;

}

if (GetAsyncKeyState(VK_SPACE))// 空格暂停

{

while (1)

{

Sleep(300);

if (GetAsyncKeyState(VK_SPACE)) // 再次按空格改变状态

{

break;

}

}

}

else if (GetAsyncKeyState(VK_ESCAPE))

{

status = ESC; // 按esc键,直接到结束界面

if (endGame())

{

Sleep(500);

system("cls");

break;

}

}

else if (GetAsyncKeyState(VK_F1)) // 按F1键,加速

{

speedUp();

gotoxy(60, 13);

printf("当前分数:%d分,当前速度%d", score, speed);

}

else if (GetAsyncKeyState(VK_F2)) // 按F2键,减速

{

speedDown();

gotoxy(60, 13);

printf("当前分数:%d分,当前速度%d", score, speed);

}

snakeMove();

}

}

void speedUp(void)

{

if (speed <= 280)

speed += 20;

}

void speedDown(void)

{

if (speed >= 120)

speed -= 20;

}

int endGame(void)

{

char x = 0;

char judge[5];

getchar();

gotoxy(60, 9);

printf("确定退出吗?(Yes/No)");

gotoxy(60, 11);

s_gets(judge, 5);

if (strcmp(judge, "Yes") == 0)

{

Sleep(250);

system("cls");

gotoxy(40, 11);

printf("\tBye!");

x = 1;

}

else

x = 0;

return x;

}

char *s_gets(char *st, int n)

{

char *ret_val;

char *find;

gotoxy(60, 11);

ret_val = fgets(st, n, stdin);

if (ret_val)

{

find = strchr(st, '\n');

if (find)

*find = '\0';

else

while (getchar() != '\n')

continue;

}

return ret_val;

}

void frees(snake *s)

{

snake *current = s;

while (current)

{

current = s;

s = current->next;

free(current);

}

}

END

源代码比较长只能先放上去这么多,还有更多的小项目 加一下我的c/c++编程资料交流Q群:214574728

上一篇
下一篇
相关文章