日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

再来一次的C语言贪吃蛇小游戏(一)

發布時間:2025/6/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 再来一次的C语言贪吃蛇小游戏(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0. 寫在開頭

學習編程也有兩三年時間了,中間也玩(學校安排學習)過很多東西 ,從匯編到C到Java和python。用Java和Python也就圖一快,真要體會編程樂趣還得看我C語言(開玩笑 )

為什么要用C語言寫一個貪吃蛇游戲呢,其實這是我大一時候萬姐布置的一個課設,當時就是這個課設,逼著我一個星期“學會了”C語言,但是這段回憶是非常充實有趣的,現在我掌握了新的語言,新的編程思想,回過頭來重新做一遍這個課設,感受編程帶給我的最初的快樂。

貪吃蛇游戲我相信大家都玩過,具體規則也不用我多說,那么直接開始吧!

1. 如何表示一條蛇

那么如何用C語言表示一條蛇呢?倘若使用Java或者Python這種面向對象語言,我們肯定會為蛇創建一個對象,再添加相應的屬性和方法來表示蛇的特征,在C語言中,可以使用結構體來實現相似的功能。

  • 蛇由多節蛇身組成,包括蛇頭也算是蛇身,每個蛇身都是一個結構體,我采用循環雙鏈表來表示一條蛇,之所以使用雙向循環鏈表,是為了每一節蛇身可以指向它的下一節蛇身,也可以指向它的上一節蛇身,同時頭的上一節是尾巴,尾巴的下一節是頭,便于我們遍歷操作。類似于:(隨意配圖,無視苯環)
  • 每一節蛇身有自己的坐標,也有自己運動方向,還有兩個分別指向前一節和后一節的指針
  • 蛇的運動方向,我們假設蛇只能向上下左右四個方向運動。
  • 蛇的運動速度,我們假設蛇可以慢速,正常速,快速三種速度 爪巴
  • 蛇的長度,我們記錄在蛇的結構體內

2. 具體實現

snake.h頭文件中部分內容:

typedef enum direction {up,right,down,left }Direction;typedef enum speed {slow,normal,fast, }Speed;//環狀雙向鏈表 typedef struct snake_body_node {int pos_x;int pos_y;Direction dir;struct snake_body_node *previous_node;struct snake_body_node *next_node; }Snake_Body_Node;typedef struct snake {int length;Speed speed;Snake_Body_Node *head; }Snake;

3. 蛇的行為

定義了蛇的表示,那么蛇有哪些行為需要我們實現呢?

毫無疑問,在游戲中,我們要在地圖上生成一條蛇,那么一個生成蛇的方法肯定少不了,于是有了

Snake *new_born_snake(int pos_x, int pos_y);

參數pos_x,pox_y分別表示最初蛇的位置,這里我將蛇最初的長度設為1,相當于就一腦袋

蛇肯定要移動,蛇在移動的時候,直觀上蛇身的全部節點都要移動,但實際則不然,只有兩節蛇身是需要變化的,一節是腦袋,一節是蛇尾,其余的蛇身移動的位置其實都是其上一個蛇身移動前的位置,那么我們可以不管這些節點,我們需要做的就是新建一個蛇頭,去掉蛇尾。

void add_head_node(Snake* snake, int pos_x, int pos_y); void remove_tail_node(Snake* snake); void move(Snake* snake, Direction dir, int pos_x, int pos_y); void eat(Snake* snake, Direction dir, int pos_x, int pos_y);

蛇吃到食物需要生長,我們就假設食物的位置變為一節蛇身(蛇頭),尾巴不去掉,那么用上面add_head_node方法同樣可以實現。

4. 具體實現

snake.c

#include "snake.h"struct snake * new_born_snake(int pos_x, int pos_y) {Snake* new_snake = (Snake*)malloc(sizeof(Snake));Snake_Body_Node *head = mknode();new_snake->length = 1;new_snake->speed = normal;head->dir = up;head->pos_x = pos_x;head->pos_y = pos_y;new_snake->head = head;head->next_node = head;head->previous_node = head;return new_snake; }void add_head_node(Snake* snake, int pos_x, int pos_y) {Snake_Body_Node *head = snake->head;Snake_Body_Node *body = mknode();body->pos_x = pos_x;body->pos_y = pos_y;body->dir = head->dir;body->previous_node = head->previous_node;head->previous_node->next_node = body;head->previous_node = body;body->next_node = head;snake->head = body;snake->length++; }void remove_tail_node(Snake* snake) {Snake_Body_Node *head = snake->head;Snake_Body_Node *tail = head->previous_node;head->previous_node = tail->previous_node;tail->previous_node->next_node = head;free(tail);snake->length--; }void destroy_snake(Snake* snake) {Snake_Body_Node* head = snake->head;while (head != head->next_node) {free(head);head = head->next_node;}free(head);free(snake); }Snake_Body_Node* mknode() {Snake_Body_Node* node = (Snake_Body_Node*)malloc(sizeof(Snake_Body_Node));if (node == NULL){printf("out of memory");exit(1);}return node; }void move(Snake* snake, Direction dir, int pos_x, int pos_y) {Sleep(700 - snake->speed * 300);snake->head->dir = dir;add_head_node(snake, pos_x , pos_y);remove_tail_node(snake); }void eat(Snake* snake, Direction dir, int pos_x, int pos_y) {Sleep(700 - snake->speed * 300);snake->head->dir = dir;add_head_node(snake, pos_x, pos_y); }

5. 在游戲中控制蛇,下篇揭曉。。。。。

一下篇鏈接

總結

以上是生活随笔為你收集整理的再来一次的C语言贪吃蛇小游戏(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。