个人大一下课程设计作品,本文中直接附上源代码(通过visual stdio 2019 实现 ):
课题:贪吃蛇(链表实现~)
语言:C/C++
运行环境(软件):Visual Stdio 2019(以下统一简称“vs2019”)
作者(CSDN账户名):zzzzzyl_C_Py_Ja
前言:
我大一下做课设的时候选的是贪吃蛇项目,且是根据链表实现的。
当时课设的要求大概是这个样子:
做这次课设时的历程与感慨:
当时,在CSDN上搜了资源,找了好多都好难找到完美的(不是各种各样的bug就是甚至连运行都运行不了,很无奈),很能体会到当时的无助。所以现在我做完课设了,将它分享与大家,希望能帮助更多的人,也能丰富网络上、CSDN上的这方面(贪吃蛇_C语言~_链表实现)的资源。全文大家都可以适度地参考借鉴一下,现发诸此处:
代码:
我在这一共发布了三个版本的代码,分别是:
1-代码(代码一)
基本核心功能代码~(共222行)(新手可先学这里) ):
只实现了贪吃蛇游戏最基本最核心的功能,新手建议先学这里!
(注:不做文件分区,大家直接复制到自己vs2019版的某cpp后缀文件中即可了)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<Windows.h>
#include<conio.h>//键盘~! *.
#include<iostream>
#define OK 1
int shechang = 4;
int flag = 4;
int xbianhua = 2, ybianhua = 0;
int shijian = 100;
typedef struct LNode
{
int x;
int y;
struct LNode* next;
}LNode, * LinkList;
LNode* tou, * wei, * jie, * daoshudier, * shiwu, * bianli;
#define boardwidth 112
#define boardlength 36//黄金比:长等于宽乘以0.618~(再乘2~)
#define windowlength 45
#define windowwidth 160
int main();
void zuobiao(int x, int y);
void jianpan();
void movesnake();
void xinshiwu();
//void color(int ~);
void zuobiao(int x, int y)
{
COORD pos;//注意:0是开始!亦占一格
pos.X = x;//x的值为y~两倍 z.
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void drawmap()
{
system("mode con cols=160 lines=45");//左须为右之两倍
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
}
int initsnake()
{
int i;
wei = new LNode;//龘龘龘
wei->x = boardwidth / 2 - 4;
wei->y = boardlength / 2;
wei->next = NULL;
zuobiao(wei->x, wei->y);
printf("■");
wei->next = NULL;//~ !
for (i = 1; i < shechang; i++)
{
tou = new LNode;
tou->next = wei;
tou->x = boardwidth / 2 - 4 + 2 * i; //!!!!!!!!!!!!!!!!!!!!!!!!
tou->y = boardlength / 2;
zuobiao(tou->x, tou->y);
printf("■");
wei = tou;
}
wei = wei->next->next->next;//ok了~(一共为5个节~!ww *.z 后己又~:还是为4个 !以便于后面snakemove的时候“free(wei->next)”-方便!z.
xinshiwu();
return OK;
}
void xinshiwu()
{
shiwu = new LNode;
shiwu->x = rand() % 108;
shiwu->y = rand() % 36;
shiwu->next = NULL;
if (shiwu->x % 2 != 0 || shiwu->x == 0 || shiwu->y == 0)
{
free(shiwu);
xinshiwu();
}
zuobiao(shiwu->x, shiwu->y);
printf("●");
}
void jianpan()
{
while (1)
{
char ch;
if (_kbhit())
{
ch = _getch();
ch = _getch();
/*极特殊↑↑↑之发现:在此处多(再~.)加一个“(ch=_getch())”可以修复好之前“按一下方向键蛇会动两格(而非正常的一格~)”的bug!而且,还可以空格控制进程的暂停或继续 !surprise,but why!? .*/
/*↑↑↑ ???? *~!. */// ********!!!!!!.
if (ch == 80 && flag != 1) flag = 2;
if (ch == 72 && flag != 2/*nice~ !*/) flag = 1;//* !
if (ch == 75 && flag != 4) flag = 3;
if (ch == 77 && flag != 3) flag = 4;
if (ch == 59 && shijian <= 225)
{
shijian += 25;//F1减速
}
if (ch == 60 && shijian >= 75)
{
shijian -= 25;//F2减速
}
else if (ch == 62)
{
printf("您退出了游戏!");
exit(0);//F4退出游戏
}
}
Sleep(shijian);//!!!!!新变量(#define shijian 300)
movesnake();
if (tou->x == boardwidth || tou->y == boardlength || tou->x == 0 || tou->y == 0)exit(0);//龘 是处exit(0)待改~ .
jie = new LNode;
jie = tou;
while (jie->next != NULL)
{
jie = jie->next;
if (tou->x == jie->x && tou->y == jie->y)
{
zuobiao(boardwidth, boardwidth); exit(0);
}
}
}
}
void movesnake()
{
switch (flag)
{
case 1:xbianhua = 0, ybianhua = -1; break;
case 2:xbianhua = 0, ybianhua = 1; break;
case 3:xbianhua = -2, ybianhua = 0; break;
case 4:xbianhua = 2, ybianhua = 0; break;
}
LNode* xin;
//龘
xin = new LNode;
xin->x = xbianhua + tou->x;//后可改~ !
xin->y = ybianhua + tou->y;
xin->next = tou;
zuobiao(xin->x, xin->y); printf("■");
tou = xin;
//if(food()==1) !!!!!!!
if (shiwu->x == tou->x && shiwu->y == tou->y)
{
free(shiwu);
xinshiwu();
}
else
{
LNode* daoshudier;
daoshudier = new LNode;
daoshudier = tou;
while (daoshudier->next->next != NULL)
{
daoshudier = daoshudier->next;
}
zuobiao(daoshudier->next->x, daoshudier->next->y); printf(" ");
free(daoshudier->next);
daoshudier->next = NULL;
}
}
int main()
{
system("mode con cols=160 lines=45");//左须为右之两倍
drawmap();
initsnake();
jianpan();
movesnake();
zuobiao(boardwidth, boardlength + 1);
return 0;
}
2-代码(代码二)
无排行榜功能(共1726行)
这里我除了最基本的贪吃蛇普通模式之外,还开发了另外三种模式,另外加上了游戏说明和游戏界面右端规则、分数、成就显示等功能,大家可以适度地参考借鉴一下。
(注:不做文件分区,大家直接复制到自己vs2019版的某cpp后缀文件中即可了)
#pragma once
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>//链表~
#include<Windows.h>//窗口~ .
#include<conio.h>//键盘~! *.
#define OK 1
#define dituheng 108
#define ditushu 36
#define zongheng 160
#define zongshu 45
int shechang = 4;
int flag = 4;
int xbianhua = 2, ybianhua = 0;
int shijian=100;
int caidanflag = 0;
int i, j;
int fenshu = 0;
int fenshubianhua = 10;
int sududengji = 3;//??
typedef struct LNode
{
int x;
int y;
struct LNode* next;
}LNode, * LinkList;//LinkList:???(这里引用了大一上下两本教材书上关于链表创建的源码~)
LNode* tou, * wei, * jie, * daoshudisan, * daoshudier, * shiwu, * duyao, * duyao2, * bianli;//头,尾,结,倒数第三,倒数第二,食物,毒药1,毒药2,遍历
//黄金比:长等于宽乘以0.618~(再乘2~)
int main();
void zuobiao(int x, int y);
int color(int num);
void caidan();
void shuoming();
void youbianshuoming();
//void color(int ~);
//————————————————————————————————
void xinditu1();
int xinshe1();
void xinshiwu1();
void jianpan1();
void sheyidong1();
//————————————————————————————————
void xinditu2();
int xinshe2();
void xinshiwu2();
void jianpan2();
void sheyidong2();
//————————————————————————————————
void xinditu3();
int xinshe3();
void xinshiwu3();
void jianpan3();
void sheyidong3();
//————————————————————————————————
void xinditu4();
int xinshe4();
void xinshiwu4();
void jianpan4();
void sheyidong4();
//————————————————————————————————、
void zuobiao(int x, int y)
{
COORD pos;//注意:0是开始!亦占一格
pos.X = x;//x的值为y~两倍 z.
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
int color(int num)//https://blog.csdn.net/weixin_43118073/article/details/102531970 ~ .
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), num);
return 0;
}
void xinditu1()
{
system("mode con cols=160 lines=45");//左须为右之两倍
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n"); xinshe1();
}
int xinshe1()
{
int i;
wei = new LNode;
wei->x = dituheng / 2 - 4;
wei->y = ditushu / 2;
wei->next = NULL;
zuobiao(wei->x, wei->y);
color(11);//
printf("■");
wei->next = NULL;//~ !
for (i = 1; i < shechang; i++)
{
tou = new LNode;
tou->next = wei;
tou->x = dituheng / 2 - 4 + 2 * i;
tou->y = ditushu / 2;
zuobiao(tou->x, tou->y);
color(11);//
printf("■");
wei = tou;
}
zuobiao(tou->x, tou->y);
color(12);//
printf("■");//
color(15);//
wei = wei->next->next->next;//ok了~(一共为5个节~!ww *.z 后己又~:还是为4个 !以便于后面snakemove的时候“free(wei->next)”-方便!z.
xinshiwu1();
return OK;
}
void xinshiwu1()
{
shiwu = new LNode;
shiwu->x = rand() % 108;
shiwu->y = rand() % 36;
shiwu->next = NULL;
if (shiwu->x % 2 != 0||shiwu->x==0||shiwu->y==0)
{
free(shiwu);
xinshiwu1();
}
jie = new LNode;
jie = tou;
while (jie->next != NULL)
{
jie = jie->next;
if (shiwu->x == jie->x && shiwu->y == jie->y)
{
free(shiwu);
xinshiwu1();
}
}
zuobiao(shiwu->x, shiwu->y);
color(14);printf("●");color(15);
}
void jianpan1()
{
flag=4;
shijian = 100;
fenshu = 0;//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
fenshubianhua = 10;
while (1)
{
youbianshuoming();//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
char ch;
if (_kbhit())
{
ch = _getch();
ch = _getch();
if (ch == 80 && flag != 1)
{
flag = 2;
}
if (ch == 72 && flag != 2/*nice~ !*/)
{
flag = 1;
}
if (ch == 75 && flag != 4)
{
flag = 3;
}
if (ch == 77 && flag != 3)
{
flag=4;//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
}
if (ch == 59 && shijian <160)//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
{
shijian += 30; sududengji -= 1; fenshubianhua -= 2;//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
}
if (ch == 60 &&shijian>40)//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
{
shijian -= 30; sududengji += 1; fenshubianhua += 2;//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥九点
}
else if (ch == 62)
{
system("cls");
zuobiao(zongheng/2-12,zongshu/2-8);color(12);printf("游戏结束!");
zuobiao(zongheng / 2 - 28, zongshu / 2 - 6);
color(11);
Sleep(200);
printf("请进行选择: 1、重新进行游戏; 2、退出游戏!");
zuobiao(zongheng / 2 - 10, zongshu / 2 - 4);
color(15);
int jieshuflag = 0;
scanf_s("%d", &jieshuflag);
if (jieshuflag == 1)
{
caidan();
}
else if (jieshuflag == 2)
{
exit(0);
}
}
}
Sleep(shijian );//!!!!!新变量(#define shijian 300)
sheyidong1();
if (tou->x == dituheng || tou->y == ditushu|| tou->x == 0 || tou->y == 0)
{
system("cls");
zuobiao(zongheng/2-12,zongshu/2-8);color(12);printf("游戏结束!");
zuobiao(zongheng / 2 - 28, zongshu / 2 - 6);
color(11);
Sleep(200);
printf("请进行选择: 1、重新进行游戏; 2、退出游戏!");
zuobiao(zongheng / 2 - 10, zongshu / 2 - 4);
color(15);
int jieshuflag = 0;
scanf_s("%d", &jieshuflag);
if (jieshuflag == 1)
{
caidan();
}
else if (jieshuflag == 2)
{
exit(0);
}
}
jie = new LNode;
jie = tou;
while (jie->next != NULL)
{
jie = jie->next;
if (tou->x == jie->x && tou->y == jie->y)
{
zuobiao(dituheng, dituheng);
system("cls");
zuobiao(zongheng/2-12,zongshu/2-8);color(12);printf("游戏结束!");
zuobiao(zongheng / 2 - 28, zongshu / 2 - 6);
color(11);
Sleep(200);
printf("请进行选择: 1、重新进行游戏; 2、退出游戏!");
zuobiao(zongheng / 2 - 10, zongshu / 2 - 4);
color(15);
int jieshuflag = 0;
scanf_s("%d", &jieshuflag);
if (jieshuflag == 1)
{
caidan();
}
else if (jieshuflag == 2)
{
exit(0);
}
}
}
}
}
void sheyidong1()
{
switch (flag)
{
case 1:xbianhua = 0, ybianhua = -1; break;
case 2:xbianhua = 0, ybianhua = 1; break;
case 3:xbianhua = -2, ybianhua = 0; break;
case 4:xbianhua = 2, ybianhua = 0; break;
}
//12点!!!!!!!!!!!!!!!!!!!!!
zuobiao(tou->x, tou->y);
color(11);
printf("■");
color(12);
//12点!!!!!!!!!!!!!!!!!!!!!!!!
LNode* xin;
xin = new LNode;
xin->x = xbianhua+tou->x;//后可改~ !
xin->y = ybianhua+tou->y;
xin->next = tou;
zuobiao(xin->x, xin->y); printf("■");
tou = xin;
if (shiwu->x == tou->x && shiwu->y == tou->y)
{
free(shiwu);
xinshiwu1();
fenshu+=fenshubianhua;//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
}
else
{
LNode* daoshudier;
daoshudier = new LNode;
daoshudier = tou;
while (daoshudier->next->next != NULL)
{
daoshudier = daoshudier->next;
}
zuobiao(daoshudier->next->x, daoshudier->next->y);
printf(" ");
free(daoshudier->next);
daoshudier->next = NULL;
}
}
//————————————————————————————————————————————
void xinditu2()
{
system("mode con cols=160 lines=45");//左须为右之两倍
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
for (i = 2; i <= dituheng - 2; i++)
{
for (j = 1; j <= ditushu - 1; j++)
{
if (i % 8 == 0 && j % 4 == 0)/******* ****!!!!****/
{
zuobiao(i, j);
color(4);printf("▲");color(7);
}
}
}
xinshe2();
}
int xinshe2()
{
int i;
wei = new LNode;//龘龘龘
wei->x = dituheng / 2 - 4;
wei->y = ditushu / 2;
wei->next = NULL;
zuobiao(wei->x, wei->y);
color(11);
printf("■");
wei->next = NULL;//~ !
for (i = 1; i < shechang; i++)
{
tou = new LNode;
tou->next = wei;
tou->x = dituheng / 2 - 4 + 2 * i; //!!!!!!!!!!!!!!!!!!!!!!!!
tou->y = ditushu / 2;
zuobiao(tou->x, tou->y);
color(11);
printf("■");
wei = tou;
}
zuobiao(tou->x, tou->y);
color(12);//
printf("■");//
color(15);//
wei = wei->next->next->next;//ok了~(一共为5个节~!ww *.z 后己又~:还是为4个 !以便于后面snakemove的时候“free(wei->next)”-方便!z.
xinshiwu2();
return OK;
}
void xinshiwu2()
{
shiwu = new LNode;
shiwu->x = rand() % 108;
shiwu->y = rand() % 36;
shiwu->next = NULL;
if (shiwu->x % 2 != 0 || shiwu->x == 0 || shiwu->y == 0)
{
free(shiwu);
xinshiwu2();
}
if (shiwu->x % 8 == 0&& shiwu->y % 4 == 0)
{
free(shiwu);
xinshiwu2();
}
jie = new LNode;
jie = tou;
while (jie->next != NULL)
{
jie = jie->next;
if (shiwu->x == jie->x && shiwu->y == jie->y)
{
free(shiwu);
xinshiwu2();
}
}
zuobiao(shiwu->x, shiwu->y);
color(14);printf("●");color(15);
}
void jianpan2()
{
flag=4;
shijian = 100;
fenshu = 0;
fenshubianhua = 10;
while (1)
{
youbianshuoming();
char ch;
if (_kbhit())
{
ch = _getch();
ch = _getch();
/*极特殊↑↑↑之发现:在此处多(再~.)加一个“(ch=_getch())”可以修复好之前“按一下方向键蛇会动两格(而非正常的一格~)”的bug!而且,还可以空格控制进程的暂停或继续 !surprise,but why!? .*/
/*↑↑↑ ???? *~!. */// ********!!!!!!.
if (ch == 80 && flag != 1)
{
flag = 2;
}
if (ch == 72 && flag != 2/*nice~ !*/)
{
flag = 1;//* !
}
if (ch == 75 && flag != 4)
{
flag = 3;
}
if (ch == 77 && flag != 3)
{
flag = 4;//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
}
if (ch == 59 && shijian < 160)//¥¥¥¥¥¥&