如何使用我的Console RPG SHA-256游戏保存保护修复此错误代码?

时间:2014-06-30 01:25:30

标签: c++ console sha256

所以我正在制作一个控制台RPG,在完成保存/加载功能(完美工作)后,我开始制作一个sha-256校验和,因此无法编辑保存文件。我几乎所有的代码,但当我用我的保存功能保存游戏和该保存文件的校验和时,我回去加载它,它总是转到校验和不匹配的语句,当我检查chksum.dat时,哈希每次都是相同的,我真的很难过,这是我的代码:

(还有更多代码,但我认为它无关紧要)

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
#include <fstream>
#include "sha256.h"
using namespace std;


string userinput = "nul";
string name = "nul";
string currentenchant = "nul";
string checksum1 = "nul";
string checksum2 = "nul";
string checksum3 = "nul";
int namelength=0;
int magnumb=0;
int stonenumb=5;
int glowingstone=0;
int redgem=0;
int raind=0;
int trainswordatk=10;
int trainswordspd=10;
int trainswordlevel=0;
int swordmagicdmg=15;
int equippedmagic=0;
int equippedmagicmax=1;
int savelength=0;
bool trainsword=false;
bool firetrainsword=false;
bool icetrainsword=false;
bool poisontrainsword=false;
bool beginchest=false;
bool swordmagic=false;
bool swordmagicequip=false;

 void SaveGame()
{
  ofstream data("data.dat");
  data << "\n";
  data <<name;
  data << "\n";
  data <<userinput;
  data << "\n";
  data <<currentenchant;
  data << "\n";
  data <<magnumb;
  data << "\n";
  data <<stonenumb;
  data << "\n";
  data <<glowingstone;
  data << "\n";
  data <<redgem;
  data << "\n";
  data <<raind;
  data << "\n";
  data <<trainswordatk;
  data << "\n";
  data <<trainswordspd;
  data << "\n";
  data <<trainswordlevel;
  data << "\n";
  data <<trainsword;
  data << "\n";
  data <<firetrainsword;
  data << "\n";
  data <<icetrainsword;
  data << "\n";
  data <<poisontrainsword;
  data << "\n";
  data <<beginchest;
  data << "\n";
  data <<swordmagic;
  data << "\n";
  data <<swordmagicdmg;
  data << "\n";
  data <<swordmagicequip;
  data << "\n";
  data <<equippedmagicmax;
  data << "\n";
  data <<equippedmagic;
  data << "\n";
  data <<namelength;
  data << "\n";
  ofstream data1("data.dat");
  ofstream chksum("chksum.dat");
  checksum1 = sha256("data.dat");
  chksum << checksum1;
}

void LoadGame()
{
int add = 0;
string line;
ifstream chksum("chksum.dat");
getline(chksum, line) >> checksum2;
ifstream chcsum("data.dat");
checksum3 = sha256("data.dat");
if (checksum3==checksum2)
{
  goto goodcheck;
 } else if (checksum3!=checksum2) {
    cout << "Your current save has been modified     from your previous one.\n\n";
    cout << "Current: " << checksum3 <<    "\nPrevious: " << checksum2 << "\n\n";
    getch();
    exit(0);
   } else {
cout << "There has been an error loading your game, please try again.\n\n";
getch();
return;
}

goodcheck:
ifstream data("data.dat");
while(data.is_open()){
    if (add==0) getline(data, line) >> name;
    if (add==1) getline(data, line) >> userinput;
    if (add==2) getline(data, line) >> currentenchant;
    if (add==3) getline(data, line) >> magnumb;
    if (add==4) getline(data, line) >> stonenumb;
    if (add==5) getline(data, line) >> glowingstone;
    if (add==6) getline(data, line) >> redgem;
    if (add==7) getline(data, line) >> raind;
    if (add==8) getline(data, line) >> trainswordatk;
    if (add==9) getline(data, line) >> trainswordspd;
    if (add==10) getline(data, line) >> trainswordlevel;
    if (add==11) getline(data, line) >> trainsword;
    if (add==12) getline(data, line) >> firetrainsword;
    if (add==13) getline(data, line) >> icetrainsword;
    if (add==14) getline(data, line) >> poisontrainsword;
    if (add==15) getline(data, line) >> beginchest;
    if (add==16) getline(data, line) >> swordmagic;
    if (add==17) getline(data, line) >> swordmagicdmg;
    if (add==18) getline(data, line) >> swordmagicequip;
    if (add==19) getline(data, line) >> equippedmagicmax;
    if (add==20) getline(data, line) >> equippedmagic;
    if (add==21) getline(data, line) >> namelength;
    if (add==22) getline(data, line) >> savelength;
    //if (add==23) getline(data, line) >> ; (These are for future use convenience)
    //if (add==24) getline(data, line) >> ;
    //if (add==25) getline(data, line) >> ;
    //if (add==26) getline(data, line) >> ;
    //if (add==27) getline(data, line) >> ;
    //if (add==28) getline(data, line) >> ;
    //if (add==29) getline(data, line) >> ;
    //if (add==30) getline(data, line) >> ;
    //if (add==31) getline(data, line) >> ;
    //if (add==32) getline(data, line) >> ;
    if (add==22) data.close();
    add++;
  }
  cout << "Game loaded.\n";
  getch();
 }

1 个答案:

答案 0 :(得分:1)

这一行

getline(chksum, line) >> checksum2;

从文件中读取一行到line,然后将另一个字符串读入checksum2。这与您写入校验和文件的方式不符。

在调试器中单步执行,直到找到该行,您会发现line包含校验和且checksum2为空。

将其更改为

getline(chksum, checksum2);

注意:您确实应该将一些变量放入局部变量并对其进行适当命名。你现在可以很容易地按照自己的计划进行操作,但是在6个月的时间里,你会发现它更加难以理解,当你的想法不是很新鲜的时候。