用連結串列做控制檯下的貪吃蛇小遊戲
本人大一學了C語言後的課程設計:
以下是大體流程圖:
這是我的執行程式碼:
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
#define X15//地圖長
#define Y10//地圖寬
/* 引用函式
system("cls");刷屏
kbhit()若有鍵盤輸入返回非0
Sleep();使程式停頓 sleep函式和kbhit函式結合起來就可以實現鍵盤輸入改變蛇方向,否則蛇繼續執行的作用
HANDLEhOut; 控制游標位置
COORD pos={0,2}; /* 游標的起始位(第1列,第3行) 0是第1列 2是第3行0
hOut =GetStdHandle(STD_OUTPUT_HANDLE); 通過改變COORD pos 的座標就可以自如的控制游標位置,非常好用
SetConsoleCursorPosition(hOut,pos);
*/
int Welcome(void);//使用者歡迎介面
void Map_border(int,int);//定義地圖邊境
int Death(struct Snake *);//判斷蛇是否死亡
void Body(struct Snake *);//顯示蛇形
void Move(struct Snake *,char,struct Food *);//移動每個節點
void food(struct Food*);//顯示食物
void Del_node(struct Snake *head);//清除連結串列
void End(void);//顯示結束介面
struct Snake{
int x;
int y;
char direction;
Snake *next;
};//定義蛇節點
struct Food{
int x;
int y;
};
int len=sizeof(struct Snake);
int score;//所吃食物個數
int main()
{
HANDLE hOut;//游標的起始位(第1列,第1行) 0是第1列 2是第3行0
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
srand((unsigned)time(NULL));//產生隨機數以便產生食物和蛇頭
char choice;
char s='N';
struct Snake *head;
struct Food *F;
int speed;//遊戲速度
speed=Welcome()*100;
do
{
s='N';
score=0;
F=(struct Food*)malloc(sizeof(struct Food));
head=(struct Snake*)malloc(len);
head->x=rand()%X;
head->y=rand()%Y;
head->direction='e';
head->next=NULL;//初始化蛇頭
do
{
F->x=rand()%X;
F->y=rand()%Y;//初始化食物
}while((F->x==0)||(F->y==0)||(F->x==X-1)||(F->y==Y-1));
while(Death(head)!=0)//判斷死亡沒有
{
choice='\0';
Map_border(X,Y);//顯示地圖
Body(head);//顯示蛇身
food(F);//顯示食物
COORD pos={(head->x)*2,head->y};
SetConsoleCursorPosition(hOut,pos);
printf("⊙");//再次顯示蛇頭
Sleep(speed);//停頓程式
if(kbhit())//等待鍵盤輸入
{
choice=getch();
printf("\b");
}
system("cls");//清屏
Move(head,choice,F);//移動和增加節點
}
End();
Del_node(head);//清除蛇連結串列
free(F);//清除食物記憶體
s=getchar();
}while(s=='Y');//判斷是否重新開始
return 0;
}
void Map_border(int x,int y)//定義地圖邊境
{
int i,j;
for(i=0;i<y;i++)
{
printf("■");
if(i==0||i==y-1)
for(j=1;j<x-1;j++)
{printf("■");}
else
for(j=1;j<x-1;j++)
{printf(" ");}
printf("■\n");
}
return;
}
int Death(struct Snake *head)//判斷蛇是否死亡
{
struct Snake *ptr;
if(head->x==X-1||head->y==Y-1||head->x==0||head->y==0)//不超界
return 0;
for(ptr=head->next;ptr!=NULL;ptr=ptr->next)
{
if((head->x==ptr->x)&&(head->y==ptr->y))//蛇頭不咬身子
return 0;
}
return 1;
}
void Move(struct Snake *head,char choice,struct Food *F)//移動每個節點
{
int x,m;
int y,n;
struct Snake *p,*ptr;
struct Snake *last=NULL;
ptr=head;
x=head->x;
y=head->y;
if((F->x==head->x)&&(F->y==head->y))//如果吃到食物增加節點
{
score+=1;
last=(struct Snake*)malloc(len);
do
{
F->x=rand()%X;
F->y=rand()%Y;
}while((F->x==0)||(F->y==0)||(F->x==X-1)||(F->y==Y-1));
last->next=NULL;
}
if(choice=='w'||choice=='a'||choice=='s'||choice=='d')
head->direction=choice;//改變蛇頭方向
switch(head->direction)//移動頭節點
{
case 'w':head->y=head->y-1;break;
case 's':head->y=head->y+1;break;
case 'a':head->x=head->x-1;break;
case 'd':head->x=head->x+1;break;
}
for(p=head->next;p!=NULL;p=p->next)//頭節點以後的每個節點繼承上一個節點的座標
{
m=p->x;
n=p->y;
p->x=x;
p->y=y;
x=m;
y=n;
ptr=p;
}
if(last!=NULL)//吃到食物後增加的節點繼承上個狀態的尾節點座標
{
ptr->next=last;
last->x=x;
last->y=y;
}
return;
}
void food(struct Food *F)//根據食物座標顯示食物
{
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos= {(F->x)*2,F->y};
SetConsoleCursorPosition(hOut, pos);
printf("ff");
return;
}
void Body(struct Snake *head)//根據蛇每個節點座標顯示蛇身
{
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
struct Snake *p;
for(p=head->next;p!=NULL;p=p->next)
{
COORD pos={(p->x)*2,p->y};
SetConsoleCursorPosition(hOut,pos);
printf("□");
}
return;
}
void Del_node(struct Snake *head)//清除連結串列
{
struct Snake *p1,*p2;
p2=head;
for(p1=head->next;p1!=NULL;p1=p1->next)
{
free(p2);
p2=p1;
}
return;
}
void End(void)//顯示積分
{
printf("**********************************************\n");
printf("* *\n");
printf("* *\n");
printf("* Game Over *\n");
printf("* Your score is %d *\n",score);
printf("* *\n");
printf("* enter Y play again *\n");
printf("* else enter any key *\n");
printf("* *\n");
printf("* *\n");
printf("* *\n");
printf("* *\n");
printf("**********************************************\n");
}
int Welcome(void)//顯示歡迎介面
{
int sum;
printf("**********************************************\n");
printf("* *\n");
printf("* *\n");
printf("* 歡迎使用貪吃蛇遊戲 *\n");
printf("* *\n");
printf("* *\n");
printf("* W鍵:上 S鍵:下 *\n");
printf("* A鍵:左 D鍵:右 *\n");
printf("* *\n");
printf("* *\n");
printf("* 選擇遊戲速度後開始遊戲 *\n");
printf("* 1~3:困難 4~7:中等 7~10:緩慢 *\n");
printf("**********************************************\n");
scanf("%d",&sum);
getchar();
return sum;
}
這是遊戲執行的圖文:
請大家廣泛留言哈!嘻嘻~~~~~~
相關推薦
用連結串列做控制檯下的貪吃蛇小遊戲
本人大一學了C語言後的課程設計: 以下是大體流程圖: 這是我的執行程式碼: #include<stdio.h> #include<windows.h> #include&
PTA 兩個有序連結串列序列的交集 (很簡單 不是用連結串列做的)
兩個有序連結串列序列的交集 (20 分) 已知兩個非降序連結串列序列S1與S2,設計函式構造出S1與S2的交集新連結串列S3。 輸入格式: 輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用−1表示序列的結尾(−1不屬於這個序列)。數字用空格間隔。 輸出格式:
JavaScript做貪吃蛇小遊戲
<body> <h1 >貪吃蛇</h1> <h2 id="score">0</h2>
用arduino編寫貪吃蛇小遊戲(完整程式碼)
用arduino編寫貪吃蛇小遊戲 裡面有大量的程式碼註釋,希望能真的幫助到電子愛好者。 工具 : 硬體:arduino UNO 、搖桿模組(控制貪吃蛇前後左右移動、 OLED 螢幕 軟體:arduino IDE1.8.2版本(基本上大於1.6版本,就能使用) 咱
如何用python做一個貪吃蛇小遊戲並給遊戲加上背景音樂(pygame的應用)
匯入模組 import pygame import sys import time import random from pygame.locals import * 定義顏色變數 redColour = pygame.Color(255, 0, 0) bla
c++經典專案控制檯貪吃蛇小遊戲詳細教程
貪吃蛇GreedySnake 本文將講解如何使用c++面向物件方法編寫控制檯版貪吃蛇小遊戲,專案github地址:silence1772/GreedySnake 遊戲下載:GreedySnake 本人屬初學者,水平所限,難免有所錯誤及不妥之處,勞請指出或發
用Java寫貪吃蛇小遊戲
1 package snake; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.event.ActionEvent; 7 impor
c語言控制檯的一個貪吃蛇小遊戲
#include<stdio.h> #include<Windows.h> #include<conio.h> #include<stdlib.h> #include<time.h> #define HEAD 1
C++控制檯貪吃蛇小遊戲詳細教程
遊戲截圖 開始動畫: 遊戲過程: 遊戲架構設計 該遊戲的玩法簡單,玩家通過鍵盤方向鍵控制蛇上下左右移動,吃到食物得分並增長,碰到牆或者自己的身體則死亡,遊戲結束。 整個遊戲其實就是一個無窮的迴圈,直到退出遊戲時退出迴圈
js-->貪吃蛇小遊戲,能成功玩
function 小遊戲 absolute images 貪吃蛇 <!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>貪吃蛇小遊戲</tit
使用前端原生 js,貪吃蛇小遊戲
oct 新的 生成 方便 描述 logs turn asc 轉動 好久好久,真的是好久好久沒來寫過了,因為最近有點小忙。不過即使是忙,也也還是寫了兩個小遊戲,其中一個就是這個,貪吃蛇啦。 算是一個小練手了,這個是在有點太簡單了,只是第一次寫這種小遊戲,還是零零星星花了三
貪吃蛇小遊戲
C/C++MOVE__BOX部分:代碼如下#include<iostream>#include<Windows.h>#include <conio.h>using namespace std;void PutPlace(int x,int y);//設定輸出位置void c
JS貪吃蛇小遊戲
ttr etime opened IE title 跨瀏覽器 tac 再次 key 效果圖展示: 具體實現代碼如下: (1)html部分 1 !DOCTYPE html> 2 <html> 3 <head> 4
Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述
otl bject vid oid 小遊戲 同時 們的 http 畫布 Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述 Overview 本章的主要的內容是貪吃蛇小遊戲的分析和實現,關於實現的具體代碼可以在,文章底部的github的鏈接中找到。 整個遊戲通過
Java實現貪吃蛇小遊戲(附完整原始碼)
今天我就從零開始來完成這個小遊戲,完成的方式也是一步一步的新增功能這樣的方式來實現。 第一步完成的功能:寫一個介面 大家見到的貪吃蛇小遊戲,介面肯定是少不了的。因此,第一步就是寫一個小介面。 實現程式碼如下: 第二步完成的功能:在介面上畫成一格一格的 我們見過的貪吃蛇遊戲
C語言編寫貪吃蛇小遊戲
**遊戲結構** 1.知道怎麼控制終端上游標的位置。 #include<stdio.h> #inc
js貪吃蛇小遊戲(相容ie8)DOM,BOM操作
效果圖 本篇將使用JavaScript 編寫一個貪吃蛇的小遊戲,採用OOP(面向物件)程式設計 基本沒有CSS樣式和HTML結構,主要是體會js操作 HTML程式碼 <div class="map"></div> &
java 貪吃蛇小遊戲效果圖加原始碼
今天寫了一個貪吃蛇的小遊戲用來練手,在流程控制方面也沒有封裝方法進行簡化,不過作為鍛鍊流程控制是很好的。 下面附上自己的原始碼 package com.oracle; import java.awt.Graphics; import java.awt.Image
使用opengl製作簡易貪吃蛇小遊戲
#include<iostream> #include<algorithm> #include<functional> #include<cstdlib> #include<cstdio> #include<g
好玩的貪吃蛇小遊戲,有趣極了!
(function ($) { $.fn.game1 = function (options) { var mainDiv = $(this); var defaults = { speed:150,//速度 leftSteps:50, topSteps:30 }; var opts = $.extend(d