一、设计目的
单纯的学习C语言程序设计会让人觉得枯燥乏味,但自己设计一款小游戏不但能提高学习兴趣,获得较高的成就感,还能起到练习的作用,下面就介绍两款小游戏的设计
二、小游戏的设计
1,数字杀人游戏
游戏规则:由终端输入游戏参与人数,参与游戏的人围成一个圈,然后输入死亡数字,参与游戏的人开始报数,凡是报到死亡数字的人被杀死,下面的人接着从一开始报数,最后一个未被杀死的人获胜。
设计思路:先从键盘获取用户输入游戏参与人数,用循环来寻找报数号码为死亡编号的人,在一开始时给每个人编上号,用一个数count记录报数,每循环一次值加1,直到count值为死亡编号时,说明此时这个人报的数为死亡编号,需要被杀死,然后给这个人赋值为-1(代表此人已死,不参与下次报数)此时再用outPerson记录被杀死的人数,最后跟总人数比较,直到剩下一个人为止。
具体实现
#include "stdafx.h"
#include"iostream"
/*
参与人数
死亡数字
*/
#define KILLED -1
int _tmain(int argc, _TCHAR* argv[])
{
int total;
int number[10] = {0};
int killNumber;
int count = 0;
int outPerson = 0;
printf("请输入参与人数:");
scanf("%d",&total);
//给数组赋值
for(int i = 0;i
number[i] = i+1;
}
printf("输入死亡号码:");
scanf("%d",&killNumber);
//数组优点:访问方便;缺点:插入和删除不方便
//开始游戏
for(int i =0;i < total;i++){
//开始报数
//判断i指向的这个人是否被杀掉
if(number[i] != KILLED){
count++;
//判断当前编码是不是到了死亡编码
if(count == killNumber){
number[i] = KILLED;
outPerson++; //死亡人数+1
//还原编号
printf("第%d个人被杀死了\n",i+1);
count = 0;
if(outPerson == total-1){
break;
}
}
}
//判断一次循环是否到末尾
if(i == total - 1){
//让i回到起始点
i = -1; //防止i++ 导致回到第二个
}
}
system("pause");
return 0;
效果展示
QQ截图20190802204450.png
2,猜数字游戏
游戏规则:系统随机产生四个0-9之间不相同的随机数,并从小到大排序,然后玩家开始输入四个0-9之间的数字,玩家输入的数字和系统产生的数字作比较后输出A、B代表玩家的猜测结果
A代表数字正确位置也正确 所以1A则代表玩家猜测的数字中有一个和系统产生的数字位置和大小均相同
B代表数字正确,位置不正确,2B表示玩家猜测的四个数字中有两个和系统产生的数字一样,但位置却不同;
玩家可根据系统反馈的AB个数,猜出正确答案。
设计思路:设计思路比较简单,实现有点困难。首先系统产生0-9随机数,然后筛选产生的随机数和已产生的随机数不重复,然后进行由小到大的排序;接着就要接受用户的猜测数据,由于用户可以多次猜测,所以要用到循环,然后再把系统产生的数据和用户猜测的四句数据分别对比数值和位置得到A和B的个数,然后反馈给玩家,直到玩家猜出正确结果。
具体实现
# include "stdafx.h"
#include"iostream"
#include"stdlib.h"
#include"time.h"
/*随机产生四个不重复 0~9之间的整数
从小到大排数
位置正确数字正确 A
数字正确位置不正确 B
*/
int _tmain(int argc, _TCHAR* argv[])
{
int originArray[4] = {};
int guessArray[4] = {};
int counta = 0;
int countb = 0;
//筛选产生的随机数
srand((unsigned int)time(NULL));
for(int i = 0;i < 4;i++){
bool isExist = false;
int temp = 0;
while(1){
temp = rand()%10;
for(int j = 0;j < i;j++){
if(originArray[j] == temp){
isExist = true;
break;
}
}
if(isExist == false){
break;
}
}
//开始排序
int j = 0;
for(;j
//j对应的数字与产生的数据temp进行比较
if(temp < originArray[j]){
//j后面的内容往后移动 腾出空间
for(int k = i;k > j;k--){
originArray[k] = originArray[k-1];
}
break;
}
}
//保存到数组里面去
originArray[j] = temp;
}
//输出
for(int i = 0;i < 4;i++){
printf("%d ",originArray[i]);
}
printf("\n");
//游戏开始
while(1){
printf("请输入四个数据:");
for(int i = 0;i < 4;i++){
scanf("%d",&guessArray[i]);
}
for(int i = 0;i < 4;i++){
for(int j = 0;j < 4;j++){
if(originArray[i] == guessArray[j]){
if(i == j){
counta++;
}else{
countb++;
}
}
}
}
if(counta == 4){
printf("Congratulation!!!\n");
break;
}else{
printf("%dA%dB\n",counta,countb);
counta = 0;
countb = 0;
}
}
system("pause");
return 0;
}
效果展示
QQ截图20190802210146.png
ps:为了展示效果所以把系统产生的四个数据也输出了,在游戏中要把输出原始数据的那几段代码删除。
三、三种排序方法
1,冒泡排序
方法概要:相邻的数据进行两两比较,小数放在前面,大数放在后面,这样一趟比较下来,最小的数就跑到最上面,第二趟依照此方法,知道所有数据排好即可。
代码实现
int a[10] = {5,3,7,6,9,1,0,2,8,4};
//冒泡排序 通过一次排序,最大的沉底
// 冒泡一直是从左向右比
for(int i = 0;i < 9;i++){ //外循环控制比较的次数 内循环哪两个比较
for(int j = 0;j < 10-1-i;j++){ //经过一次排序 最大的数已经沉底 所以最后一个就不用再比较了,i次排序后,i个较大数沉底
if(a[j]> a[j+1]){
int temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
for(int i = 0;i<10;i++){
printf("%d ",a[i]);
}
printf("\n");
2,选择排序
方法概要:现在未排序的序列中找到最小(大)数,存放到数组最前端,然后再从剩余的数据中找最小的数,放到第一个数后面,以此类推,排完所有数据。
代码实现
//选择排序 一次取出一个数 默认他是最小的
//遍历所有数,如果发现一个数比这个数小,则交换两个数
int a[10] = {5,3,7,6,9,1,0,2,8,4}
for(int i = 0; i<10;i++){
int min = a[i]; //默认最小
for(int j = i+1;j< 10 -1;j++){
//控制min与后面的每一个数比较
if(min>a[j]){ //说明a[j]比min还小
min = a[j]; //min和a[i]值相等
a[j] = a[i];
}
}
//一次遍历之后找到
a[i] = min;
}
for(int i = 0;i<10;i++){
printf("%d ",a[i]);
}
printf("\n");
3,插入排序
方法概要:第一个数据向后比较,若是较大则交换位置,交换后的较小的数向前比较,若是比前面的数小则交换位置,接着向前比较直到遇到比他还小的数或是到数据结束,此时在从第一个交换的数据出开始向后比较,若是较大则交换,交换后较小的数还按照刚才的步骤执行,直到所有的数据排好。
代码实现
//插空排序
int a[10] = {5,3,7,6,9,1,0,2,8,4};
for(int i=0;i<9;i++){
//i与i+1比较大小
if(a[i]>a[i+1]){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
//让a[i]与前面的所有数进行比较
for(int j = i;j>0;j--){
if(a[j]
int temp1 = a[j-1];
a[j-1] = a[j];
a[j] = temp1;
}
}
}
for(int i = 0;i<10;i++){
printf("%d ",a[i]);
}
printf("\n");
四,学习感悟
小游戏的制作比较艰难,刚看到题目的时候脑海中有点想法但是却不知道怎么用代码去实现,这是代码敲的少的缘故,只有多敲代码才能有感触,下次遇到问题的时候才会知道怎么用代码去实现,脑海中构思的再好,不能用代码实现也没有一点用处。所以以后要多敲代码,多多感触才能学好程序设计。关于排序方法有很多种,但最起码得牢牢记住一种,但并不是要去死记硬背代码,而要记牢是如何排序的,然后在多想想如何用代码去实现。