最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C語(yǔ)言,別踩白塊兒雙人版

2023-08-17 22:50 作者:稻田豚  | 我要投稿


#undef UNICODE

#undef _UNICODE

#include <graphics.h>

#include <conio.h>

#include <stdio.h>

#include <time.h>

#define MAXTASK 50 // 定義游戲需要完成的黑塊數(shù)量


// 定義宏 __sprintf 自適應(yīng) vc6 與 vc2013

#if _MSC_VER > 1200

#define __sprintf(...) sprintf_s(__VA_ARGS__)

#else

#define __sprintf sprintf

#endif



// 精確延時(shí)函數(shù)(可以精確到 1ms,精度 ±1ms)

/* 【自學(xué)去】網(wǎng)站收集 http://www.zixue7.com */

void HpSleep(int ms)

{

static clock_t oldclock = clock(); // 靜態(tài)變量,記錄上一次 tick


oldclock += ms * CLOCKS_PER_SEC / 1000; // 更新 tick


if (clock() > oldclock) // 如果已經(jīng)超時(shí),無(wú)需延時(shí)

oldclock = clock();

else

while (clock() < oldclock) // 延時(shí)

Sleep(1); // 釋放 CPU 控制權(quán),降低 CPU 占用率

}



// 游戲狀態(tài)常量

enum STATUS{BEGIN, // 游戲開(kāi)始

RUNNING, // 游戲運(yùn)行中

PASSANI, // 游戲通過(guò)的動(dòng)畫(huà)

PASS, // 游戲通過(guò)

FAILANI, // 游戲失敗的動(dòng)畫(huà)

FAIL }; // 游戲失敗



// 游戲者類(每個(gè)游戲者都有一個(gè)獨(dú)立的游戲區(qū)域)

class PLAYER

{

private:

STATUS m_status; // 游戲狀態(tài)

char* m_strName; // 游戲者名稱

POINT m_offset; // 界面的偏移量

char* m_keys; // 按鍵


// 任務(wù)

byte m_Task[MAXTASK]; // 任務(wù)列表

byte m_iTask; // 當(dāng)前需要執(zhí)行的任務(wù) ID

int m_nextTaskY; // 界面中下一個(gè)任務(wù)的 Y 坐標(biāo)


// 時(shí)鐘和游戲記錄

clock_t m_beginClock; // 游戲開(kāi)始的時(shí)鐘計(jì)數(shù)

float m_bestTime; // 最佳紀(jì)錄的完成時(shí)間

float m_lastTime; // 最后一次的完成時(shí)間


// 控制失敗動(dòng)畫(huà)的變量

byte m_failErrorKey; // 按錯(cuò)的鍵的序號(hào)(值為 0、1、2、3)

RECT m_failRect; // 按錯(cuò)的鍵的區(qū)域

int m_failFrame; // 失敗后的動(dòng)畫(huà)的幀計(jì)數(shù)


public:

PLAYER(char* name, char* keys, int offsetx, int offsety); // 構(gòu)造函數(shù)

void Hit(char key); // 處理游戲者按鍵

void Draw(); // 繪制該游戲者的游戲界面

private:

void Init(); // 初始化當(dāng)前游戲者的游戲信息

void DrawFrame(); // 繪制游戲界面的外框

void DrawRow(int baseY, int iTask); // 繪制游戲界面中的一行任務(wù)

void DrawPass(); // 繪制通過(guò)游戲后的界面

void DrawFail(); // 繪制游戲失敗后的界面


// 進(jìn)行偏移量計(jì)算的繪圖函數(shù)

void OutTextXY(int x, int y, LPCTSTR s) // 在指定位置輸出字符串

{

outtextxy(m_offset.x + x, m_offset.y + y, s);

}

void OutTextXY(int x, int y, char c) // 在指定位置輸出字符

{

outtextxy(m_offset.x + x, m_offset.y + y, c);

}

void Rectangle(int x1, int y1, int x2, int y2) // 繪制矩形

{

rectangle(m_offset.x + x1, m_offset.y + y1, m_offset.x + x2, m_offset.y + y2);

}

void FillRectangle(int x1, int y1, int x2, int y2) // 繪制有邊框填充矩形

{

fillrectangle(m_offset.x + x1, m_offset.y + y1, m_offset.x + x2, m_offset.y + y2);

}

void SolidRectangle(int x1, int y1, int x2, int y2) // 繪制無(wú)邊框填充矩形

{

solidrectangle(m_offset.x + x1, m_offset.y + y1, m_offset.x + x2, m_offset.y + y2);

}

};



// 構(gòu)造函數(shù)

// 參數(shù):

// name: 游戲者名稱

// keys: 游戲者所用按鍵(指向長(zhǎng)度為 4 的字符串)

// offsetx, offsety: 游戲者對(duì)應(yīng)的游戲區(qū)域在主窗口中的偏移量

PLAYER::PLAYER(char* name, char* keys, int offsetx, int offsety)

{

m_strName = name;

m_keys = keys;

m_offset.x = offsetx;

m_offset.y = offsety;


m_bestTime = 99; // 設(shè)置最佳成績(jī)


Init(); // 初始化游戲者

}



// 初始化當(dāng)前游戲者的游戲信息

void PLAYER::Init()

{

// 初始化任務(wù)

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

m_Task[i] = rand() % 4;


m_iTask = 0; // 從第一個(gè)任務(wù)開(kāi)始

m_nextTaskY = 200; // 設(shè)定下一行任務(wù)的 Y 坐標(biāo),100 是基準(zhǔn),200 表示開(kāi)始會(huì)有下落的動(dòng)畫(huà)

m_status = BEGIN; // 設(shè)置游戲初始狀態(tài)

m_failFrame = 0; // 重置失敗后的動(dòng)畫(huà)的幀計(jì)數(shù)


// 初始化游戲界面

DrawFrame();

}



// 繪制該游戲者的游戲界面

void PLAYER::Draw()

{

switch (m_status)

{

case PASSANI: // 游戲成功后的動(dòng)畫(huà)

if (m_nextTaskY == 100)

{

m_status = PASS;

DrawPass();

break;

}


case BEGIN: // 游戲初次開(kāi)始

case RUNNING: // 游戲運(yùn)行中

{

// 如果畫(huà)面處于靜止,直接返回不再重繪

if (m_nextTaskY == 100)

return;


m_nextTaskY -= (m_nextTaskY - 100 + 9) / 10;


// 繪制完成的任務(wù)區(qū)

int rowy = m_nextTaskY;

int itask = m_iTask;

do

{

rowy -= 100;

itask--;

DrawRow(rowy, itask);

} while (rowy > 0);


// 繪制未完成的任務(wù)區(qū)

rowy = m_nextTaskY;

itask = m_iTask;

do

{

DrawRow(rowy, itask);

rowy += 100;

itask++;

} while (rowy < 400);


break;

}


case FAILANI: // 游戲失敗后的動(dòng)畫(huà)

DrawFail();

break;


case PASS: // 游戲通過(guò)后的成績(jī)顯示

case FAIL: // 游戲失敗后的成績(jī)顯示

break;

}

}



// 繪制游戲界面的外框

void PLAYER::DrawFrame()

{

// 畫(huà)外框

setlinecolor(0xfb9700);

Rectangle(0, 0, 243, 464);

setfillcolor(0xeca549);

settextcolor(BLACK);

settextstyle(16, 0, "Verdana");

setbkmode(TRANSPARENT);


// 畫(huà)姓名區(qū)

SolidRectangle(2, 2, 241, 21);

int w = textwidth(m_strName);

OutTextXY((244 - w) / 2, 4, m_strName);


// 畫(huà)成績(jī)區(qū)

SolidRectangle(2, 23, 241, 42);

char tmp[50];

__sprintf(tmp, "最好記錄:%.3f 秒", m_bestTime);

OutTextXY(10, 26, tmp);


// 2 <= x <= 241, 44 <= y <= 443 為游戲區(qū)


// 畫(huà)控制區(qū)

SolidRectangle(2, 445, 241, 462);

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

OutTextXY(2 + i * 60 + 26, 446, m_keys[i]);

}



// 繪制游戲界面中的一行任務(wù)

void PLAYER::DrawRow(int baseY, int iTask)

{

int fromY = baseY; // 任務(wù)行的起始 y 坐標(biāo)

int toY = baseY + 99; // 任務(wù)行的終止 y 坐標(biāo)


// 如果 y 坐標(biāo)超出顯示范圍,做調(diào)整

if (fromY < 0) fromY = 0;

if (toY > 399) toY = 399;


COLORREF c[4]; // 任務(wù)行四個(gè)方塊的顏色

if (iTask < 0)

{

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

c[i] = YELLOW;

}

else if (iTask >= MAXTASK)

{

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

c[i] = GREEN;

}

else

{

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

c[i] = WHITE;

c[m_Task[iTask]] = (iTask < m_iTask)? LIGHTGRAY : BLACK;

}


// 畫(huà)任務(wù)行的四個(gè)方塊

setlinecolor(0xe9dbd6);

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

{

setfillcolor(c[i]);

FillRectangle(2 + i * 60, 44 + 399 - fromY, 2 + i * 60 + 59, 44 + 399 - toY);

}


// 如果是第一行,在方塊兒上寫(xiě)“開(kāi)始”兩個(gè)字

if (iTask == 0 && m_iTask == 0)

{

int w = textwidth("開(kāi)始");

int h = textheight("開(kāi)始");

int x = 2 + m_Task[iTask] * 60 + (60 - w) / 2;

int y = 44 + 399 - 99 - fromY + (100 - h) / 2;

settextcolor(WHITE);

settextstyle(16, 0, "Verdana");

OutTextXY(x, y, "開(kāi)始");

}

}



// 繪制通過(guò)游戲后的界面

void PLAYER::DrawPass()

{

// 繪制成功的背景

setfillcolor(GREEN);

SolidRectangle(2, 44, 241, 443);


// 輸出"成功"

settextcolor(WHITE);

settextstyle(60, 0, "Verdana");

int w = textwidth("成功");

OutTextXY((244 - w) / 2, 100, "成功");


// 輸出成績(jī)

char tmp[100];

settextstyle(32, 0, "Verdana");

__sprintf(tmp, "成績(jī):%.3f 秒", m_lastTime);

w = textwidth(tmp);

OutTextXY((244 - w) / 2, 200, tmp);

__sprintf(tmp, "速度:%.3f/s", MAXTASK / m_lastTime);

OutTextXY((244 - w) / 2, 240, tmp);


// 輸出重新開(kāi)始的提示

settextstyle(16, 0, "Verdana");

w = textwidth("按任意控制鍵重新開(kāi)始");

OutTextXY((244 - w) / 2, 400, "按任意控制鍵重新開(kāi)始");

}



// 繪制游戲失敗后的界面

void PLAYER::DrawFail()

{

if (m_failFrame == 0)

{ // 初始化,計(jì)算閃爍效果的區(qū)域

m_failRect.left = 3 + m_failErrorKey * 60;

m_failRect.right = m_failRect.left + 57;

m_failRect.bottom = m_nextTaskY + 1;

m_failRect.top = m_nextTaskY + 98;


if (m_failRect.top > 398) m_failRect.top = 398;

m_failRect.bottom = 44 + 399 - m_failRect.bottom;

m_failRect.top = 44 + 399 - m_failRect.top;

}


if (m_failFrame < 60)

{ // 實(shí)現(xiàn)閃爍效果

setfillcolor(((m_failFrame / 6) % 2 == 0) ? RED : LIGHTRED);

SolidRectangle(m_failRect.left, m_failRect.bottom, m_failRect.right, m_failRect.top);

m_failFrame++;

}

else

{

// 改變游戲狀態(tài)

m_status = FAIL;


// 繪制失敗的背景

setfillcolor(RED);

SolidRectangle(2, 44, 241, 443);


// 輸出"失敗"

settextcolor(WHITE);

settextstyle(60, 0, "Verdana");

int w = textwidth("失敗");

OutTextXY((244 - w) / 2, 100, "失敗");


// 輸出歷史成績(jī)

settextstyle(20, 0, "Verdana");

char tmp[100];

__sprintf(tmp, "歷史最好成績(jī):%.3f 秒", m_bestTime);

w = textwidth(tmp);

OutTextXY((244 - w) / 2, 200, tmp);


// 輸出重新開(kāi)始的提示

settextstyle(16, 0, "Verdana");

w = textwidth("按任意控制鍵重新開(kāi)始");

OutTextXY((244 - w) / 2, 400, "按任意控制鍵重新開(kāi)始");

}

}



// 處理游戲者按鍵

void PLAYER::Hit(char key)

{

switch (m_status)

{

case BEGIN: // 游戲初次開(kāi)始

if (strchr(m_keys, key) != NULL)

{

m_beginClock = clock(); // 記錄游戲開(kāi)始時(shí)的時(shí)鐘

m_status = RUNNING; // 改變游戲狀態(tài)

}


case RUNNING: // 游戲運(yùn)行中

{

char* pdest = strchr(m_keys, key);

byte pos;

if (pdest != NULL) // 判斷是否是當(dāng)前游戲者按鍵

{

pos = pdest - m_keys; // 計(jì)算按鍵對(duì)應(yīng)的位置


if (pos == m_Task[m_iTask]) // 判斷按鍵是否正確

{

// 按鍵正確

m_iTask++;

m_nextTaskY += 100;


if (m_iTask == MAXTASK) // 如果完成了全部任務(wù)

{

// 計(jì)算完成時(shí)間

clock_t t = clock();

m_lastTime = ((float)(clock() - m_beginClock)) / CLOCKS_PER_SEC;


// 更新最好記錄

if (m_lastTime < m_bestTime)

m_bestTime = m_lastTime;


// 將最后一條任務(wù)滾動(dòng)出屏幕

m_iTask++;

m_nextTaskY += 100;

m_status = PASSANI;

}

}

else

{

// 按鍵失敗

m_failErrorKey = pos;

m_status = FAILANI;

}

}


break;

}


case PASSANI: // 游戲成功后的動(dòng)畫(huà)

case FAILANI: // 游戲失敗后的動(dòng)畫(huà)

break;


case PASS: // 游戲通過(guò)后的成績(jī)顯示

case FAIL: // 游戲失敗后的成績(jī)顯示

if (strchr(m_keys, key) != NULL)

Init();

break;

}

}



// 程序入口主函數(shù)

void main()

{


initgraph(640, 480); // 創(chuàng)建繪圖窗口

srand((unsigned)time(NULL)); // 設(shè)置隨機(jī)函數(shù)種子


setbkcolor(0x01bbfb);

cleardevice();


PLAYER p1("喜羊羊", "asdf", 38, 8); // 創(chuàng)建游戲者 喜羊羊

PLAYER p2("灰太狼", "jkl;", 358, 8); // 創(chuàng)建游戲者 灰太狼


char c = 0;


while (c != 27)

{

while (_kbhit()) // 判斷是否有按鍵

{

// 按鍵處理

c = _getch();

p1.Hit(c);

p2.Hit(c);

}


// 繪制游戲場(chǎng)景

p1.Draw();

p2.Draw();


// 延時(shí)

HpSleep(16);

}


// 結(jié)束游戲

closegraph(); // 關(guān)閉繪圖窗口

}


C語(yǔ)言,別踩白塊兒雙人版的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
北安市| 安远县| 长子县| 卓尼县| 达州市| 湖南省| 云和县| 西丰县| 绥滨县| 塔城市| 云梦县| 穆棱市| 个旧市| 柳州市| 乌拉特后旗| 明水县| 陆丰市| 文登市| 丰台区| 凤城市| 莫力| 沂南县| 苗栗市| 沙河市| 葫芦岛市| 平舆县| 报价| 府谷县| 德化县| 哈巴河县| 宁河县| 丰台区| 深泽县| 迭部县| 贺兰县| 南丹县| 托克逊县| 象州县| 永川市| 石楼县| 阿图什市|