汇编课程设计--基于C语言程序与汇编语言程序实现猜数字游戏的实现

汇编课程设计–基于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,如果包含,则终止程序,并提示你太棒了,恭喜你全部猜测正确。如果不是,则要判断用户猜测的次数是否超过设定的次数,如果没有超过,则进行下一轮,并给出相应的提示。直到用户猜数,或者猜测次数用完,并给出系统的数字。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPqj6e6d-1642401017567)(file:///C:/Users/BING/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif)]

三:汇编程序与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语言程序完整代码、课程设计文档参考如下:

汇编语言程序与c语言程序完整代码、课程设计文档

最后:如有任何问题,可以私信博主

博主编写文章也不容易,请点赞,关注,收藏在走

请添加图片描述

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h1dm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值