汇编课程设计–基于C语言程序与汇编语言程序实现猜数字游戏的实现
一: 猜数游戏玩法以及规则设定
猜数游戏的基本规则,以及判断方法:
(1)首先由电脑系统随机生成四个数字,各个数字互不相同。
(2)用户通过键盘输入四个数字去猜系统的四个数是什么。用户猜测的次数由程序确定,如果用户在规定次数中猜中数字,及其对应的位置,则视为挑战成功。如果猜测次数用完,则视为挑战失败,并且系统会给出四个数字是什么。
(3)判定结果:如果数字正确,且位置正确,系统会输出A;如果数字正确,但是位置不同,系统则会输出B;如果数字不对,则会输出C。
例如:系统给出 1 2 3 4 用户给出4 2 3 1 , 则系统将提示 B A A B
二:猜数游戏的基本设计原理和思想
猜数游戏基本设计原理:
(1)首先要让系统随机获取一个正整数,存入下来,一共获取四次,并且要保证每一次获取的数,不和前面已获取数相同,如果相同,则要重新获取。
(2)其次再获取用户键盘输入的四个数并存入下来,在依次比较用户输入的数和系统给出的数是否相同,如果数字和位置都相同,则把字符A存入下来;只有数字相同位置不同,则把字符B存入下来;如果数字不同相同,则把字符C存入下来;这样就会得到一个含有判断字符的数组或者寄存器。
(3)最后再判断判断字符的数组或寄存器里面是否包含四个AAAA,如果包含,则终止程序,并提示你太棒了,恭喜你全部猜测正确。如果不是,则要判断用户猜测的次数是否超过设定的次数,如果没有超过,则进行下一轮,并给出相应的提示。直到用户猜数,或者猜测次数用完,并给出系统的数字。
三:汇编程序与C语言程序实现主体代码
主体代码汇编语言
tishi proc near
BG:
MOV AX, QQ ;段名装入数据段
MOV DS, AX
LEA DX, MSG1 ;取有效地址
MOV AH, 9 ;显示字符串 以"$" 结束
INT 21H
CALL RANDOM_4 ;生成四个互不相同的数字符号
ret
tishi endp
;------------------------------
shurubijiao proc near
IN_LOOP: ;循环输入四个字符
MOV SI, 0 ;分别和四个随机符号比较
IN_X: ;根据比较结果写入?XY
MOV DI, 0
MOV AH, 1 ;键盘输入并回显 ;AL为输入字符
INT 21H ;键入一个字符
IN_1:
CMP AL, XXX[DI]
JZ IN_2 ;ZF=1 跳转 ,否则不跳转
INC DI ;次数加一
CMP DI, 4
JNZ IN_1 ;输入的数,比较每一个数是否相同
MOV YYY[SI + 2], 'C' ;如果都不相同,则把C写入到下一个
JMP IN_NEXT
IN_2:;有相同的数,且位置相同
CMP SI, DI ;判断是不是相同的位置,如果是相同的位置则存在A
JNZ IN_3
MOV YYY[SI + 2], 'A'
JMP IN_NEXT
IN_3: ;有相同的数,但是位置不同
MOV YYY[SI + 2], 'B'
IN_NEXT:
INC SI ;次数加一
CMP SI, 4 ;判断是不是是第四个数了
JNZ IN_X
shurubijiao endp
;------------------------------
jieguotishi proc near
DISP:
LEA DX, YYY ;显示提示
MOV AH, 9
INT 21H
CMP YYY + 2, 'A'
JNZ NEXT ;如果不等于跳转
CMP YYY + 3, 'A'
JNZ NEXT ;如果不等于跳转
CMP YYY + 4, 'A'
JNZ NEXT ;如果不等于跳转
CMP YYY + 5, 'A'
JNZ NEXT ;如果不等于跳转
JMP CD ;四个都是Y就提前结束 ;无条件跳转指令
CD:
LEA DX,caidui
MOV AH, 9
INT 21H
JMP EXIT
CW: ;猜错提示,错误,并给出提示
LEA DX,caicuo
MOV AH, 9
INT 21H
JMP IN_LOOP
NEXT:
DEC NNN ;次数减一
CMP NNN, 0
JNZ CW ;不到次数就再次输入
LEA DX,MSG2 ;显示内定
MOV AH, 9
INT 21H
EXIT:
MOV AH, 4CH ;程序结束
INT 21H
jieguotishi endp
;------------------------------
suiji proc near
RANDOM_4:
MOV DL, '8'
MOV DI, 0
RDM: ;产生一个随机数
MOV CL, DL
ADD CL, 17
MOV CH, DH
AND CH, 1
LOOP $ ; 一直执行当前指令
CALL GET_RANDOM ;AL=0~9
MOV DL, AH
ADD DL, '0'
MOV SI, 0
CHK: ;判断产生的随机数是否与前面的相同,相同重新产生随机数
CMP DL, XXX[SI] ;CMP结果 ZF CF
;目的操作数 < 源操作数 0 1
;目的操作数 > 源操作数 0 0
;目的操作数 = 源操作数 1 0
JZ RDM ;ZF=1 跳转 ,否则不跳转
INC SI ;指令加一
CMP SI, 4
JNZ CHK ;zf不等于0跳转
MOV XXX[DI], DL ;把产生的随机数放到xxx寄存器中
INC DI ;指令加一
CMP DI, 4
JNZ RDM
RET
;------------------------------
GET_RANDOM: ;产生一个随机数
MOV AH, 2CH ;取系统时间 CH:CL时:分
INT 21H ;DH:DL秒:1/100秒 DL:1-100百秒制
MOV AL, DL
MOV AH, 0
MOV BL, 10
DIV BL
RET ;AL=0~9
;---------------------------------
ret
suiji endp
CC ENDS
end main
主题代码C语言
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int getRand(); // 获取随机数
void putRule(); // 输出游戏规则
void getUserInput(); // 获取用户输入
void getUserAgainInput(); // 再次获取用户输入
void initSystemNum(); // 初始化系统随机数
void detection(); // 判定胜利条件
void initGame(); // 初始化游戏
int detectionWin(); // 判断是否胜利
void gameStart(); // 游戏开始
void putResult(); // 输出结果
void putSystemNum(); // 测试类 输出随机结果
int systemNum[4]; //存入系统的随机数
int userNum[4]; //存入用户输入的数
char result[5]; // 存入提示字符
int totalTimes = 4; // 猜测次数
int main()
{
gameStart(); //游戏开始
printf("按enter键退出游戏\n");
getchar();
system("pause");
}
void gameStart() //开始游戏
{
initGame(); // 输出游戏规则 获取系统随机值 获取游戏玩家输入值 //初始化游戏
detection(); // 判断输入的值;
int flag = 1;
while (flag) //如果胜利则跳出
{
if (detectionWin())
{
putResult(); //成功后输出结果
printf("你太棒了。恭喜你全部猜测正确");
break;
}
if (--totalTimes <= 0)
{
printf("很遗憾,次数用完。正确的数字是: \n");
putSystemNum();
break;
}
putResult(); // 失败以后 输出结果
getUserAgainInput(); // 再次获取输入
detection(); // 再次判断
}
}
void initGame() //初始化游戏
{
putRule(); //输出游戏规则
initSystemNum();// 成功找出四个数,初始化系统随机数
//putSystemNum();
getUserInput(); //获取用户输入的值,并入到一个数组
}// 初始化游戏 初始化游戏
int getRand()// 生成一个随机数
{
int x;
srand(time(NULL));
x = rand() % 10;
return x;
}
void initSystemNum() //初始化系统随机数
{
int randNum; //保存随机数;
int flag = 1;
systemNum[0] = getRand();// 获取第一个数;
for (int i = 0; i < 3; i++)// S[0]已知则需要三个随机数;
{
flag = 1;
while (flag) {
randNum = getRand();
for (int g = 0;g <= i; g++)
{
if (systemNum[g] == randNum) break; // 如果有一样的就重新随机并对比;
if (g == i) { flag = 0; break; } // 比较完成后跳出;
}
}
systemNum[i + 1] = randNum; // 找到以后就赋值给systemNum;
}
}
void getUserInput() //获取用户输入的值,并把得到值放到一个一维数组
{
int num = 0;
printf("游戏开始,请输入4个数,并且挑战次数只有%d次:", totalTimes);
scanf_s("%d", &num);
if (num > 9999)
{
printf("输入的数字多于四位数,请重新输入");
getUserInput();
}
else
{
userNum[3] = num % 10;
userNum[2] = (num / 10) % 10;
userNum[1] = (num / 100) % 10;
userNum[0] = (num / 1000);
}// 输入四个数;
// 获取用户键入值
}
void getUserAgainInput()//失败后,再次获取输入的值,同样放到一个数组中
{
int num = 0;
printf("未能通过!请再次输入四个数:");
scanf_s("%d", &num);
if (num > 9999)
{
printf("输入的数字多于四位数,请重新输入");
getUserInput();
}
else
{
userNum[3] = num % 10;
userNum[2] = (num / 10) % 10;
userNum[1] = (num / 100) % 10;
userNum[0] = (num / 1000);
}// 输入四个数;
// 获取用户键入值
}
void putRule()//输出游戏规则
{
printf("============================================================\n");
printf(" 欢迎来到猜数字游戏 \n");
printf("============================================================\n");
printf("游戏规则:\n系统给出随机的四个数字,");
printf("用户通过输入四个数字去猜系统的四个数\n\n");
printf("判定结果:\n如果结果正确且位置正确则输出A\n如果结果正确但位置不正确系统给出B提示\n如果位置和数字不正确则输出C\n\n");
printf("例:系统给出 1 2 3 4 用户给出4 2 3 1 , 则系统将提示 B A A B \n");
printf("============================================================\n\n");
}
void detection() { //判断用户输入的数字与系统数字是否相同,并填入相同符号,便于输出提示
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++)
{
if (userNum[x] == systemNum[y])
{
if (x == y)
{
result[x] = 'A';
break;
}// 位置和大小都一样
else
{
result[x] = 'B';
break;
}// 大小一样 位置不同
}// 如果有相同 判断位置关系
else
{
if (y == 3) result[x] = 'C'; // 如果查询完成后没有匹配
continue;
}
// 位置和大小都不同填入C
}
}
}
int detectionWin() //判断结果是否匹配,匹配返回1,不匹配返回0
{
for (int x = 0; x < 4; x++)
{
if (result[x] == 'B' || result[x] == 'C') break; //判断是否完全匹配,如果完全匹配,则返回1,不安全匹配则返回0
if (x == 3) return 1;// 全部判断完成 且没有return
}
return 0;
}
void putResult()//输出提示
{
for (int a = 0; a < 4; a++)
{
printf("%c", result[a]);
}// 输出结果
printf("\n");
}
void putSystemNum() //输出系统给出的随机数
{
for (int a = 0; a < 4; a++)
{
printf("%d ", systemNum[a]);
}
printf("\n");
}
四:汇编程序与C语言程序实现的效果图
汇编语言效果图
提示:
游戏猜测成功
游戏猜测失败
C语言程序运行效果图
猜测成功:
猜测失败:
五:详细参考资料
汇编语言程序与c语言程序完整代码、课程设计文档参考如下:
最后:如有任何问题,可以私信博主
博主编写文章也不容易,请点赞,关注,收藏在走