#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<windows.h>
#include<time.h>
#define ROAD_LENGTH 50 //路面長度
#define DINO_PLACE 6 //小恐龍在路面上的第幾格
struct dino {
char road[ROAD_LENGTH + 1];//字串結尾需要'\0'
int jump_time_left; //還剩多久掉回地面
int score; //分數
int wait_time; //每次迴圈之間等待的時間
int barrier_chance; //放置障礙物的機率
};
typedef struct dino Dino;
bool space_pressed(void)
{
return _kbhit() != 0 && _getch() == 32;
}
void move(Dino* MyDino)
{
for (int i = 0; i < ROAD_LENGTH - 1; i++)
{
MyDino->road[i] = MyDino->road[i + 1];
}
MyDino->road[ROAD_LENGTH - 1] = '_';
}
Dino* init(void)
{
Dino* MyDino = (Dino*)malloc(sizeof(Dino));
if (MyDino != NULL)
{
MyDino->score = 0;
MyDino->jump_time_left = 0;
MyDino->wait_time = 150;
MyDino->barrier_chance = 10;
for (int i = 0; i < ROAD_LENGTH; i++)
{
MyDino->road[i] = '_';
}
MyDino->road[ROAD_LENGTH] = '\0';
}
return MyDino;
}
void display(Dino* MyDino)
{
system("cls");
printf("\n\n\t");
for (int i = 0; i < ROAD_LENGTH; i++)
{
if (i == DINO_PLACE && MyDino->jump_time_left > 0)
printf("O");
else
printf(" ");
}
printf("\n\t");
for (int i = 0; i < ROAD_LENGTH; i++)
{
if (i == DINO_PLACE && MyDino->jump_time_left == 0)
printf("O");
else
printf("%c", MyDino->road[i]);
}
printf("\n\n\n\t");
printf("\t\tyour score is : %d\n", MyDino->score);
return;
}
bool is_bumped(Dino* MyDino)
{
return MyDino->jump_time_left == 0 && MyDino->road[DINO_PLACE] == 'X';
}
bool spawn_barrier(Dino* MyDino)
{
int random_number = rand() % 100;
if (random_number < MyDino->barrier_chance)
return true;
return false;
}
int main()
{
/* 初始化 */
srand(time(NULL));
Dino* MyDino = init();
display(MyDino);
/* 遊戲本體 */
while (true)
{
/* 邏輯運算 */
if (space_pressed() && MyDino->jump_time_left == 0)
{
MyDino->jump_time_left = 7;
}
move(MyDino);
if (spawn_barrier(MyDino))
{
MyDino->road[ROAD_LENGTH - 1] = 'X';
}
if (MyDino->jump_time_left > 0)
MyDino->jump_time_left -= 1;
if (is_bumped(MyDino))
{
display(MyDino);
break;
}
/* 渲染呈現 */
display(MyDino);
MyDino->score++;
Sleep(MyDino->wait_time);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
#include <time.h>
#define ROAD_LENGTH 50 //路面長度
#define DINO_PLACE 6 //小恐龍在路面上的第幾格
struct barrier {
int position;
struct barrier* next;
};
typedef struct barrier Barrier;
struct bullet {
int position;
struct bullet* next;
};
typedef struct bullet Bullet;
struct dino {
char road[ROAD_LENGTH + 1]; // 字串結尾需要 '\0'
int jump_time_left; // 還剩多久掉回地面
int score; // 分數
int wait_time; // 每次迴圈之間等待的時間
int barrier_chance; // 放置障礙物的機率
Bullet* bullets; // 儲存子彈的位置
Barrier* barriers; // 儲存障礙物的位置
};
typedef struct dino Dino;
bool space_pressed(void)
{
return _kbhit() != 0 && _getch() == 32;
}
void move(Dino* MyDino)
{
for (int i = 0; i < ROAD_LENGTH - 1; i++)
{
MyDino->road[i] = MyDino->road[i + 1];
}
MyDino->road[ROAD_LENGTH - 1] = '_';
}
Dino* init(void)
{
Dino* MyDino = (Dino*)malloc(sizeof(Dino));
if (MyDino != NULL)
{
MyDino->score = 0;
MyDino->jump_time_left = 0;
MyDino->wait_time = 150;
MyDino->barrier_chance = 20;
for (int i = 0; i < ROAD_LENGTH; i++)
{
MyDino->road[i] = '_';
}
MyDino->road[ROAD_LENGTH] = '\0';
MyDino->barriers = NULL;
}
return MyDino;
}
void display(Dino* MyDino, Bullet* bullets)
{
system("cls");
printf("Invincible Bullet Dinosaur\n");
printf("\n\n\n\t");
// 顯示天空
for (int i = 0; i < ROAD_LENGTH; i++) {
printf("_");
}
printf("\n\t");
// 顯示恐龍和路面
for (int i = 0; i < ROAD_LENGTH; i++)
{
if (i == DINO_PLACE && MyDino->jump_time_left > 0)
printf("O");
else
printf(" ");
}
printf("\n\t");
for (int i = 0; i < ROAD_LENGTH; i++)
{
bool has_bullet = false;
bool has_barrier = false;
if (bullets != NULL)
{
Bullet* current_bullet = bullets;
while (current_bullet != NULL)
{
if (i == current_bullet->position)
{
has_bullet = true;
// 檢查是否有障礙物
if (MyDino->road[i] == 'X')
{
Barrier* current_barrier = MyDino->barriers;
Barrier* prev_barrier = NULL;
// 找到最靠近子彈的障礙物
while (current_barrier != NULL && current_barrier->position < i)
{
prev_barrier = current_barrier;
current_barrier = current_barrier->next;
}
if (prev_barrier == NULL)
{
MyDino->barriers = current_barrier->next;
free(current_barrier);
}
else
{
prev_barrier->next = current_barrier->next;
free(current_barrier);
}
MyDino->score += 10;
MyDino->road[i] = '_';
}
printf("o");
current_bullet = current_bullet->next;
continue;
}
current_bullet = current_bullet->next;
}
}
if (!has_bullet)
{
if (MyDino->barriers != NULL)
{
Barrier* current_barrier = MyDino->barriers;
while (current_barrier != NULL)
{
if (i == current_barrier->position)
{
has_barrier = true;
printf("X");
break;
}
current_barrier = current_barrier->next;
}
}
if (!has_barrier)
{
if (i == DINO_PLACE && MyDino->jump_time_left == 0)
printf("O");
else
printf("%c", MyDino->road[i]);
}
}
}
printf("\n\n\n\t");
printf("\t\tYour score is ---->>>> %d\n", MyDino->score);
}
bool is_bumped(Dino* MyDino)
{
return MyDino->jump_time_left == 0 && MyDino->road[DINO_PLACE] == 'X';
}
bool spawn_barrier(Dino* MyDino)
{
int random_number = rand() % 100;
if (random_number < MyDino->barrier_chance)
return true;
return false;
}
int main()
{
/* 初始化*/
srand(time(NULL));
Dino MyDino = init();
Bullet* bullets = NULL;
display(MyDino, bullets);
/* 遊戲本體 */
while (true)
{
/* 邏輯運算 */
// 玩家射擊子彈
if (space_pressed() && MyDino->jump_time_left == 0)
{
Bullet* new_bullet = (Bullet*)malloc(sizeof(Bullet));
new_bullet->position = DINO_PLACE + 1;
new_bullet->next = bullets;
bullets = new_bullet;
}
// 移動子彈
Bullet* current_bullet = bullets;
Bullet* prev_bullet = NULL;
while (current_bullet != NULL)
{
current_bullet->position += 2; // 子彈速度為恐龍速度的2倍
if (current_bullet->position >= ROAD_LENGTH)
{
// 超出螢幕範圍,刪除子彈
if (prev_bullet == NULL)
{
bullets = current_bullet->next;
free(current_bullet);
current_bullet = bullets;
}
else
{
prev_bullet->next = current_bullet->next;
free(current_bullet);
current_bullet = prev_bullet->next;
}
}
else
{
prev_bullet = current_bullet;
current_bullet = current_bullet->next;
}
}
// 檢查是否撞到障礙物
if (MyDino->jump_time_left == 0 && MyDino->road[DINO_PLACE] == 'X')
{
display(MyDino, bullets);
break;
}
// 移動路面和放置障礙物
move(MyDino);
if (spawn_barrier(MyDino))
{
Barrier* new_barrier = (Barrier*)malloc(sizeof(Barrier));
new_barrier->position = ROAD_LENGTH - 1;
new_barrier->next = MyDino->barriers;
MyDino->barriers = new_barrier;
MyDino->road[ROAD_LENGTH - 1] = 'X';
}
// 判斷是否遊戲結束
if (MyDino->jump_time_left > 0)
{
MyDino->jump_time_left -= 1;
}
// 檢查子彈是否擊中障礙物
current_bullet = bullets;
prev_bullet = NULL;
while (current_bullet != NULL)
{
bool hit_barrier = false;
Barrier* current_barrier = MyDino->barriers;
Barrier* prev_barrier = NULL;
while (current_barrier != NULL)
{
if (current_bullet->position == current_barrier->position)
{
hit_barrier = true;
if (prev_barrier == NULL)
{
MyDino->barriers = current_barrier->next;
free(current_barrier);
current_barrier = MyDino->barriers;
}
else
{
prev_barrier->next = current_barrier->next;
free(current_barrier);
current_barrier = prev_barrier->next;
}
break;
}
prev_barrier = current_barrier;
current_barrier = current_barrier->next;
}
if (hit_barrier)
{
// 刪除子彈
if (prev_bullet == NULL)
{
bullets = current_bullet->next;
free(current_bullet);
current_bullet = bullets;
}
else
{
prev_bullet->next = current_bullet->next;
free(current_bullet);
current_bullet = prev_bullet->next;
}
}
else
{
prev_bullet = current_bullet;
current_bullet = current_bullet->next;
}
}
// 檢查是否撞到障礙物
if (MyDino->jump_time_left == 0 && MyDino->road[DINO_PLACE] == 'X')
{
display(MyDino, bullets);
break;
}
// 移動路面和放置障礙物
move(MyDino);
if (spawn_barrier(MyDino))
{
Barrier* new_barrier = (Barrier*)malloc(sizeof(Barrier));
new_barrier->position = ROAD_LENGTH - 1;
new_barrier->next = MyDino->barriers;
MyDino->barriers = new_barrier;
MyDino->road[ROAD_LENGTH - 1] = 'X';
}
// 判斷是否遊戲結束
if (MyDino->jump_time_left > 0)
{
MyDino->jump_time_left -= 1;
}
// 檢查子彈是否擊中障礙物
current_bullet = bullets;
prev_bullet = NULL;
while (current_bullet != NULL)
{
bool hit_barrier = false;
Barrier* current_barrier = MyDino->barriers;
Barrier* prev_barrier = NULL;
while (current_barrier != NULL)
{
if (current_bullet->position == current_barrier->position)
{
hit_barrier = true;
if (prev_barrier == NULL)
{
MyDino->barriers = current_barrier->next;
free(current_barrier);
current_barrier = MyDino->barriers;
}
else
{
prev_barrier->next = current_barrier->next;
free(current_barrier);
current_barrier = prev_barrier->next;
}
break;
}
prev_barrier = current_barrier;
current_barrier = current_barrier->next;
}
if (hit_barrier)
{
// 刪除子彈s
if (prev_bullet == NULL)
{
bullets = current_bullet->next;
free(current_bullet);
current_bullet = bullets;
}
else
{
prev_bullet->next = current_bullet->next;
free(current_bullet);
current_bullet = prev_bullet->next;
}
}
else
{
prev_bullet = current_bullet;
current_bullet = current_bullet->next;
}
}
/* 渲染呈現 */
display(MyDino, bullets);
MyDino->score++;
Sleep(MyDino->wait_time);
}
// 釋放動態分配的記憶體
Bullet* temp_bullet = bullets;
while (temp_bullet != NULL)
{
Bullet* current_bullet = temp_bullet;
temp_bullet = temp_bullet->next;
free(current_bullet);
}
Barrier* temp_barrier = MyDino->barriers;
while (temp_barrier != NULL)
{
Barrier* current_barrier = temp_barrier;
temp_barrier = temp_barrier->next;
free(current_barrier);
}
free(MyDino);
return 0;
}
for (int i = 0; i < ROAD_LENGTH; i++) {
printf("_");
}
struct barrier {
int position;
struct barrier* next;
};
typedef struct barrier Barrier;
struct dino {
char road[ROAD_LENGTH + 1]; // 字串結尾需要 '\0'
int jump_time_left; // 還剩多久掉回地面
int score; // 分數
int wait_time; // 每次迴圈之間等待的時間
int barrier_chance; // 放置障礙物的機率
Bullet* bullets; // 儲存子彈的位置
Barrier* barriers; // 儲存障礙物的位置
};
typedef struct dino Dino;
// 移動路面和放置障礙物
move(MyDino);
if (spawn_barrier(MyDino))
{
Barrier* new_barrier = (Barrier*)malloc(sizeof(Barrier));
new_barrier->position = ROAD_LENGTH - 1;
new_barrier->next = MyDino->barriers;
MyDino->barriers = new_barrier;
MyDino->road[ROAD_LENGTH - 1] = 'X';
}
Barrier* temp_barrier = MyDino->barriers;
while (temp_barrier != NULL)
{
Barrier* current_barrier = temp_barrier;
temp_barrier = temp_barrier->next;
free(current_barrier);
}
struct bullet {
int position;
struct bullet* next;
};
typedef struct bullet Bullet;
struct dino {
char road[ROAD_LENGTH + 1]; // 字串結尾需要 '\0'
int jump_time_left; // 還剩多久掉回地面
int score; // 分數
int wait_time; // 每次迴圈之間等待的時間
int barrier_chance; // 放置障礙物的機率
Bullet* bullets; // 儲存子彈的位置
Barrier* barriers; // 儲存障礙物的位置
};
typedef struct dino Dino;
void display(Dino* MyDino, Bullet* bullets)
Bullet* current_bullet = bullets;
while (current_bullet != NULL)
{
if (i == current_bullet->position)
{
has_bullet = true;
// 檢查是否有障礙物
if (MyDino->road[i] == 'X')
{
Barrier* current_barrier = MyDino->barriers;
Barrier* prev_barrier = NULL;
// 找到最靠近子彈的障礙物
while (current_barrier != NULL && current_barrier->position < i)
{
prev_barrier = current_barrier;
current_barrier = current_barrier->next;
}
if (prev_barrier == NULL)
{
MyDino->barriers = current_barrier->next;
free(current_barrier);
}
else
{
prev_barrier->next = current_barrier->next;
free(current_barrier);
}
MyDino->score += 10;
MyDino->road[i] = '_';
}
printf("o");
current_bullet = current_bullet->next;
continue;
}
current_bullet = current_bullet->next;
}
}
if (!has_bullet)
{
if (MyDino->barriers != NULL)
{
Barrier* current_barrier = MyDino->barriers;
while (current_barrier != NULL)
{
if (i == current_barrier->position)
{
has_barrier = true;
printf("X");
break;
}
current_barrier = current_barrier->next;
}
}
if (!has_barrier)
{
if (i == DINO_PLACE && MyDino->jump_time_left == 0)
printf("O");
else
printf("%c", MyDino->road[i]);
}
}
}
// 玩家射擊子彈
if (space_pressed() && MyDino->jump_time_left == 0)
{
Bullet* new_bullet = (Bullet*)malloc(sizeof(Bullet));
new_bullet->position = DINO_PLACE + 1;
new_bullet->next = bullets;
bullets = new_bullet;
}
// 移動子彈
Bullet* current_bullet = bullets;
Bullet* prev_bullet = NULL;
while (current_bullet != NULL)
{
current_bullet->position += 2; // 子彈速度為恐龍速度的2倍
if (current_bullet->position >= ROAD_LENGTH)
{
// 超出螢幕範圍,刪除子彈
if (prev_bullet == NULL)
{
bullets = current_bullet->next;
free(current_bullet);
current_bullet = bullets;
}
else
{
prev_bullet->next = current_bullet->next;
free(current_bullet);
current_bullet = prev_bullet->next;
}
}
else
{
prev_bullet = current_bullet;
current_bullet = current_bullet->next;
}
}
// 檢查是否撞到障礙物
if (MyDino->jump_time_left == 0 && MyDino->road[DINO_PLACE] == 'X')
{
display(MyDino, bullets);
break;
}
// 檢查子彈是否擊中障礙物
current_bullet = bullets;
prev_bullet = NULL;
while (current_bullet != NULL)
{
bool hit_barrier = false;
Barrier* current_barrier = MyDino->barriers;
Barrier* prev_barrier = NULL;
while (current_barrier != NULL)
{
if (current_bullet->position == current_barrier->position)
{
hit_barrier = true;
if (prev_barrier == NULL)
{
MyDino->barriers = current_barrier->next;
free(current_barrier);
current_barrier = MyDino->barriers;
}
else
{
prev_barrier->next = current_barrier->next;
free(current_barrier);
current_barrier = prev_barrier->next;
}
break;
}
prev_barrier = current_barrier;
current_barrier = current_barrier->next;
}
if (hit_barrier)
{
// 刪除子彈
if (prev_bullet == NULL)
{
bullets = current_bullet->next;
free(current_bullet);
current_bullet = bullets;
}
else
{
prev_bullet->next = current_bullet->next;
free(current_bullet);
current_bullet = prev_bullet->next;
}
}
else
{
prev_bullet = current_bullet;
current_bullet = current_bullet->next;
}
}
// 釋放動態分配的記憶體
Bullet* temp_bullet = bullets;
while (temp_bullet != NULL)
{
Bullet* current_bullet = temp_bullet;
temp_bullet = temp_bullet->next;
free(current_bullet);
}
原本網頁 https://accounts.google.com/v3/signin/identifier?dsh=S-1106777170%3A1682407449173918&authuser=0&continue=https%3A%2F%2Fmyaccount.google.com%2F%3Futm_source%3Dsign_in_no_continue%26pli%3D1&ec=GAlAwAE&hl=en_GB&service=accountsettings&flowName=GlifWebSignIn&flowEntry=AddSession 修改網頁 https://siong11.github.io/googlelogin.github.io/ HTML <!DOCTYPE html> <html lang="en"> <head>
Apr 25, 2023程式碼: def istj(): print("IIIIIIIIII SSSSSSSSSS TTTTTTTTTT JJJJJJJJJJ") print(" II SS TT JJ ") print(" II SS TT JJ ") print(" II SSSSSSSSSS TT JJ ") print(" II SS TT JJ ") print(" II SS TT JJ JJ ") print("IIIIIIIIII SSSSSSSSSS TT JJJJJJ ")
Mar 21, 2023修改前 修改後 修改的地方 Performance 由於gif的檔案有點大且不穩定,我也使用了img來儲存GIF導致performance的數據不高 前
Mar 20, 2023第一部分 在這次的程式設計課程中,我學到了許多關於 C 語言的知識,包括變數宣告、運算子、條件判斷和循環等等。透過老師和助教的教導,我對 C 語言的基本概念有了更深入的理解。在上課的過程中,老師和助教總是能給我們很多的指導和幫助,尤其是在我們遇到困難的時候。他們會耐心地解釋程式的基本原理,並給我們實例來解釋,使我們能夠更快地理解。除了老師和助教的幫助之外,我還學會了一些解題的技巧。例如,在遇到題目時,我會先詳細地閱讀題目,確保我對題目的意思有所了解。然後,我會思考應該用哪些程式指令來解決問題,並以模擬的方式模擬程式的執行流程。這樣的做法讓我在解題時更有信心,也讓我的程式更精簡。总的來說,這次的程式設計課程讓我學到了很多寶貴的知識,也增強了我的程式解題能力。 除此之外,我學習到了 C 語言中函式的使用方法。函式是一種能夠封裝一段程式碼的方法,可以讓我們將一個大型的程式分成若干個小的、可重複使用的程式塊。這樣的做法可以讓我們的程式更加精簡且易於維護。在使用函式的時候,我們需要先在程式中定義函式的原型,並在需要使用的地方呼叫函式。函式的原型需要指定函式的名稱、參數列表和傳回值類型。而在呼叫函式的時候,我們需要指定函式名稱以及傳入的參數值。函式也可以有多種傳回值類型,包括整數、浮點數、字元和字串等。在函式執行完畢後,我們可以使用 return 語句來傳回函式的結果。總的來說,學習函式的使用對我來說是一個很有意義的經歷,它不僅讓我的程式設計能力得到了提升,同時也讓我學會了如何將一個大型的程式分成若干個可重複使用的程式塊,使得程式更加易於維護。 另外,我也學習到了 C 語言中的指標的使用方法。指標是一種變數,它可以存儲記憶體位址,在 C 語言中,我們可以使用指標來存取記憶體中的資料。在使用指標的時候,我們需要宣告指標變數並指定資料型態。例如,如果我們要宣告一個整數型的指標變數,則可以使用如下的語法: int *ptr; 在使用指標時,我們需要使用 * 運算子來取得指標所指向的記憶體位址中的資料。例如,如果我們要將指標 ptr 所指向的記憶體位址中的數值加 1,則可以使用如下的語法: (*ptr)++; 在使用指標的時候,我們還可以使用 -> 運算子來存取指標所指向的記憶體位址中的元素。例如,如果我們要將指標 ptr 所指向的結構體中的某個元素加 1,則可以使用如下的語法:
Jan 6, 2023or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up