(整理)如何用C语言编写小游戏.

合集下载

C语言实现简单扫雷小游戏

C语言实现简单扫雷小游戏

C语⾔实现简单扫雷⼩游戏本⽂实例为⼤家分享了C语⾔实现扫雷⼩游戏的具体代码,供⼤家参考,具体内容如下#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <windows.h>#include <time.h>/*⽤ C 语⾔写⼀个简单的扫雷游戏*/// 1.写⼀个游戏菜单 Menu()// 2.开始游戏// 1.初始化⼆维数组 Init_Interface()// 2.打印游戏界⾯ Print_Interface()// 3.玩家掀起指定位置 Play() --> 指定输⼊坐标(判断合法性)// 1.判断该位置是否是雷// 2.判断是否掀掉所有空地// 3.如果掀开的是空地,则判断该空地周围是否有雷// 1.如果周围有雷,则统计周围雷的个数// 2.如果周围没有雷,则掀开周围除了雷的所有空地,并且统计所掀开空地周围雷的个数// 4.更新地图// 5.继续 3 的循环//定义全局变量://定义扫雷地图的长和宽#define MAX_ROW 9#define MAX_COL 9//定义默认的雷数#define DEFAULT_MINE 9//定义两个⼆维数组,分别存放初始地图和雷阵char show_map[MAX_ROW + 2][MAX_COL + 2];char mine_map[MAX_ROW + 2][MAX_COL + 2];//写⼀个游戏菜单int Menu() {printf("=========\n");printf("1.开始游戏\n");printf("0.结束游戏\n");printf("=========\n");printf("请选择游戏菜单选项:");int choice = 0;while (1) {scanf("%d", &choice);if (choice != 0 && choice != 1) {printf("您的输⼊有误, 请重新输⼊\n");continue;}break;}return choice;}//开始游戏//初始化数组void Init_Interface() {for (int row = 0; row < MAX_ROW + 2; row++) {for (int col = 0; col < MAX_COL + 2; col++) {show_map[row][col] = '*';}}for (int row = 0; row < MAX_ROW + 2; row++) {for (int col = 0; col < MAX_COL + 2; col++) {mine_map[row][col] = '0';}}int mine_count = DEFAULT_MINE;while (mine_count > 0) {int row = rand() % MAX_ROW + 1;int col = rand() % MAX_COL + 1;if (mine_map[row][col] == '1') { //将雷设置为 1//此处已经有雷continue;}mine_count--;mine_map[row][col] = '1';}}//打印初始界⾯void Print_Interface(char map[MAX_ROW + 2][MAX_COL + 2]) {printf(" ");for (int col = 1; col <= MAX_COL; col++) {printf("%d ", col);}printf("\n ");for (int col = 1; col <= MAX_COL; col++) {printf("--");}printf("\n");for (int row = 1; row <= MAX_ROW ; row++) {printf("%02d |", row);for (int col = 1; col <= MAX_COL; col++) {printf("%c ", map[row][col]);}printf("\n");}}//写⼀个统计周围雷数个数的函数int Around_Mine_count(int row, int col) {return (mine_map[row - 1][col - 1] - '0'+ mine_map[row - 1][col] - '0'+ mine_map[row - 1][col + 1] - '0'+ mine_map[row][col - 1] - '0'+ mine_map[row][col + 1] - '0'+ mine_map[row + 1][col - 1] - '0'+ mine_map[row + 1][col] - '0'+ mine_map[row + 1][col + 1] - '0');}//写⼀个判断该位置周围是否有雷的函数int No_Mine(int row, int col) {if (Around_Mine_count(row, col) == 0) {return 1;}return 0;}//写⼀个掀开该位置周围空地的函数void Open_Blank(int row, int col) {show_map[row - 1][col - 1] = '0' + Around_Mine_count(row - 1, col - 1); show_map[row - 1][col] = '0' + Around_Mine_count(row - 1, col);show_map[row - 1][col + 1] = '0' + Around_Mine_count(row - 1, col + 1); show_map[row][col - 1] = '0' + Around_Mine_count(row, col - 1);show_map[row][col + 1] = '0' + Around_Mine_count(row, col + 1);show_map[row + 1][col - 1] = '0' + Around_Mine_count(row + 1, col - 1); show_map[row + 1][col] = '0' + Around_Mine_count(row + 1, col);show_map[row + 1][col + 1] = '0' + Around_Mine_count(row + 1, col + 1); }//写⼀个判断游戏结束的函数int Success_Sweep(char show_map[MAX_ROW + 2][MAX_COL + 2]) { int count = 0;for (int row = 1; row <= MAX_ROW; row++) {for (int col = 1; col <= MAX_COL; col++) {if (show_map[row][col] == '*') {count++;}}}if (count == DEFAULT_MINE) {return 1;}return 0;}//开始游戏void StartGame() {while (1) {printf("请输⼊您要掀开的坐标:");int row = 0;int col = 0;while (1) {scanf("%d %d", &row, &col);if (row < 1 || row > MAX_ROW || col < 1 || col > MAX_COL) {printf("您的输⼊有误,请重新输⼊!\n");continue;}if (show_map[row][col] != '*') {printf("该位置已被掀开,请重新选择\n");continue;}break;}//判断该地⽅是否有雷if (mine_map[row][col] == '1') {Print_Interface(mine_map);printf("该地⽅有雷,游戏结束\n");break;}if (No_Mine(row, col)) {show_map[row][col] = '0';Open_Blank(row, col);}show_map[row][col] = '0' + Around_Mine_count(row, col);//判断是否掀开所有空地if (Success_Sweep(show_map) == 1) {Print_Interface(mine_map);printf("您已成功扫雷\n");break;}system("cls");//更新地图Print_Interface(show_map);}}int main() {if (Menu() == 0) {exit(0);}srand((unsigned int)time(NULL));Init_Interface();Print_Interface(show_map);StartGame();system("pause");return 0;}效果图:数字代表周围雷的个数以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

用C和SFML制作迷宫小游戏

用C和SFML制作迷宫小游戏

用C和SFML制作迷宫小游戏迷宫小游戏制作指南迷宫小游戏是一种经典的游戏类型,以其挑战性和趣味性而备受玩家喜爱。

这里将介绍使用C语言和SFML库来制作迷宫小游戏的步骤。

一、概述迷宫小游戏的基本原理是玩家通过键盘操作控制角色在迷宫中寻找出口。

玩家可以使用方向键或WASD键控制角色的移动,并避开迷宫中的障碍物。

游戏的难度可以根据迷宫的复杂程度和障碍物的设置来调整。

二、环境搭建1. 安装C编译器和SFML库:在开始制作游戏之前,需要安装C编译器(如GCC或Clang)以及SFML库。

GCC和Clang是常用的C语言编译器,在安装过程中会有相应的说明文档。

SFML是一个跨平台的多媒体库,提供了许多功能丰富的图形和音频接口。

2. 配置开发环境:在安装完成后,需要配置开发环境,包括设置编译器和库文件的路径。

具体操作请参考相关文档。

三、游戏设计在开始编写代码之前,我们需要先设计游戏的基本框架和功能。

1. 创建游戏窗口:使用SFML库可以方便地创建一个游戏窗口,并设置窗口的大小和标题。

2. 绘制迷宫地图:迷宫地图可以使用二维数组来表示,其中不同的数值代表不同的方块类型,比如墙壁、通道和出口。

在游戏开始时,需要根据地图数组来绘制迷宫。

3. 控制角色移动:通过监听键盘事件,可以让玩家使用方向键或WASD键来控制角色的移动。

需要注意的是,角色移动时需要检测是否与墙壁或边界发生碰撞。

4. 碰撞检测:在角色移动过程中,需要判断角色是否与墙壁或障碍物发生碰撞。

如果发生碰撞,则需要相应地处理角色的移动。

5. 胜利条件判断:游戏的胜利条件是角色到达迷宫的出口。

可以通过判断角色与出口的位置关系来判断玩家是否胜利。

四、编写代码在完成游戏设计之后,我们可以开始编写代码来实现游戏功能。

1. 引入SFML库和相关头文件:在代码文件的开头,引入所需的SFML库和相关头文件。

2. 创建游戏窗口:使用SFML库中的窗口类来创建游戏窗口,并设置窗口的大小和标题。

C语言实现数字炸弹小游戏

C语言实现数字炸弹小游戏

C语⾔实现数字炸弹⼩游戏本⽂实例为⼤家分享了C语⾔实现数字炸弹⼩游戏的具体代码,供⼤家参考,具体内容如下使⽤的是C语⾔# 内容#include<stdio.h>#include<stdlib.h>int main(){//变量char c_TheRequest = 1;//开始界⾯的字符int in_Deltar = 1,in_EnteredNumber,in_Sig;//游戏中输⼊数字及其判定所需要的数字int in_GivenNum = 0,in_An = 0,in_Bn = 0;//出的数字,和数字区间int in_Mid1,in_Mid2;//⽤来交换An、Bn的值以满⾜An<Bn的中间量int in_DistantAn,in_DistantBn;//An与Bn离num的距离int in_TemporaryAnSaver,in_TemporaryBnSaver;//临时⽤于⽐较的An、Bn储存器//开始界⾯printf("If you just happen to open the game and do not have the intention to play it.\n");printf("You can enter a q to quit or you can enter an s to start the game now!\n");scanf("%c",&c_TheRequest);getchar();while (c_TheRequest != 's' && c_TheRequest != 'q'){printf("Please do not enter a irrelevant letter.\n");scanf("%c",&c_TheRequest);getchar();}if(c_TheRequest == 'q'){printf("So sad then.Hope you can play with me next time.\n");getchar();}//游戏if(c_TheRequest == 's'){//输⼊“数字炸弹”system("cls");printf("(^ o ^) # *** NOW LET\'S PLAY! *** # (^ o ^)\nAttention!You can only enter numbers in the following steps.\nEnter to start.\n"); getchar();system("cls");printf("Game : The number boom!(Another Life.)\n");printf("Rule:\n");printf("The first player should enter a number.Then he should give to numbers and guarantee the number above is between them.\n"); printf("The rest should guess and enter the numbers.And the one who enter the exact number the first player entered\n");printf("is supported to be the winner!\n");printf("Please Enter a number to start the game.(You is ought not to expose it to other players.The number should bigger than 0.)\n"); printf("__________\b\b\b\b\b\b\b\b\b\b\b");while(scanf("%d",&in_GivenNum) != 1 || in_GivenNum < 0){system("cls");printf("Please Enter a NUMBER which is bigger than 0.\n");printf("num:___________\b\b\b\b\b\b\b\b\b\b\b");getchar();}system("cls");//判定是否为数字//输⼊“数字炸弹”所在的区间printf("And where is the number?Please enter two numbers,and ensure that the number above is between them.\n");printf("Additionally,there should be at least 100 numbers between the two numbers you will enter.\n");do{printf("num = %d\n",in_GivenNum);printf("A:__________\b\b\b\b\b\b\b\b\b\b");while(scanf("%d",&in_An)!=1){printf("Please Enter a NUMBER which is bigger or smaller than the \"num\"\n");printf("A:__________\b\b\b\b\b\b\b\b\b\b");scanf("%d",&in_An);getchar();}printf("B:__________\b\b\b\b\b\b\b\b\b\b");while(scanf("%d",&in_Bn)!=1){printf("Please Enter a NUMBER which is bigger or smaller than the \"num\"\n");printf("B:__________\b\b\b\b\b\b\b\b\b\b");scanf("%d",&in_Bn);}//记录An和Bnif(!(( in_An < in_GivenNum && in_Bn > in_GivenNum ) || ( in_An > in_GivenNum && in_Bn < in_GivenNum ))){system("cls");printf("Your math is so poor.Enter a again!\nThe \"num\" must be between the two numbers.\n");printf("Enter to restart.\n");getchar();getchar();system("cls");}//区间如果错误就会报错}while(!(( in_An < in_GivenNum && in_Bn > in_GivenNum ) || ( in_An > in_GivenNum && in_Bn < in_GivenNum )));//判定区间是不是对的 //排序in_Mid1 = (in_An > in_Bn)?in_Bn : in_An;in_Mid2 = (in_Bn > in_An)?in_Bn : in_An;in_An = in_Mid1;in_Bn = in_Mid2;//开始猜数字system("cls");printf("Now the game starts!\n");printf("The number is somewhere between %d and %d\n",in_An,in_Bn);printf("Please enter the number.\n");printf("__________\b\b\b\b\b\b\b\b\b\b");while(in_Deltar != 0){while(scanf("%d",&in_EnteredNumber)!=1){printf("Please Enter a NUMBER\n");scanf("%d",&in_EnteredNumber);getchar();}//判断是否为数字//差的运算in_Deltar = ((in_GivenNum - in_EnteredNumber)<0)?in_EnteredNumber - in_GivenNum:in_GivenNum - in_EnteredNumber;in_Sig = in_GivenNum - in_EnteredNumber;in_DistantAn = in_GivenNum - in_An;in_DistantBn = in_Bn - in_GivenNum;//判定差的⼤⼩if(in_Deltar >= 1000){if(in_Sig > 0)printf("Too small!Next!\n");elseprintf("Too big!Next!\n");}else if(in_Deltar >= 100){if(in_Sig > 0)printf("Small.Next!\n");elseprintf("Big.Next!\n");}else if(in_Deltar >= 10){if(in_Sig > 0)printf("A little small.Next!\n");elseprintf("A little big.Next!\n");}else if(in_Deltar > 0){printf("Almost there!NEXT\n");}//临时存储,以便后⾯判断所给数字是否满⾜条件in_TemporaryAnSaver = in_An;in_TemporaryBnSaver = in_Bn;if(( in_Deltar < in_DistantAn && in_Sig > 0 ) || ( in_Deltar < in_DistantBn && in_Sig < 0 )){if(in_Sig > 0)in_An = in_EnteredNumber;elsein_Bn = in_EnteredNumber;}//这是修改上下限if((in_TemporaryAnSaver == in_An && in_TemporaryBnSaver == in_Bn) && in_Deltar){system("cls");printf("Do not cheat!\nYou should play it again.\n");}//判定所猜的数字是否在区间内if(in_Deltar == 0)printf("Enter to continue.\n");getchar();getchar();system ("cls");printf("Between %d and %d\n__________\b\b\b\b\b\b\b\b\b\b",in_An,in_Bn);//区间修正}printf("You are the one ");getchar();getchar();}}总结学习C的时候为了巩固所学知识⽽编得⼀个⼩游戏,内容全英⽂。

c语言怎样编写俄罗斯方块

c语言怎样编写俄罗斯方块

linesCleared++; for (int k = i; k > 0; k--) {
for (int j = 0; j < WIDTH; j++) { board[k][j] = board[k - 1][j];
} } for (int j = 0; j < WIDTH; j++) {
board[0][j] = 0; } } } printf("Lines cleared: %d\n", linesCleared); }
if (kbhit()) { char key = getch(); switch (key) { case 'a': if (!checkCollision(shapeX - 1, shapeY, shape)) { shapeX--; } break; case 'd': if (!checkCollision(shapeX + 1, shapeY, shape)) { shapeX++; } break; case 's': if (!checkCollision(shapeX, shapeY + 1, shape)) { shapeY++; } break; case 'w': int tempShape[4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { tempShape[i][j] = shape[i][j]; } } rotateShape(tempShape); if (!checkCollision(shapeX, shapeY, tempShape)) { rotateShape(shape); } break; case 'q': exit(0); }

C语言小游戏程序设计

C语言小游戏程序设计

C语言小游戏程序设计第一篇:C语言小游戏程序设计程序设计实验大作业成绩:学院:班级:学号:指导老师:姓名:实验项目名称:猜数字游戏一、实验要求根据所学知识编写一个小游戏--猜数字游戏二、实验目的为了加深对编程课程的基本知识的理解和掌握,并且掌握编程和程序调试的技巧通过程序的设计训练和提高学生的基本技能,掌握字符串的表示方法和字符串函数的功能、编程软件操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高解决实际问题的能力,巩固语法规则的理解和掌握,学会通过源程序写出流程图,提高自学以及查阅资料的能力。

三、功能模块分析1.系统能够随机产生一个1到1000的数字2.比较输入数字与随机产生数字的大小3.选择是否继续游戏四、修改处1.将输出内容由英文变为汉字2.改变背景及输出字体的颜色将随机产生的数值范围由1-100变为1-1000四、设计思路# include# include# includemain(){void textbackground(int color);system(“color fc”);int a,b;char c;srand(time(NULL));a=1+(rand()%1000);printf(“这有一个数字从1到1000.n你能猜出它吗?n输入你猜的数字.n”);scanf(“%d”,&b);while(b!=-1){if(b==a){printf(“恭喜你猜对了!n你喜欢再玩一遍吗?(y or n)?”);scanf(“%c”,&c);scanf(“%c”,&c);switch(c){case 'y':printf(“这有一个数字.n你能猜出它吗?n输入你猜的数字.n”);scanf(“%d”,&b);break;case 'n':break;}}while(b{printf(“低了,再试一次.”);scanf(“%d”,&b);}while(b>a){printf(“高了,再试一次.”);scanf(“%d”,&b);}}}未修改前截图更改后截图四、体会心得通过本次试验我见识到了C语言的重要性和我在程序设计方面的不足,让我了解到要把书本知识转换为可以实际操作的东西是需要扎实的理论基础和严谨的逻辑思维的,同时我也发现了平时很多没有注意到的问题,弥补了我C语言方面的不足,在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过实践的学习,我认识到学好计算机要重视实践操作第二篇:C程序设计 24点小游戏1设计内容有2、3、4、5、6、7、8、9、10、J、Q、K、A共13张牌,编一程序,判断对任意给定的4张牌,能否在进行加、减、乘、除运算后,其运算结果等于24。

C语言编程游戏代码

C语言编程游戏代码

#include <stdio.h>#include <stdlib.h>#include <dos.h>#include <conio.h>#include <time.h>#define L 1#define LX 15#define L Y 4static struct BLOCK{int x0,y0,x1,y1,x2,y2,x3,y3;int color,next;intb[]={{0,1,1,1,2,1,3,1,4,1},{1,0,1,3,1,2,1,1,4,0},{1,1,2,2,1,2,2,1,1,2},{0,1,1,1,1,0,2,0,2,4}, {0,0,0,1,1,2,1,1,2,3},{0,0,1,0,1,1,2,1,3,8},{1,0,1,1,2,2,2,1,2,5},{0,2,1,2,1,1,2,1,2,6},{0,1,0,2,1,1,1 ,0,3,9},{0,1,1,1,1,2,2,2,3,10},{1,1,1,2,2,1,2,0,3,7},{ 1,0,1,1,1,2,2,2,7,12},{0,1,1,1,2,1,2,0,7,13},{0 ,0,1,2,1,1,1,0,7,14},{0,1,0,2,1,1,2,1,7,11},{0,2,1,2,1,1,1,0,5,16},{0,1,1,1,2,2,2,1,5,17},{1,0,1,1,1, 2,2,0,5,18},{0,0,0,1,1,11,2,1,5,15},{0,1,1,1,1,0,2,1,6,2,0},{0,1,1,2,1,1,1,0,6,21},{0,1,1,2,1,1,2,1,6 ,22},{1,0,1,1,1,2,2,1,6,19}};static int d[10]={33000,3000,1600,1200,900,800,600,400,300,200};int Llevel,Lcurrent,Lnext,Lable,lx,ly,Lsum;unsigned Lpoint;int La[19][10],FLAG,sum;unsigned ldelay;void scrint(),datainit(),dispb(),eraseeb();void throw(),judge(),delayp(),move(0,note(0,show();int Ldrop(),Ljudge(),nextb(),routejudge();}main(){char c;datainit();Label=nextb();Label=Ldrop();while(1){delayp();if(Label!=0){Ljudge();Lable=nextb();}ldelay--;if(ldelay==0){Label=Ldrop();ldelay=d[0];}if(FLAG!=0) break;while(getch()!='\r');goto xy(38,16);cputs("again?");c=getch();while(c!='n'&&c!='N')c lscr();}int nextb(){if(La[(b[Lnext].y0)][(3+b[Lnext].x0)]!=0||La[(b[Lnext].y1)][(3+b[Lnext].x1)]!=0|| La[(b[Lnext].y2)][(3+b[Lnext].x2)]!=0||La[(b[Lnext].y3)][3+b[Lnext].x3)]!=0) {FLAG=L;return (-1);}erase b(0,3,5,Lnext);Lcurrent=Lnext;lx=3;ly=0;Label=0;ldelay=d[0];Lsum ++;Lpoint+=1;Lnext=random(23);dispb(0,3,5,Lnext);text color(7);goto xy(3,14);printf("%#5d",Lsum);goto xy(3,17);printf("%#5d",Lpoint);return(0);}void delayp(){char key;if(kbhit()!=0){key=getch();move(key);if(key=='\\')getch();}}void move(funkey)char funkey;{int tempcode;case 'k';if(lx+b[current].x0>0){if(La[ly+(b[Lcurrent].y0)][lx-1+(b[Lcurrent].x0)]==0&&La[(ly+b[current].y1)][(lx-1+b[curr ent].x1]==0&&La[ly+b[current].y2)][lx-1+b[Lcurrent].x2)]==0&&La[ly+(b[current].y3)][lx-1+(b [Lcurrent].x3)]==0){eraseb(L,lx,lyLcurrent);lx--;dispb(L,lx,ly,Lcurrent);}}break;case 0x20;tempcode=b[Lcurrent].next;if (lx+b[tempcode].x0>=0 && lx+b[tempcode].x3<=9 && ly+b[tempcode].y1<=19 && ly+b[tempcode].y2<=19){if(routejudge()!+-1){if(La+(b[tempcode].y0)][lx+(b[tempcode].x0)]==0 && La[ly+(b[tempcode].y1)][lx+(b[tempcode].x1)]==0 && La[ly+(b[tempcode].y2)][lx+(b[tempcode].x2)]==0 && La[ly+(b[tempcode].y3)][lx+(b[tempcode].x3)]==0)eraseb(L,lx,ly,Lcurrent);Lcurrent=tempcode;dispb(L,lx,ly,Lcurrent);}}break;case 'M';if(lx+b[Lcurrent].x3<9){if(La[ly+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)]==0 &&La[ly+(b[Lcurrent].y1)][lx+(b[Lcurrent].x1)]==0 && La[ly+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)]==0 && La[ly+(b[Lcurrent].y3)][lx+(b[Lcurrent].x3)]==0){eraseb(L,lx,ly,Lcurrent);lx++;disb(L,lx,ly,Lcurrent);}}break;case 'p';throw();break;case 0x1b;clrscr();exit(0);break;default:break;}void throw(){int tempy;tempy=ly;while(ly+b[Lcurrent].y1<19 && ly+b[current].y2<19&&La[ly+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)]==0 && La[ly+(b[Lcurrent].y1)][lx+(b[Lcurrent].x1)]==0 && La[ly+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)]==0 && La[ly+(b[Lcurrent].y3)][lx+(b[Lcurrent].x3)]==0)ly++;ly--;eraseb(L,lx,tempy,Lcurrent);dispb(L,lx,ly,Lcurrent);La[ly+b[Lcurrent].y0)][lx+(b[current].x0)]=La[ly+b[Lcurrent].y1)][lx+(b[current].x1)]=La[l y+b[Lcurrent].y2)][lx+(b[current].x2)]=La[ly+b[Lcurrent].y3)][lx+(b[current].x3)]=b[Lcurrent].c olor;Label=-1;}int routejudge(){int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)if(La[ly+i][lx+j]!=0)return(-1);else return(1);}int Ldrop(){if(ly+b[Lcurrent].y1>=18||ly+b[Lcurrent].y2>=18{La[ly+b[Lcurrent].y0)][lx+(b[current].x0)]=3;La[ly+b[Lcurrent].y1)][lx+(b[current].x1)]=1;La[ly+b[Lcurrent].y2)][lx+(b[current].x2)]=5;La[ly+b[Lcurrent].y3)][lx+(b[current].x3)]=b[Lcurrent].color;return(-1);}if(La(ly+1+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)]!=0||La(ly+1+(b[Lcurrent].y1)][lx+(b[Lcur rent].x1)]!=0||La(ly+1+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)]!=0||La(ly+1+(b[Lcurrent].y3)][lx+( b[Lcurrent].x3)]!=0){La[ly+b[Lcurrent].y0)][lx+(b[current].x0)]=La[ly+b[Lcurrent].y1)][lx+(b[cu rrent].x1)]=0BLa[ly+b[Lcurrent].y2)][lx+(b[current].x2)]=La[ly+b[Lcurrent].y3)][lx+(b[current].x3)]=b[Lcurren t].color){return(-1);eraseb(L,lx,ly,Lcurrent);dispb(L,lx,++ly,Lcurrent);return(0);}}int Ljudge(){int i,j,k,lines,f;static int p[5]={0,1,3,6,10};lines=0;for(k=0;k<=3;k++){f=0;if((ly+k)>18)continue;for(i=0;i<10;i++){if(La[ly+k]==0);i>0;i--){f++;break;}if(f==0){movetext(LX,L Y,LX+19,L Y+ly+k-1,LX,L Y+1);for(i=(ly+k);i>0;i--){for(j=0;j<10;j++)La[j]=La[i-1][j];{for(j=0;j<10;j++)La[0][j]=0;lines++;}}}}}Lpoint+=p[lines]*10;return(0);}void scrint(){int i;char lft[20];textbackground(1);clrscr();goto xy(30,9);cputs("enter your name");scanf("%s",lft);goto xy(25,14);scanf("%s",lft);textbackground(0);clrscr();goto xy(17,1);printf("%s",lft);goto xy(5,3);puts("next");goto xy(4,13);cputs("block");goto xy(4,16);cputs("point");for(i=0;i<19;i++){goto xy(LX-2,L Y+1);cputs("** **");}goto xy(LX-2,L Y+19);cputs("**********************");void datainit(){int i,j;)for(i=0;i<19;i++){for(j=0;j<10;j++){La[j]=0;Label=0;FLAG=0;ldelay=d[0];Lsum=0;Lpoint=0;randomize();Lnext=random(23);}}}void dispb(LRflag,x,y,blockcode){int realx,realy;if(LRflag==L){realx=LX+x*2;realy=L Y+y;}realx=x;raly=y;textcolor(b[blockcode].color);goto xy(realx+2*b[blockcode].x0,realy+b[blockcode].y0); cputs("**");goto xy(realx+2*b[blockcode].x1,realy+b[blockcode].y1); cputs("**");goto xy(realx+2*b[blockcode].x2,realy+b[blockcode].y2); cputs("**");goto xy(realx+2*b[blockcode].x3,realy+b[blockcode].y3); cputs("**");}void eraseb(LRflag,x,y,blockcode)int LRflag,x,y,blockcode;int realx,realy;if(LRflag==L){realx=LX+x*2;realy=L Y+y;}else{realx=Lx+x*2;realy=L Y+y;}textcolor(0);goto xy(realx+2*b[blockcode].x0,realy+b[blockcode].y0);cputs("**");goto xy(realx+2*b[blockcode].x1,realy+b[blockcode].y1);cputs("**");goto xy(realx+2*b[blockcode].x2,realy+b[blockcode].y2);cputs("**");goto xy(realx+2*b[blockcode].x3,realy+b[blockcode].y3);cputs("**");}。

C语言小游戏开发

C语言小游戏开发

#include <bios.h> int x=10, y=10;
void draw(int x,int y) { clrscr(); gotoxy(x, y); printf("%c",2); }
void main() { draw(x,y); while("")
{ switch(bioskey(0)) { case 18432: y-=1;draw(x,y);break; case 20480: y+=1; draw(x,y);break; case 19200: x-=1; draw(x,y);break; case 19712: x+=1; draw(x,y);break; }
第二步:控制角色
接下来,我们想方设法来让我们的主角可以根据我们的按键而动起来。当我 们按下键盘“上”的时候,主角就往上移动。其他方向亦是如此。
我们先来看看如何判断按键的输入呢, 在 bios.h 头文件中有一个 bioskey 函 数,可以判断我们的按键。我们可以通过如下的结构来判断按键: while("") {
case 19200: x-=1; tell();draw(x,y);break;
case 19712: x+=1; tell();draw(x,y);break;
} …… 我们就这样在主角坐标变化后进行判断。我们编译一下看看效果,你应该能 把地图上的“心”给吃掉了。
第五步:胜利判断
我们要在主角吃完所有的“心”后显示胜利信息,因此我们在 int i,j;后面 定义两个变量 n0 和 n,并让他们的初始值为 0。其中 n0 将用来计算游戏开始时 总共有多少个“心”,n 将用来计算已经有多少个“心”被主角吃掉了。代码如 下: int n0=0,n=0; 我们在 main()后面来计算 n0 的值,代码如下: main() {

C语言实现简易五子棋小游戏

C语言实现简易五子棋小游戏

C语⾔实现简易五⼦棋⼩游戏本⽂实例为⼤家分享了C语⾔实现简单五⼦棋⼩游戏的具体代码,供⼤家参考,具体内容如下效果图如下:设计思路:棋盘设计为15×15格,初始状态光标在棋盘的中央,⽩棋先⾛,轮流落⼦,当⼀⽅连成五⼦或下满棋盘时,游戏结束(连成五⼦的⼀⽅获胜,下满棋盘为和棋)。

当游戏⼀⽅胜利后显⽰胜利信息,提⽰信息利⽤汉字点阵输出。

程序游戏是⼀个⼆维平⾯图,可⽤⼆维数组来实现,数组两个下标可以表⽰棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表⽩棋,2代表⿊棋。

程序的主要⼯作是接收棋⼿按键操作,棋⼿1⽤设定四个键控制光标移动,回车键表⽰落⼦。

棋⼿2⽤另四个键控制光标移动,空格键表⽰落⼦。

接收到回车键或空格键,说明棋⼿落⼦,先判断是否是有效位置,即有棋⼦的位置不能重叠落⼦。

落⼦成功后,马上判断以该位置为中⼼的⼋个⽅向:上、下、左、右、左上、左下、右上、右下是否有相同颜⾊的棋⼦连成五⼦,如果连成五⼦,则游戏结束。

#include<stdio.h>#include<stdlib.h>#include<windows.h>#pragma comment(lib, "WINMM.LIB")#include <mmsystem.h>#include<conio.h>#include<time.h>#define width 32 //棋盘总宽度#define high 31 //棋盘总⾼度#define MAX_X 15 //棋盘横向格⼦数#define MAX_Y 15 //棋盘纵向格⼦数#define WIDTH (16+width) //游戏总⾼度#define HIGH (high+4) //游戏总⾼度#define player1 1 //⽩⼦玩家#define player2 2 //⿊⼦玩家#define emptyPlayer 0//⽆⼦#define Unplayer -2 //中途退出游戏,⽆玩家获胜typedef struct Stack{//记录下每次落⼦的坐标int x[MAX_X*MAX_Y];int y[MAX_X*MAX_Y];//相当于栈顶指针int top;}Stack;int pos[MAX_X][MAX_Y];//存储棋盘上各位置处的状态⽐如有⽩⼦为1,有⿊⼦为2,⽆⼦为0int px,py; //光标位置int player = 1;//记录当前玩家默认玩家从⽩⽅开始int flag1 = 0;//标志游戏开始int gameOver_player = -1;//判断结束的标志int pre_px = -1, pre_py = -1;//记录下上⼀次的坐标位置void gotoxy(int x,int y);//设置CMD窗⼝光标位置void hide_cursor(); //隐藏CMD窗⼝光标void map();//打印地图void game_Description();//打印动态游戏说明void initMapState();//初始化游戏位置数据void mapState(int qizi);//数组记录下对应位置的状态int isGoPlay();//判断是否可以落⼦int hasGoPlay(int Player);//以落⼦处为中⼼,判断已经落⼦后的棋盘是否五⼦相连void goPlay(int Player, Stack* p);//落⼦ Player 1 2 0void yiDongKuang();//移动框void player1_move();//玩家1_移动void player2_move();//玩家2_移动int gameOver();//判断游戏是否结束Stack* createStack();//创建空栈void push(Stack* p, int x, int y);//⼊栈void color(const unsigned short textColor);//⾃定义函根据参数改变颜⾊//void setColor(unsigned short backColor);//设置游戏背景颜⾊void gotoxy(int x,int y)//设置CMD窗⼝光标位置{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}void hide_cursor() //隐藏CMD窗⼝光标{CONSOLE_CURSOR_INFO cci;cci.bVisible = FALSE;cci.dwSize = sizeof(cci);HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(handle, &cci);}void color(const unsigned short textColor) //⾃定义函根据参数改变颜⾊{if(textColor>0 && textColor<=15) //参数在0-15的范围颜⾊SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textColor); //⽤⼀个参数,改变字体颜⾊ else //默认的字体颜⾊是⽩⾊SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);}//打印地图void map(){int x, y;color(02);/*开始打印棋盘格⼦*///打印横向图格for(y = 2; y < high - 1; y+=2){for(x = 1; x < width - 2; x+=2){gotoxy(x , y);printf("-+");}}//打印竖向图格for(y = 1; y < high; y += 2) {for(x = 2; x < width-2; x += 2){gotoxy(x , y);printf("|");}}/*打印棋盘格⼦结束*//*开始打印图框*///打印棋盘图框for (y = 0; y < high; y++){for (x = 0; x < width; x+=2){if (x == 0 || x == width - 2){gotoxy(x, y);printf("|");}if(y == 0 || y == high - 1 ){gotoxy(x, y);printf("--");}}}//打印右图框for(y = 0; y < high; y++){for(x = width; x < WIDTH; x+=2){if (x == WIDTH - 2){gotoxy(x, y);printf("|");}if(y == 0 || y == high - 1 ){gotoxy(x, y);printf("--");}}}//打印下图框 y->high ~ HiGH-1 x->0 ~ WIDTH-2 for(y = high; y < HIGH; y++){for(x = 0; x < WIDTH; x+=2){if (x == 0 || x == WIDTH - 2){gotoxy(x, y);printf("|");}if(y == high || y == HIGH - 1 ){gotoxy(x, y);printf("--");}}}//打印下图框内容gotoxy( 1, high+1);printf(" 欢迎来到五⼦棋游戏!");//打印右图框内容gotoxy( width-1, 1);printf("游戏说明:");gotoxy( width-1, 3);printf("1)X表⽰玩家⼀棋");gotoxy( width-1, 4);printf("⼦,⽽O表⽰玩家");gotoxy( width-1, 5);printf("⼆棋⼦");gotoxy( width-1, 7);printf("2)X先、O后,交替");gotoxy( width-1, 8);printf("下⼦,每次只能下");gotoxy( width-1, 9);printf("⼀⼦");gotoxy( width-1, 11);printf("3)棋⼦下在棋盘");gotoxy( width-1, 12);printf("的格⼦内,棋⼦下");gotoxy( width-1, 13);printf("定后,不得向其它");gotoxy( width-1, 14);printf("点移动");gotoxy( width-1, 16);printf("4)最先连成五⼦");gotoxy( width-1, 17);printf("的⼀⽅即为获胜");gotoxy( width-1, 19);printf("玩家⼀移动键:");gotoxy( width-1, 20);printf("w上 s下 a左 d右");gotoxy( width-1, 21);printf("下⼦: 空格键");gotoxy( width-1, 23);printf("玩家⼆移动键:");gotoxy( width-1, 24);printf("i上 k下 j左 l右");gotoxy( width-1, 25);printf("下⼦:回车键");gotoxy( width+1, 27);color(4);printf("退出键: Y");gotoxy( width+1, 29);color(6);printf("悔棋键: G");/*打印图框结束*/color(02);/*打印棋盘上的四个标记点*/gotoxy( 3*2+2 , 3*2+2);printf("*");gotoxy( (MAX_X-4)*2 , 3*2+2);printf("*");gotoxy( 3*2+2 , (MAX_Y-4)*2);printf("*");gotoxy( (MAX_X-4)*2 , (MAX_Y-4)*2); printf("*");/*打印结束*//*开始修边*//*gotoxy(width - 1, 0);printf(" ");gotoxy(width - 1, high - 1);printf(" ");*//*修边结束*//*打印地图完成*/}//打印动态游戏说明void game_Description(){//打印下图框内容gotoxy( 1, high+1);printf(" ");if(player == player1){gotoxy( 1, high+1);color(2);printf(" 玩家⼀下棋中..."); }else if(player == player2){gotoxy( 1, high+1);color(2);printf(" 玩家⼆下棋中..."); }}//初始化游戏位置数据void initMapState(){for(int i = 0 ; i < MAX_Y; i++){for(int j = 0; j < MAX_X; j++){pos[i][j] = 0;//初始状态全为空}}//注意光标的位置和存储在数组中的位置是不同的px = 7;py = 7;gotoxy(py*2+1,px*2+1);//初始位置}//数组记录下对应位置的状态void mapState(int qizi){ //2*px+1 = x //2*py+1 = y //px->0~14 //py->0~14if(px >= MAX_X || px < 0 || py >= MAX_Y || py < 0) return;//其他情况不可以记录状态pos[px][py] = qizi;}//判断是否可以落⼦int isGoPlay(){if(px >= MAX_X || px < 0 || py >= MAX_Y || py < 0)return 0;//其他情况不可以记录状态if(pos[px][py] == emptyPlayer){//说明⽆⼦return 1;}else{//说明有⼦return 0;}}//以落⼦处为中⼼,判断已经落⼦后的棋盘是否五⼦相连int hasGoPlay(int Player){ //分为两部分,先记录⼀部分的相同Player的个数//再记录下另余部分的个数,相加为相连棋⼦总个数 int port1 = 0, port2 = 0;int x, y, count;//上下查找x = px, y = py-1;while(pos[x][y]==Player && y >= 0){++port1;//上部分个数--y;//上移}y = py+1;while(pos[x][y]==Player && y < MAX_Y){++port2;//下部分个数++y;//下移}//计算总数count = port1 + port2 + 1;if(count >= 5) return 1;//左右查找port1 = 0, port2 = 0;x = px-1, y = py;while(pos[x][y]==Player && x >= 0){++port1;//上部分个数--x;//左移}x = px+1;while(pos[x][y]==Player && x < MAX_X){++port2;//下部分个数++x;//右移}//计算总数count = port1 + port2 + 1;if(count >= 5) return 1;//左上右下查找port1 = 0, port2 = 0;x = px-1, y = py-1;while(pos[x][y]==Player && x >= 0 && y >= 0){++port1;//上部分个数--x;//左移--y;//上移}x = px+1, y = py+1;while(pos[x][y]==Player && x < MAX_X && y < MAX_Y){++port2;//下部分个数++x;//右移++y;//下移}//计算总数count = port1 + port2 + 1;if(count >= 5) return 1;//右上左下查找port1 = 0, port2 = 0;x = px+1, y = py-1;while(pos[x][y]==Player && x < MAX_X && y >= 0){++port1;//上部分个数++x;//左移--y;//上移}x = px-1, y = py+1;while(pos[x][y]==Player && x >= 0 && y < MAX_Y){++port2;//下部分个数--x;//右移++y;//下移}//计算总数count = port1 + port2 + 1;if(count >= 5) return 1;return 0;}//落⼦ Player 1 2 0void goPlay(int Player, Stack* p){if(isGoPlay()){//说明可以落⼦mapState(Player);//将对应位置的情况记录在数组中if(hasGoPlay(Player)){//如果五⼦相连,则 gameovergameOver_player = Player; //记录此刻胜利玩家,结束游戏 }/*⼊栈*/push(p, px, py);/*⾓⾊切换*/if(Player == player1){player = player2;//切换成玩家1gotoxy(px*2+1, py*2+1 );//将光标移动到对应位置color(07);printf("X");//打印玩家1game_Description();// 动态说明}else if(Player == player2){player = player1;//切换成另⼀个玩家2gotoxy( px*2+1, py*2+1);//将光标移动到对应位置 color(07);printf("O");//打印玩家2game_Description();// 动态说明}}}//⼊栈void push(Stack* p, int x, int y){//将此刻的坐标⼊栈int top = p->top;++p->top;//移动栈针p->x[top] = x;p->y[top] = y;return;}//出栈void pop(Stack* p){int x, y;//出栈,移动栈顶指针//如果栈为空,则不弹出if(p->top <= 0) return;--p->top;int top = p->top;//记录下弹出的位置x = p->x[top];y = p->y[top];//在弹出位置打印空格gotoxy(x*2+1, y*2+1);printf(" ");//抹除记录pos[x][y] = 0;}//移动框void yiDongKuang(){//打印移动框gotoxy(px*2, py*2+1);color(11);printf("[");gotoxy(px*2+2, py*2+1);printf("]");//打印移动框结束if(pre_px != -1 && pre_py != -1){if(pre_px > px && pre_py == py){//当向左移动时//将上⼀个位置的右边保持原样gotoxy(pre_px*2+2, pre_py*2+1);color(2);printf("|");}else if(pre_px < px && pre_py == py){//当向右移动时//将上⼀个位置的左边保持原样gotoxy(pre_px*2, pre_py*2+1);color(2);printf("|");}else{//当向上下移动时//将上⼀个位置的左右边保持原样gotoxy(pre_px*2+2, pre_py*2+1);color(2);printf("|");gotoxy(pre_px*2, pre_py*2+1);color(2);printf("|");}}pre_px = px;pre_py = py;}//玩家1 移动void player1_move(Stack* p){char key;if (_kbhit())//检测是否按键{fflush(stdin);key = _getch();//保存按键game_Description();//动态说明}switch(key){case 'w': py--;yiDongKuang();break;//上case 'a': px--;yiDongKuang();break;//左case 'd': px++;yiDongKuang();break;//右case 's': py++;yiDongKuang();break;//下case ' ': goPlay(player1, p);break;//落⼦case 'y': gameOver_player = -2; gameOver();//退出游戏 case 'Y': gameOver_player = -2; gameOver();//退出游戏case 'g': pop(p); pop(p); break;//悔棋case 'G': pop(p); pop(p); break;//悔棋default: break;}//限制光标范围if(py < 0) py = MAX_Y-1;else if(py >= MAX_Y) py = 0;else if(px < 0) px = MAX_X-1;else if(px >= MAX_X) px = 0;gotoxy(2*py+1, 2*px+1);}//玩家2 移动void player2_move(Stack* p){char key;if (_kbhit())//检测是否按键{fflush(stdin);key = _getch();//保存按键game_Description();//动态说明}switch(key){case 'i': py--;yiDongKuang();break;//上case 'j': px--;yiDongKuang();break;//左case 'l': px++;yiDongKuang();break;//右case 'k': py++;yiDongKuang();break;//下case '\r': goPlay(player2, p);break;//落⼦case 'y': gameOver_player = -2; gameOver();//退出游戏case 'Y': gameOver_player = -2; gameOver();//退出游戏case 'g': pop(p); pop(p); break;//悔棋case 'G': pop(p); pop(p); break;//悔棋default: break;}//限制光标范围if(py < 0) py = MAX_Y-1;else if(py >= MAX_Y) py = 0;else if(px < 0) px = MAX_X-1;else if(px >= MAX_X) px = 0;gotoxy(2*px+1, 2*py+1);}//创建空栈Stack* createStack(){//申请空间Stack* p = (Stack* )malloc(sizeof(Stack));//如果未申请到空间if(p==NULL) return NULL;p->top = 0;//初始化栈顶return p;}//判断游戏是否结束int gameOver(){ //gamerOver_player -1 表⽰继续游戏 1 表⽰⽩⽅胜利 2 表⽰⿊⽅胜利 0 表⽰平局 //五⼦相连⼀⽅取胜 y->high ~ HiGH-1 x->0 ~ WIDTH-2if(gameOver_player == -1){return 1;}else if(gameOver_player == player1){//⽩⽅胜利gotoxy( 1, high+1);printf("玩家1胜利");return 0;}else if(gameOver_player == player2){//⿊⽅胜利gotoxy( 1, high+1);printf("玩家2胜利");return 0;}else if(gameOver_player == emptyPlayer){//棋盘满棋平局gotoxy( 1, high+1);printf("平局");return 0;}else if(gameOver_player == Unplayer){//中途退出gotoxy( 1, high+1);printf("正在退出游戏中...");exit(1);}return 1;}int main(){//调整游戏框system("mode con cols=48 lines=35");//打印地图map();//初始化游戏位置数据initMapState();//创建空栈Stack* p = createStack();//隐藏光标hide_cursor();//游戏循环控制移动while(gameOver()){//不断调换⼈物if(player == player1)player1_move(p);// 切换玩家1else if(player == player2)player2_move(p);// 切换玩家2}free(p);}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

C语言代码实现简单扫雷小游戏

C语言代码实现简单扫雷小游戏

C语⾔代码实现简单扫雷⼩游戏⽤C语⾔写⼀个简单的扫雷,供⼤家参考,具体内容如下1.所需要的知识c语⾔的基本语法,简单的⼆维数组,⼀点简单的递归知识。

2.总体思路扫雷游戏主要由3个部分组成,埋雷⼦,扫雷,判断输赢。

扫雷游戏的主体是两个个字符类型的⼆维数组。

⼀个是mine[][]它的构成是'0'和‘1',其中'0'表⽰⽆雷,'1'表⽰有雷。

⼀个是show[][]它的构成是'*'和'数字'。

星号表⽰未开启的地⽅,数字表⽰周围的雷数。

这⾥要注意的是:mine和show的实际⼤⼩是11x11,但是展⽰的效果是 9x9。

这样做的优点将在Find()中体现。

蓝⾊部分是可见的9x9,实际的类似红⾊ 11x11。

下⾯是我⽤到的⼀些函数。

//game.h#pragma once#ifndef __GAME_H__#define __GAME_H__#include<stdio.h>#include<stdlib.h>#include<process.h>#include<string.h>#include<time.h>#define ROW 9 // 9⾏#define COL 9 // 9列#define ROWS ROW+2 //实际⾏#define COLS COL+2 //实际列#define MineNum 10 //雷⼦数量//菜单信息void menu();//执⾏菜单void test(char mine[ROWS][COLS], int row1, int col1, char show[ROWS][COLS], int row2, int col2);//游戏主体void game(char mine[ROWS][COLS], int row1, int col1, char show[ROWS][COLS], int row2, int col2);//打印雷阵void InitBoard(char arr[ROWS][COLS], int row, int col);//埋雷⼦void SetMine(char mine[ROWS][COLS], int row, int col);//找雷⼦int FindMine(char mine[ROWS][COLS], int row1, int col1, char show[ROWS][COLS], int row2, int col2);//空⽩算法void Find(char mine[ROWS][COLS], int row1, int col1, char show[ROWS][COLS], int row2, int col2,int x, int y,int exam[ROWS][COLS]);#endif//__GAME_H__下⾯是主函数内容#include"game.h"int main(){char mine[ROWS][COLS];char show[ROWS][COLS];srand ((unsigned int)time(NULL)); //⽣成随机数,⽤于随机埋雷int i = 0, j = 0;test(mine, ROWS, COLS, show, ROWS, COLS); //测试函数system("pause");return 0;}3.详细实现菜单函数void menu(){printf("******************\n");printf("******1.play *****\n");printf("******0.exit *****\n");printf("******************\n");}这个函数是⽤来打印信息的,打印⼀个简单的菜单。

简单的迷宫小游戏C语言程序源代码

简单的迷宫小游戏C语言程序源代码

简单的迷宫小游戏C语言程序源代码#include <stdio.h>#include <conio.h>#include <windows.h> #include <time.h>#define Height 31 //迷宫的高度,必须为奇数 #define Width 25 //迷宫的宽度,必须为奇数 #define Wall 1#define Road 0#define Start 2#define End 3#define Esc 5#define Up 1#define Down 2#define Left 3#define Right 4int map[Height+2][Width+2]; void gotoxy(int x,int y) //移动坐标{COORD coord;coord.X=x;coord.Y=y;SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );}void hidden()//隐藏光标{HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci);cci.bVisible=0;//赋1为显示,赋0为隐藏SetConsoleCursorInfo(hOut,&cci);}void create(int x,int y) //随机生成迷宫 {int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向 int i,j,t;//将方向打乱for(i=0;i<4;i++){j=rand()%4;t=c[i][0];c[i][0]=c[j][0];c[j][0]=t;t=c[i][1];c[i][1]=c[j][1];c[j][1]=t;}map[x][y]=Road;for(i=0;i<4;i++)if(map[x+2*c[i][0]][y+2*c[i][1]]==Wall){map[x+c[i][0]][y+c[i][1]]=Road;create(x+2*c[i][0],y+2*c[i][1]);}}int get_key() //接收按键{char c;while(c=getch()) {if(c==27) return Esc; //Escif(c!=-32)continue; c=getch();if(c==72) return Up; //上if(c==80) return Down; //下if(c==75) return Left; //左if(c==77) return Right; //右}return 0;}void paint(int x,int y) //画迷宫 { gotoxy(2*y-2,x-1); switch(map[x][y]) { case Start:printf("入");break; //画入口case End:printf("出");break; //画出口case Wall:printf("※");break; //画墙case Road:printf(" ");break; //画路}}void game(){int x=2,y=1; //玩家当前位置,刚开始在入口处 int c; //用来接收按键while(1){gotoxy(2*y-2,x-1); printf("?"); //画出玩家当前位置if(map[x][y]==End) //判断是否到达出口{gotoxy(30,24); printf("到达终点,按任意键结束");getch();break;}c=get_key(); if(c==Esc){gotoxy(0,24); break;}switch(c){case Up: //向上走if(map[x-1][y]!=Wall){paint(x,y); x--;}break;case Down: //向下走if(map[x+1][y]!=Wall){paint(x,y); x++;}break;case Left: //向左走if(map[x][y-1]!=Wall){paint(x,y); y--;}break;case Right: //向右走if(map[x][y+1]!=Wall){paint(x,y); y++;}break;}}}int main(){int i,j;srand((unsigned)time(NULL)); //初始化随即种子 hidden(); //隐藏光标for(i=0;i<=Height+1;i++) for(j=0;j<=Width+1;j++)if(i==0||i==Height+1||j==0||j==Width+1) //初始化迷宫 map[i][j]=Road;else map[i][j]=Wall;create(2*(rand()%(Height/2)+1),2*(rand()%(Width/2)+1)); //从随机一个点开始生成迷宫,该点行列都为偶数for(i=0;i<=Height+1;i++) //边界处理 {map[i][0]=Wall;map[i][Width+1]=Wall; }for(j=0;j<=Width+1;j++) //边界处理{map[0][j]=Wall;map[Height+1][j]=Wall; }map[2][1]=Start; //给定入口map[Height-1][Width]=End; //给定出口 for(i=1;i<=Height;i++)for(j=1;j<=Width;j++) //画出迷宫paint(i,j);game(); //开始游戏getch();return 0;}。

双手奉上!一个好玩的小游戏(纯C语言编写)!

双手奉上!一个好玩的小游戏(纯C语言编写)!

双⼿奉上!⼀个好玩的⼩游戏(纯C语⾔编写)!效果演⽰源代码#include<stdio.h>#include<string.h>#include<conio.h>#include<windows.h>#include<stdlib.h>#define MAX 100long long int speed = 0;//控制敌机的速度int position_x, position_y;//飞机的所在位置int high, width;//地图的⼤⼩int bullet_x, bullet_y;//⼦弹的位置int enemy_x, enemy_y;//敌⼈的位置int map[MAX][MAX];/*0表⽰空⽩,1表⽰战机*的区域,2表⽰敌⼈战机的位置。

3表⽰上下围墙,4表⽰左右围墙,5表⽰⼦弹的位置*/int score;void starup()//初始化所有的信息{high = 20;width = 30;position_x = high / 2;position_y = width / 2;bullet_x = 0;bullet_y = position_y;enemy_x = 2;enemy_y = position_y - 1;score = 0;{int i, j;for (i = 1; i <= high - 1; i++){map[i][1] = 4;for (j = 2; j <= width - 1; j++)map[i][j] = 0;map[i][width] = 4;}//下⽅围墙的初始化i = high;for (j = 1; j <= width; j++)map[i][j] = 3;map[bullet_x][bullet_y] = 5;/*这⾥是战机⼤⼩的初始化开始*/map[position_x - 1][position_y] = 1;i = position_x;for (j = position_y - 2; j <= position_y + 2; j++)map[i][j] = 1;map[position_x + 1][position_y - 1] = 1;map[position_x + 1][position_y + 1] = 1;/*** 初始化结束 **//* 敌⼈战机的初始化 */map[enemy_x][enemy_y] = 2;map[enemy_x - 1][enemy_y - 1] = 2;map[enemy_x - 1][enemy_y + 1] = 2;/* 敌⼈战机初始化结束*/}void HideCursor()//隐藏光标{CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); }void gotoxy(int x, int y)//清理⼀部分屏幕{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle, pos);}void updateWithoutInput()//于输⼊⽆关的跟新{if (bullet_x > 0)bullet_x--;if ((bullet_x == enemy_x) && (bullet_y == enemy_y))//当敌⼈的飞机被击中时{enemy_y = rand() % width;bullet_x = 0;}if (enemy_x > high)//当飞机超出区域{enemy_x = 0;enemy_y = rand() % width;}if (speed == 1)for (int i = 1; i <= 10000; i++)//⽤来控制敌机的速度 {for (int j = 1; j <= 3000; j++){speed = 1;}}speed = 0;if (speed == 0){enemy_x++;speed = 1;}}void updateWithInput()//与输⼊有关的更新{char input;if (kbhit())//在VC6.0++下,为_kbhit(){input = getch();//在VC6.0++下为_getch();if (input == 'a')position_y--;if (input == 's')position_x++;if (input == 'd')position_y++;if (input == 'w')position_x--;if (input == ''){bullet_x = position_x - 1;bullet_y = position_y;}}}void show()//展⽰的内容{gotoxy(0, 0);for (i = 1; i <= high; i++){for (j = 1; j <= width; j++){if (map[i][j] == 0)printf("");if (map[i][j] == 1)printf("*");if (map[i][j] == 2)printf("#");if (map[i][j] == 3)printf("~");if (map[i][j] == 4)printf("|");if (map[i][j] == 5)printf("|");}printf("\n");}printf("\n你的得分:%d\n\n", score);printf("操作说明: ASDW分别操作左下右上四个的移动\n");printf("**空格是发出⼦弹**\n");}int main(){starup();while (1){HideCursor();startMap();show();updateWithoutInput();updateWithInput();}return0;}—————————————关注我,参观更多源码项⽬!- End -—————————————不管你是转⾏也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~【值得关注】我的!【点击进⼊】C语⾔⼊门资料(⽹盘链接免费分享):C语⾔推荐书籍(PDF免费分享):。

C语言实现俄罗斯方块小游戏

C语言实现俄罗斯方块小游戏

C语⾔实现俄罗斯⽅块⼩游戏C语⾔实现俄罗斯⽅块⼩游戏的制作代码,具体内容如下#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define TTY_PATH "/dev/tty"#define STTY_ON "stty raw -echo -F"#define STTY_OFF "stty -raw echo -F"int map[21][14];char direct;int node[7][4][16]={{{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},//长⽅形{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}},{{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},//正⽅形{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},//3边加⼀中点{0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0},{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},{{0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0},//右锄头型{0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0},{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}},{{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},//左锄头型{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0},{0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0}},{{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},//右曲折型{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}},{{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},//左曲折型{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}}};typedef struct block{int x;int y;int blockType;int blockDirect;}Block;Block bl;void init_map()//初始化边框{int i,j;for(i=0; i<21; i++)for(j=0; j<14; j++){if(j==0 || j==13)map[i][j] = 200;else if(i==20)map[i][j] = 201;elsemap[i][j] = 0;}}void new_block()//⽣成随机的俄罗斯⽅块{int blockType = rand()%7;int blockDirect = rand()%4;int x = 1;int y = 5;bl.x = x;bl.y = y;bl.blockType = blockType;bl.blockDirect = blockDirect;}void input()//将移动后的俄罗斯⽅块,导⼊地图中作标记{int i, j;for(i=0; i<4; i++)for(j=0; j<4; j++)if(node[bl.blockType][bl.blockDirect][i*4+j]==1){map[bl.x+i][bl.y+j] = 1;}}void output()//移动时,将之前俄罗斯⽅块在地图信息清空。

C语言实现简易2048小游戏

C语言实现简易2048小游戏

C语⾔实现简易2048⼩游戏⼀直很喜欢玩这个⼩游戏,简单的游戏中包含运⽓与思考与策略,喜欢这种简约⼜不失内涵的游戏风格。

于是萌⽣了⽤C语⾔实现⼀下的想法。

具体代码是模仿这个:博主分析的都很到位,很多算法技巧都值得借鉴,C语⾔实现2048的主要思想已经在那个博客中详细的分析了,但是我觉得在博主的代码中还是有很多很好的思想是值得我借鉴学习的。

⽐如这个⽣成随机数,顺便规定随机数的概率:/* ⽣成随机数函数定义 */void add_rand_num(){srand(time(0));int n = rand() % get_null_count();/* 确定在何处空位置⽣成随机数 */for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (board[i][j] == 0 && n-- == 0) /* 定位待⽣成的位置 */{board[i][j] = (rand() % 3 ? 2 : 4);/* 确定⽣成何值,设定⽣成2的概率是4的概率的两倍 */return;}}}}⾸先是 srand() 函数,他是⼀个随机数发⽣器的初始化函数。

原型为:void srand(unsigned seed)⽤法是:程序员需要为这个函数提供⼀个随机数的种⼦:srand(随机数),如果使⽤相同的种⼦,那么后⾯的rand()函数就会每次运⾏都是⽣成⼀样的随机数,即伪随机数。

如:srand(1),直接⽤1来初始化种⼦,后⾯都是⼀样的随机数。

为了⽣成真正的随机数,我们⼀般采⽤系统时间来作为随机数初始化函数的种⼦。

使⽤time()函数来获取系统时间:它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即:srand((unsigned) time(&t));还有⼀个经常⽤法,不需要定义 time_t 型 t 变量,即: srand((unsigned) time(NULL)); 直接传⼊⼀个空指针,因为你的程序中往往并不需要经过参数获得的 t 数据。

憋死牛游戏(C语言小游戏)

憋死牛游戏(C语言小游戏)

#include<stdio.h>#include<windows.h>#include<stdlib.h>char qipan[23][23];void csh();//初始化棋盘void printfqipan();//输出棋盘void yxjs();//游戏介绍int main(){int a,b,c,d,p,q;char e;//用于存储谁先走bool who;int x=1;int n=0;static bool t=true;//定义静态变量,递归调用时不会被初始化SetConsoleTitle("石家庄学院---“憋死牛”儿时游戏"); // 设置控制台标题system("mode con cols=78 lines=43");//设置控制台缓冲区大小system("color 02");//设置字体颜色yxjs(); //输出游戏介绍if(t)//再来一局时不会执行{printf("按回车键开始游戏!");getchar();t=false;}csh();//初始化棋盘printfqipan();//输出棋盘printf("请输入谁先开始:");while(x)//获取先走的一方{fflush(stdin);//清空键盘缓冲区e=getchar();fflush(stdin);//清空键盘缓冲区if(e=='a'||e=='A'){who=true;x--;}//获取到有效值则终止循环else if(e=='b'||e=='B'){who=false;x--;}//获取到有效值则终止循环elseprintf("请输入A或B:");}printf("输入要走棋子的坐标,使其补到空位。

C语言代码实现简单2048游戏

C语言代码实现简单2048游戏

C语⾔代码实现简单2048游戏最近玩2048上瘾,于是尝试⽤C++写了⼀个2048⼩游戏操作⽅法很简单,通过wasd控制⽅块的⽅向,数据的上限为65536代码如下#include<bits/stdc++.h>#include<conio.h>#include <windows.h>void color(short x){if(x>=0 && x<=15)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);elseSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);}using namespace std;int qp[4][4]={0};long long int gread=0;int pd(){int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(qp[i][j]==0){return 0;}if(i==0&&j==0){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i][j+1]){return 0;}}else if(i==0&&j==3){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i][j-1]){return 0;}}else if(i==0){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i][j+1]||qp[i][j]==qp[i][j-1]){return 0;}}else if(i==3&&j==0){if(qp[i][j]==qp[i][j+1]||qp[i][j]==qp[i-1][j]){return 0;}}else if(j==0){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j+1]){return 0;}}else if(i==3&&j==3){if(qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j-1]){if(qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j-1]||qp[i][j]==qp[i][j+1]) {return 0;}}else if(j==3){if(qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j-1]||qp[i][j]==qp[i+1][j]) {return 0;}}}}return 1;}int sjs(){int num = rand() % 100 + 1;if(num<=5){return 4;}else{return 2;}}int sc(){for(;;){int n=rand()%4;int m=rand()%4;if(qp[n][m]==0){qp[n][m]=sjs();return 0;}}}void dy(int n){if(n==0){cout<<" ";}else if(n==2){color(7);cout<<" "<<n<<" ";color(7);}else if(n==4){color(14);cout<<" "<<n<<" ";color(7);}else if(n==8){color(6);cout<<" "<<n<<" ";color(7);}else if(n==16){color(12);cout<<" "<<n<<" ";cout<<" "<<n<<" ";color(7);}else if(n==64){color(13);cout<<" "<<n<<" ";color(7);}else if(n==128){color(5);cout<<" "<<n<<" ";color(7);}else if(n==256){color(9);cout<<" "<<n<<" ";color(7);}else if(n==512){color(3);cout<<" "<<n<<" ";color(7);}else if(n==1024){color(11);cout<<n<<" ";color(7);}else if(n==2048){color(10);cout<<n<<" ";color(7);}else if(n==4096){color(2);cout<<n<<" ";color(7);}else{color(15);cout<<n;color(7);}}int main(){srand(time(NULL));int i,j;cout<<"Game start!(输⼊w a s d进⾏控制)"<<endl; sc();sc();cout<<"-------------------------"<<endl;cout<<"|";dy(qp[0][0]);cout<<"|";dy(qp[0][1]);cout<<"|";dy(qp[0][2]);cout<<"|";dy(qp[0][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl;cout<<"|";dy(qp[1][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[2][0]);cout<<"|";dy(qp[2][1]);cout<<"|";dy(qp[2][2]);cout<<"|";dy(qp[2][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[3][0]);cout<<"|";dy(qp[3][1]);cout<<"|";dy(qp[3][2]);cout<<"|";dy(qp[3][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; for(;;){char n;n=getch();if(n=='w'){int g=0;for(i=0;i<4;i++){for(j=1;j<4;j++){if(qp[j][i]!=0){int k=j;while(qp[k-1][i]==0&&k!=0){k--;}qp[k][i]=qp[j][i];if(k!=j){qp[j][i]=0;g=1;}}}if(qp[0][i]==qp[1][i]&&qp[0][i]!=0) {qp[0][i]=qp[0][i]*2;gread+=qp[0][i];qp[1][i]=qp[2][i];qp[2][i]=qp[3][i];qp[3][i]=0;g=1;}if(qp[1][i]==qp[2][i]&&qp[1][i]!=0) {qp[1][i]=qp[1][i]*2;gread+=qp[1][i];qp[2][i]=qp[3][i];qp[3][i]=0;g=1;}if(qp[2][i]==qp[3][i]&&qp[2][i]!=0) {qp[2][i]=qp[2][i]*2;{cout<<"换个⽅向试试~"<<endl; continue;}else{system("cls");}}else if(n=='d'){int g=0;for(i=0;i<4;i++){for(j=2;j>=0;j--){if(qp[i][j]!=0){int k=j;while(qp[i][k+1]==0&&k!=3){k++;}qp[i][k]=qp[i][j];if(k!=j){qp[i][j]=0;g=1;}}}if(qp[i][3]==qp[i][2]&&qp[i][3]!=0) {qp[i][3]=qp[i][3]*2;gread+=qp[i][3];qp[i][2]=qp[i][1];qp[i][1]=qp[i][0];qp[i][0]=0;g=1;}if(qp[i][2]==qp[i][1]&&qp[i][2]!=0) {qp[i][2]=qp[i][2]*2;gread+=qp[i][2];qp[i][1]=qp[i][0];qp[i][0]=0;g=1;}if(qp[i][1]==qp[i][0]&&qp[i][1]!=0) {qp[i][1]=qp[i][1]*2;gread+=qp[i][1];qp[i][0]=0;g=1;}}if(g==0){cout<<"换个⽅向试试~"<<endl; continue;}else{system("cls");}}else if(n=='s'){int g=0;for(i=0;i<4;i++)while(qp[k+1][i]==0&&k!=3){k++;}qp[k][i]=qp[j][i];if(k!=j){qp[j][i]=0;g=1;}}}if(qp[3][i]==qp[2][i]&&qp[3][i]!=0) {qp[3][i]=qp[3][i]*2;gread+=qp[3][i];qp[2][i]=qp[1][i];qp[1][i]=qp[0][i];qp[0][i]=0;g=1;}if(qp[2][i]==qp[1][i]&&qp[2][i]!=0) {qp[2][i]=qp[2][i]*2;gread+=qp[2][i];qp[1][i]=qp[0][i];qp[0][i]=0;g=1;}if(qp[1][i]==qp[0][i]&&qp[1][i]!=0) {qp[1][i]=qp[1][i]*2;gread+=qp[1][i];qp[0][i]=0;g=1;}}if(g==0){cout<<"换个⽅向试试~"<<endl; continue;}else{system("cls");}}else if(n=='a'){int g=0;for(i=0;i<4;i++){for(j=1;j<4;j++){if(qp[i][j]!=0){int k=j;while(qp[i][k-1]==0&&k!=0){k--;}qp[i][k]=qp[i][j];if(k!=j){qp[i][j]=0;g=1;}}}if(qp[i][0]==qp[i][1]&&qp[i][0]!=0)qp[i][2]=qp[i][3];qp[i][3]=0;g=1;}if(qp[i][1]==qp[i][2]&&qp[i][1]!=0){qp[i][1]=qp[i][1]*2;gread+=qp[i][1];qp[i][2]=qp[i][3];qp[i][3]=0;g=1;}if(qp[i][2]==qp[i][3]&&qp[i][2]!=0){qp[i][2]=qp[i][2]*2;gread+=qp[i][2];qp[i][3]=0;g=1;}}if(g==0){cout<<"换个⽅向试试~"<<endl;continue;}else{system("cls");}}else{cout<<"请输⼊w、a、s、d"<<endl; continue;}sc();cout<<"分数:"<<gread<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[0][0]);cout<<"|";dy(qp[0][1]);cout<<"|";dy(qp[0][2]);cout<<"|";dy(qp[0][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[1][0]);cout<<"|";dy(qp[1][1]);cout<<"|";dy(qp[1][2]);cout<<"|";dy(qp[1][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[2][0]);cout<<"|";dy(qp[2][1]);cout<<"|";dy(qp[2][2]);cout<<"|";dy(qp[2][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[3][0]);cout<<"|";dy(qp[3][1]);cout<<"|"<<endl;cout<<"-------------------------"<<endl;if(pd()==1){break;}}cout<<"Game over~"<<endl;cout<<"请输⼊“quit”并回车退出游戏"<<endl;for(;;){char s[10000];cin>>s;if(strcmp(s,"quit")==0){break;}}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

c语言小游戏代码

c语言小游戏代码

c语言小游戏代码#include <stdio.h>#include <stdlib.h>#include <windows.h>// 定义元素类型#define ELEMENT char// 游戏行数#define ROW 10// 游戏显示延迟#define SLEEPTIME 100int main(int argc, char *argv[]){// 定义游戏的棋盘,用数组存放ELEMENT array[ROW][ROW];// 定义获胜条件int winCondition = 5;// 初始化,把棋盘清空system("cls");int i,j;for(i = 0; i < ROW; i++){for(j = 0; j < ROW; j++){array[i][j] = ' ';}}// 循环游戏,当有一方满足胜利条件时终止int tmp;int count = 0; // 存放棋子数while(1){// 依次取出玩家记录的棋子int x, y;// 如果已经有子落下,则计算是第几步if(count > 0){printf("第%d步:\n", count);}// 显示游戏棋盘for(i = 0; i < ROW; i++){printf(" ");for(j = 0; j < ROW; j++){printf("---");}printf("\n|");for(j = 0; j < ROW; j++){printf("%c |", array[i][j]);}printf("\n");}printf(" ");for(j = 0; j < ROW; j++){printf("---");}printf("\n");// 要求玩家输入放下棋子的位置printf("请玩家输入要放弃棋子的位置(1-%d)\n", ROW); printf("横坐标:");scanf("%d", &x);printf("纵坐标:");scanf("%d", &y);// 判断棋子位置是否有效if(x < 1 || x > ROW || y < 1 || y > ROW || array[x-1][y-1] != ' '){printf("输入错误!\n");system("pause");system("cls");continue;}// 把棋子记录,并计数if(count % 2 == 0){array[x-1][y-1] = 'X';}else{array[x-1][y-1] = 'O';}count++;// 判断是否有获胜者int i, j, k;int tempx, tempy;for(i = 0; i < ROW; i++){for(j = 0; j < ROW; j++){if(array[i][j] == 'X' || array[i][j] == 'O') {// 判断横向是否有获胜者tmp = 1;for(k = 1; k < winCondition; k++){// 注意边界,必须验证范围有效if(j + k > ROW - 1) break;// 如果和前一个位置的棋子相同,则计数加1,否则跳出if(array[i][j+k] == array[i][j])tmp++;else break;}// 如果计数满足获胜条件,则显示获胜者if(tmp >= winCondition){printf("玩家 %c 获胜!\n", array[i][j]);system("pause");return 0;}// 判断纵向是否有获胜者tmp = 1;for(k。

C语言实现贪吃蛇小游戏

C语言实现贪吃蛇小游戏

C语⾔实现贪吃蛇⼩游戏本⽂实例为⼤家分享了C语⾔实现贪吃蛇⼩游戏的具体代码,供⼤家参考,具体内容如下⼀、程序实现的原理:1、构造蛇⾝:定义⼀个坐标数组,存放的是蛇的每⼀节蛇⾝所在的坐标位置。

这样就将移动蛇⾝的操作转换为移动数组的操作,将吃⾷物增加蛇⾝体长度的操作转换为在数组后⾯追加元素的操作。

2、移动效果:每次移动时,将每⼀节蛇⾝(蛇头除外)依次往前移动⼀节,然后擦去蛇的最后⼀节,最后确定蛇头的⽅向,再绘制⼀个蛇头。

这样就会显⽰⼀个移动效果。

3、⾝体增加效果:每次移动时候,判断蛇头是否碰到了⾷物,如果碰到了⾷物,则吃掉它,并且只进⾏前移蛇⾝和增加蛇头的操作,不进⾏擦除蛇尾的操作(可以⽤⼀个标记变量判断是否吃掉了⾷物,然后在擦除蛇尾那⾥判断是否需要擦除蛇尾),这就会显⽰蛇⾝体增加的效果。

⼆、预备知识1、控制台窗⼝控制台窗⼝每⼀个位置都有它的坐标,且坐标系如下图所⽰(随箭头⽅向坐标逐渐增⼤)2、通过代码将光标移动到控制台指定位置这⾥⽤到了c语⾔windows编程中句柄的概念,不知道的可以百度。

实在不会也没关系,可以当做⼀个函数模板来使⽤,⽆需做太多了解。

#include <stdio.h>#include <Windows.h>//将光标移动到控制台的(x,y)坐标点处void gotoxy(int x, int y){COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}int main(){gotoxy(50,15);//将光标移动到控制台的(50,15)处printf("Hello World\n");system("pause");return 0;}从运⾏结果可以看到,程序在指定位置输出了待输出的内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

纯真童趣的《泡泡堂》,还有武林情仇,笑傲江湖的《剑侠情缘on
line》.它是e时代常谈的话题,是交互式娱乐的主力军,是一种
高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式
.作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢?
爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础
学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小
游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦
,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣.这正是
我发贴的目的.
1, 总是从Hello,world开始
学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell
o,world!".让我们来看看这个最简单的C程序:
#incolude <stdio.h> /*把输入输出函数的头文件包含进来*/
int main()
{
printf("Hello,
world!");/*在屏幕上输出字符串"Hell o,world!"*/
return 0;/*退出main函数,并返回0*/
}
下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过
.2,每执行这个程序一次都能看见上次运行留下的字符.3,我们
还希望屏幕输出一个笑脸来欢迎我们. (大家不要小看了这个笑脸
曾经有人发贴专门问呢)让我们来改进一下这个程序吧!
1,在return语句的前面加一句:getch ();,表示按任意键结
束.2,在printf语句前用clrscr函数清屏,要使用这个函数和get
ch函数,需要在程序开头再包含头文件c onio.h.3,ASCII码也有
许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可
以用printf("%c", 2)来输出一个笑脸.
现在我们把Hello,world程序改成一个更好看的Hello,world了.下
面让我们开始做游戏吧!
2, 心动的开始,一个运动中的笑脸
大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让
我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当
它到达屏幕的边缘时会自动弹回来.
先在程序定义一个在屏幕中运动的点的结构:
struct move_point
{
int x, y;/*该点的位置,包括x 坐标和y坐标*/
int xv, yv;/*该点在x轴,y轴的速度*/
};
运动的原理是,先擦去物体先前的轨迹,
让物体按其速度移动一段
距离,再画出该物体.让我们看到以下代码:
gotoxy(man.x, man.y);/*把光标移到指定的坐标*/
printf(" ");/*输出一个空格,把先前的字符擦去*/
然后我们让物体按其速度运动:
man.x += man.xv;/*水平方向按x轴的速度运动*/
man.y += man.yv;/*垂直方向按y轴的速度运动*/
运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让
它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸:
gotoxy(man.x, man.y);
printf("%c\b", 2); /*输出ASCII码值为2的"笑脸"字符*/
怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能
让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧!
3, 交互的实现——让我们来控制笑脸运动
这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸
顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略
处理.接受按键我们用以下两条语句:
while (bioskey(1) == 0);/*等待按键*/
key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/
然后用switch语句来判断按键以及执行相关操作,如下:
switch (key) /*对变量key的值进行判断*/
{
case UP: /*如果按的是向上键*/
… break; /*让物体向上运动,并退出switch*/
case DOWN: /*如果按的是向下键*/
… break; /*让物体向下运动,并退出switch*/
case LEFT: /*向左键*/
… break;;/*向左运动*/ case RIGHT: /*向右键*/
… break;/*向右运动*/ default:
break;/*其他按键则忽略处理* /
}
怎么样,是不是有了玩游戏的感觉了?不过这个程序没有什么目的
,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动
的笑脸来做一个更有趣的游戏吧!
4, 在迷宫中探索
小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜
欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用C语言来编
个迷宫的游戏,重温一下童年的乐趣.
首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中m
ap[x][y] == '#'表示在(x,y)坐标上的点是墙壁.DrawMap函数
在屏幕上输出迷宫的地图和一些欢迎信
息.
在main函数里,我们定义了"小人"man 的坐标和"目的地"des的
坐标.在游戏循环中,我们增加了一些用来判断胜负的语句:
if (man.x == des.x && man.y == des. y) /*如果人的坐标等于目
的地的坐标*/
{
gotoxy(35, 3);
printf("Ok! You win!"); /*输出胜利信息*/
….
}
在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不
是有"墙壁",如果有的话,就不能往前移动了.好的,我们在判
断按键的switch语句的各个分支加上了判断语句,如下:
if (map[…][…] == '#') break;/*如果前面是墙壁,就不执行
下去*/
哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修
改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们
要设计一个更好玩的游戏——
5, 聪明的搬运工
大家一定玩过"搬运工"的游戏吧!这是在电脑和电子字典上较流
行的益智游戏,让我们动手做一个属于自己的"搬运工"吧!
程序依然用数组map来保存地图,数组元素如果为空格则表示什么
也没有,'b'表示箱子,'#'表示墙壁,'*'表示目的地,'i
'表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的
显示,也要改变map相应元素的值.
游戏的主循环依然是接受按键.当接收
一个方向键,需要判断小人
前面一格的状态,如果是空地或目的地,则人物可以直接移动;如
果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继
续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推
箱子前进,否则不可移动.好的,我们在s witch中增加了这些判断
语句.
程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目
的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断
这些目的地上是否都有箱子了.
真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游
戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,
我们还可以相互分享好的游戏地图呢.
尾声:
在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的
.C语言在与硬件联系紧密的编程中,也占有重要地位.
其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.
象学习音乐的人,不是要等到把全部乐
理学完后才演奏一个完整的
曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就
有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编
游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方
法.
好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言
来做几个自己喜欢的小游戏.。

相关文档
最新文档